blob: e6d3f8be6edeeaa67fbe142e41dc86dab9b663a5 [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,
Miss Islington (bot)62674f32018-12-10 23:05:13 -0800363 win_runtime_flags[i].flag_name) != NULL)
364 {
365 if (PyDict_DelItemString(
366 dict,
367 win_runtime_flags[i].flag_name))
368 {
369 PyErr_Clear();
370 }
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -0800371 }
372 }
373 }
374}
375
Jeremy Hylton22308652001-02-02 03:23:09 +0000376#endif
377
Skip Montanaro7befb992004-02-10 16:50:21 +0000378#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000379
Neal Norwitz39d22e52002-11-02 19:55:21 +0000380#ifndef O_NONBLOCK
381# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000382#endif
383
Trent Micka708d6e2004-09-07 17:48:26 +0000384/* include Python's addrinfo.h unless it causes trouble */
385#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
386 /* Do not include addinfo.h on some newer IRIX versions.
387 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
388 * for example, but not by 6.5.10.
389 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000390#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000391 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
392 * EAI_* constants are defined in (the already included) ws2tcpip.h.
393 */
394#else
395# include "addrinfo.h"
396#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000397
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000398#ifdef __APPLE__
399/* On OS X, getaddrinfo returns no error indication of lookup
400 failure, so we must use the emulation instead of the libinfo
401 implementation. Unfortunately, performing an autoconf test
402 for this bug would require DNS access for the machine performing
403 the configuration, which is not acceptable. Therefore, we
404 determine the bug just by checking for __APPLE__. If this bug
405 gets ever fixed, perhaps checking for sys/version.h would be
406 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000407#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600408/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000409 Find to check for Jaguar is that it has getnameinfo(), which
410 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000411#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000412#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000413
414#ifdef HAVE_INET_ATON
415#define USE_INET_ATON_WEAKLINK
416#endif
417
Jack Jansen84262fb2002-07-02 14:40:42 +0000418#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000419
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000420/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000421#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000422/* avoid clashes with the C library definition of the symbol. */
423#define getaddrinfo fake_getaddrinfo
424#define gai_strerror fake_gai_strerror
425#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000426#include "getaddrinfo.c"
427#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000428#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000429#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000430#include "getnameinfo.c"
431#endif
432
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000433#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000434#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000435#endif
436
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000438#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000439#define EAFNOSUPPORT WSAEAFNOSUPPORT
440#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000442
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000443#ifndef SOCKETCLOSE
444#define SOCKETCLOSE close
445#endif
446
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000447#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000448#define USE_BLUETOOTH 1
449#if defined(__FreeBSD__)
450#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
451#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000452#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453#define SOL_HCI SOL_HCI_RAW
454#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000455#define sockaddr_l2 sockaddr_l2cap
456#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000457#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000458#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
459#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000461#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462#define sockaddr_l2 sockaddr_bt
463#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000464#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000466#define SOL_HCI BTPROTO_HCI
467#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000468#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
469#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000470#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000472#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000473#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
474#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000475#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000476#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
477#endif
478#endif
479
Charles-François Natali8b759652011-12-23 16:44:51 +0100480/* Convert "sock_addr_t *" to "struct sockaddr *". */
481#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000482
Martin v. Löwise9416172003-05-03 10:12:45 +0000483/*
484 * Constants for getnameinfo()
485 */
486#if !defined(NI_MAXHOST)
487#define NI_MAXHOST 1025
488#endif
489#if !defined(NI_MAXSERV)
490#define NI_MAXSERV 32
491#endif
492
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000493#ifndef INVALID_SOCKET /* MS defines this */
494#define INVALID_SOCKET (-1)
495#endif
496
Charles-François Natali0cc86852013-09-13 19:53:08 +0200497#ifndef INADDR_NONE
498#define INADDR_NONE (-1)
499#endif
500
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000501/* XXX There's a problem here: *static* functions are not supposed to have
502 a Py prefix (or use CapitalizedWords). Later... */
503
Guido van Rossum30a685f1991-06-27 15:51:29 +0000504/* Global variable holding the exception type for errors detected
505 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506static PyObject *socket_herror;
507static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000508static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000509
Tim Peters643a7fc2002-02-17 04:13:21 +0000510/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000511 The sock_type variable contains pointers to various functions,
512 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000513 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000514static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000515
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000516#if defined(HAVE_POLL_H)
517#include <poll.h>
518#elif defined(HAVE_SYS_POLL_H)
519#include <sys/poll.h>
520#endif
521
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000522/* Largest value to try to store in a socklen_t (used when handling
523 ancillary data). POSIX requires socklen_t to hold at least
524 (2**31)-1 and recommends against storing larger values, but
525 socklen_t was originally int in the BSD interface, so to be on the
526 safe side we use the smaller of (2**31)-1 and INT_MAX. */
527#if INT_MAX > 0x7fffffff
528#define SOCKLEN_T_LIMIT 0x7fffffff
529#else
530#define SOCKLEN_T_LIMIT INT_MAX
531#endif
532
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200533#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000534/* Instead of select(), we'll use poll() since poll() works on any fd. */
535#define IS_SELECTABLE(s) 1
536/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000537#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200538/* If there's no timeout left, we don't have to call select, so it's a safe,
539 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100540#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000541#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000542
543static PyObject*
544select_error(void)
545{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200546 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000548}
549
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000550#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000551#ifndef WSAEAGAIN
552#define WSAEAGAIN WSAEWOULDBLOCK
553#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000554#define CHECK_ERRNO(expected) \
555 (WSAGetLastError() == WSA ## expected)
556#else
557#define CHECK_ERRNO(expected) \
558 (errno == expected)
559#endif
560
Victor Stinnerdaf45552013-08-28 00:53:59 +0200561#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200562# define GET_SOCK_ERROR WSAGetLastError()
563# define SET_SOCK_ERROR(err) WSASetLastError(err)
564# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
565# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
566#else
567# define GET_SOCK_ERROR errno
568# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
569# define SOCK_TIMEOUT_ERR EWOULDBLOCK
570# define SOCK_INPROGRESS_ERR EINPROGRESS
571#endif
572
Miss Islington (bot)5b17d7f2018-09-04 23:45:03 -0700573#ifdef _MSC_VER
574# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
575#else
576# define SUPPRESS_DEPRECATED_CALL
577#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200578
579#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200580/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
581static int support_wsa_no_inherit = -1;
582#endif
583
Guido van Rossum30a685f1991-06-27 15:51:29 +0000584/* Convenience function to raise an error according to errno
585 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586
Guido van Rossum73624e91994-10-10 17:59:00 +0000587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000588set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000590#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 int err_no = WSAGetLastError();
592 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
593 recognizes the error codes used by both GetLastError() and
594 WSAGetLastError */
595 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200596 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000597#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000598
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200599 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600}
601
Guido van Rossum30a685f1991-06-27 15:51:29 +0000602
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000604set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000607
608#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 if (v != NULL) {
614 PyErr_SetObject(socket_herror, v);
615 Py_DECREF(v);
616 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619}
620
621
622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000623set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626
Martin v. Löwis272cb402002-03-01 08:31:07 +0000627#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* EAI_SYSTEM is not available on Windows XP. */
629 if (error == EAI_SYSTEM)
630 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000631#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000633#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000635#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 if (v != NULL) {
639 PyErr_SetObject(socket_gaierror, v);
640 Py_DECREF(v);
641 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644}
645
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000646/* Function to perform the setting of socket blocking mode
647 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000648static int
649internal_setblocking(PySocketSockObject *s, int block)
650{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400651 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200652#ifdef MS_WINDOWS
653 u_long arg;
654#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100655#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100656 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100657 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100662#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200664 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400665 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200668 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400669 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100671 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 else
Victor Stinner9a954832013-12-04 00:41:24 +0100673 new_delay_flag = delay_flag | O_NONBLOCK;
674 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200675 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400676 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100677#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200679 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200680 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400681 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400683
684 result = 0;
685
686 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200690#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200692#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400693 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200694#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400695 }
696
697 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698}
699
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000700static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200701internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
702 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100705#ifdef HAVE_POLL
706 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200707 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100708#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200710 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100711#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000712
Victor Stinnerb7df3142015-03-27 22:59:32 +0100713 /* must be called with the GIL held */
714 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100715
Victor Stinner416f2e62015-03-31 13:56:29 +0200716 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200717 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200720 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 /* Prefer poll, if available, since you can poll() any fd
724 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000725#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100726 pollfd.fd = s->sock_fd;
727 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200728 if (connect) {
729 /* On Windows, the socket becomes writable on connection success,
730 but a connection failure is notified as an error. On POSIX, the
731 socket becomes writable on connection success or on connection
732 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200733 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200734 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000735
Victor Stinner71694d52015-03-28 01:18:54 +0100736 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200737 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200738 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000739
Victor Stinner71694d52015-03-28 01:18:54 +0100740 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200741 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100742 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000743#else
Victor Stinnerced11742015-04-09 10:27:25 +0200744 if (interval >= 0) {
745 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
746 tvp = &tv;
747 }
748 else
749 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000750
Victor Stinner71694d52015-03-28 01:18:54 +0100751 FD_ZERO(&fds);
752 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200753 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 if (connect) {
755 /* On Windows, the socket becomes writable on connection success,
756 but a connection failure is notified as an error. On POSIX, the
757 socket becomes writable on connection success or on connection
758 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200759 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 }
Victor Stinner71694d52015-03-28 01:18:54 +0100761
762 /* See if the socket is ready */
763 Py_BEGIN_ALLOW_THREADS;
764 if (writing)
765 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200766 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100767 else
768 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200769 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100770 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (n < 0)
774 return -1;
775 if (n == 0)
776 return 1;
777 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000778}
779
Victor Stinner31bf2d52015-04-01 21:57:09 +0200780/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000781
Victor Stinner81c41db2015-04-02 11:50:57 +0200782 On error, raise an exception and return -1 if err is set, or fill err and
783 return -1 otherwise. If a signal was received and the signal handler raised
784 an exception, return -1, and set err to -1 if err is set.
785
786 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100787
Victor Stinner31bf2d52015-04-01 21:57:09 +0200788 If the socket has a timeout, wait until the socket is ready before calling
789 the function: wait until the socket is writable if writing is nonzero, wait
790 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100791
Victor Stinner81c41db2015-04-02 11:50:57 +0200792 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200793 the function, except if the signal handler raised an exception (PEP 475).
794
795 When the function is retried, recompute the timeout using a monotonic clock.
796
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 sock_call_ex() must be called with the GIL held. The socket function is
798 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200799static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200800sock_call_ex(PySocketSockObject *s,
801 int writing,
802 int (*sock_func) (PySocketSockObject *s, void *data),
803 void *data,
804 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200805 int *err,
806 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807{
Victor Stinner8912d142015-04-06 23:16:34 +0200808 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200809 _PyTime_t deadline = 0;
810 int deadline_initialized = 0;
811 int res;
812
813 /* sock_call() must be called with the GIL held. */
814 assert(PyGILState_Check());
815
816 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200819 /* For connect(), poll even for blocking socket. The connection
820 runs asynchronously. */
821 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200822 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200823 _PyTime_t interval;
824
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 if (deadline_initialized) {
826 /* recompute the timeout */
827 interval = deadline - _PyTime_GetMonotonicClock();
828 }
829 else {
830 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200831 deadline = _PyTime_GetMonotonicClock() + timeout;
832 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834
Victor Stinner10550cd2015-04-03 13:22:27 +0200835 if (interval >= 0)
836 res = internal_select(s, writing, interval, connect);
837 else
838 res = 1;
839 }
840 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200841 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200842 }
843
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200845 if (err)
846 *err = GET_SOCK_ERROR;
847
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848 if (CHECK_ERRNO(EINTR)) {
849 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200850 if (PyErr_CheckSignals()) {
851 if (err)
852 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200853 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200855
856 /* retry select() */
857 continue;
858 }
859
860 /* select() failed */
861 s->errorhandler();
862 return -1;
863 }
864
865 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200866 if (err)
867 *err = SOCK_TIMEOUT_ERR;
868 else
869 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200870 return -1;
871 }
872
873 /* the socket is ready */
874 }
875
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 /* inner loop to retry sock_func() when sock_func() is interrupted
877 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200878 while (1) {
879 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200881 Py_END_ALLOW_THREADS
882
883 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200884 /* sock_func() succeeded */
885 if (err)
886 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887 return 0;
888 }
889
Victor Stinner81c41db2015-04-02 11:50:57 +0200890 if (err)
891 *err = GET_SOCK_ERROR;
892
Victor Stinner31bf2d52015-04-01 21:57:09 +0200893 if (!CHECK_ERRNO(EINTR))
894 break;
895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 /* sock_func() was interrupted by a signal */
897 if (PyErr_CheckSignals()) {
898 if (err)
899 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200900 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200901 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902
Victor Stinner81c41db2015-04-02 11:50:57 +0200903 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200904 }
905
906 if (s->sock_timeout > 0
907 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200908 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200909
910 For example, select() could indicate a socket is ready for
911 reading, but the data then discarded by the OS because of a
912 wrong checksum.
913
914 Loop on select() to recheck for socket readyness. */
915 continue;
916 }
917
Victor Stinner81c41db2015-04-02 11:50:57 +0200918 /* sock_func() failed */
919 if (!err)
920 s->errorhandler();
921 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000922 return -1;
923 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200924}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000925
Victor Stinner81c41db2015-04-02 11:50:57 +0200926static int
927sock_call(PySocketSockObject *s,
928 int writing,
929 int (*func) (PySocketSockObject *s, void *data),
930 void *data)
931{
Victor Stinner8912d142015-04-06 23:16:34 +0200932 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200933}
934
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000935
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000936/* Initialize a new socket object. */
937
Victor Stinner88ed6402015-04-09 10:23:12 +0200938/* Default timeout for new sockets */
939static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000940
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200941static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000942init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 s->sock_fd = fd;
946 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500949
950 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
951 on some OSes as part of socket.type. We want to reset them here,
952 to make socket.type be set to the same value on all platforms.
953 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
954 not portable.
955 */
956#ifdef SOCK_NONBLOCK
957 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
958#endif
959#ifdef SOCK_CLOEXEC
960 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
961#endif
962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000966#ifdef SOCK_NONBLOCK
967 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100968 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000969 else
970#endif
971 {
972 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200973 if (defaulttimeout >= 0) {
974 if (internal_setblocking(s, 0) == -1) {
975 return -1;
976 }
977 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000978 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200979 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000980}
981
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983/* Create a new socket object.
984 This just creates the object and initializes it.
985 If the creation fails, return NULL and set an exception (implicit
986 in NEWOBJ()). */
987
Guido van Rossum73624e91994-10-10 17:59:00 +0000988static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000989new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 PySocketSockObject *s;
992 s = (PySocketSockObject *)
993 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200994 if (s == NULL)
995 return NULL;
996 if (init_sockobject(s, fd, family, type, proto) == -1) {
997 Py_DECREF(s);
998 return NULL;
999 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001001}
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001005 thread to be in gethostbyname or getaddrinfo */
1006#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001007static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001008#endif
1009
1010
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011/* Convert a string specifying a host name or one of a few symbolic
1012 names to a numeric IP address. This usually calls gethostbyname()
1013 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001014 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015 an error occurred; then an exception is raised. */
1016
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001018setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 struct addrinfo hints, *res;
1021 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1024 if (name[0] == '\0') {
1025 int siz;
1026 memset(&hints, 0, sizeof(hints));
1027 hints.ai_family = af;
1028 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1029 hints.ai_flags = AI_PASSIVE;
1030 Py_BEGIN_ALLOW_THREADS
1031 ACQUIRE_GETADDRINFO_LOCK
1032 error = getaddrinfo(NULL, "0", &hints, &res);
1033 Py_END_ALLOW_THREADS
1034 /* We assume that those thread-unsafe getaddrinfo() versions
1035 *are* safe regarding their return value, ie. that a
1036 subsequent call to getaddrinfo() does not destroy the
1037 outcome of the first call. */
1038 RELEASE_GETADDRINFO_LOCK
1039 if (error) {
1040 set_gaierror(error);
1041 return -1;
1042 }
1043 switch (res->ai_family) {
1044 case AF_INET:
1045 siz = 4;
1046 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001047#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case AF_INET6:
1049 siz = 16;
1050 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 default:
1053 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 "unsupported address family");
1056 return -1;
1057 }
1058 if (res->ai_next) {
1059 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001060 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 "wildcard resolved to multiple address");
1062 return -1;
1063 }
1064 if (res->ai_addrlen < addr_ret_size)
1065 addr_ret_size = res->ai_addrlen;
1066 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1067 freeaddrinfo(res);
1068 return siz;
1069 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001070 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001071 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001072 if (strcmp(name, "255.255.255.255") == 0 ||
1073 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 struct sockaddr_in *sin;
1075 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001076 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 "address family mismatched");
1078 return -1;
1079 }
1080 sin = (struct sockaddr_in *)addr_ret;
1081 memset((void *) sin, '\0', sizeof(*sin));
1082 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001083#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 sin->sin_addr.s_addr = INADDR_BROADCAST;
1087 return sizeof(sin->sin_addr);
1088 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001089
1090 /* avoid a name resolution in case of numeric address */
1091#ifdef HAVE_INET_PTON
1092 /* check for an IPv4 address */
1093 if (af == AF_UNSPEC || af == AF_INET) {
1094 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1095 memset(sin, 0, sizeof(*sin));
1096 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1097 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001098#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001099 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001100#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001101 return 4;
1102 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001104#ifdef ENABLE_IPV6
1105 /* check for an IPv6 address - if the address contains a scope ID, we
1106 * fallback to getaddrinfo(), which can handle translation from interface
1107 * name to interface index */
1108 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1109 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1110 memset(sin, 0, sizeof(*sin));
1111 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1112 sin->sin6_family = AF_INET6;
1113#ifdef HAVE_SOCKADDR_SA_LEN
1114 sin->sin6_len = sizeof(*sin);
1115#endif
1116 return 16;
1117 }
1118 }
1119#endif /* ENABLE_IPV6 */
1120#else /* HAVE_INET_PTON */
1121 /* check for an IPv4 address */
1122 if (af == AF_INET || af == AF_UNSPEC) {
1123 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1124 memset(sin, 0, sizeof(*sin));
1125 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1126 sin->sin_family = AF_INET;
1127#ifdef HAVE_SOCKADDR_SA_LEN
1128 sin->sin_len = sizeof(*sin);
1129#endif
1130 return 4;
1131 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001132 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001133#endif /* HAVE_INET_PTON */
1134
1135 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 memset(&hints, 0, sizeof(hints));
1137 hints.ai_family = af;
1138 Py_BEGIN_ALLOW_THREADS
1139 ACQUIRE_GETADDRINFO_LOCK
1140 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001141#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 if (error == EAI_NONAME && af == AF_UNSPEC) {
1143 /* On Tru64 V5.1, numeric-to-addr conversion fails
1144 if no address family is given. Assume IPv4 for now.*/
1145 hints.ai_family = AF_INET;
1146 error = getaddrinfo(name, NULL, &hints, &res);
1147 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 Py_END_ALLOW_THREADS
1150 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1151 if (error) {
1152 set_gaierror(error);
1153 return -1;
1154 }
1155 if (res->ai_addrlen < addr_ret_size)
1156 addr_ret_size = res->ai_addrlen;
1157 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1158 freeaddrinfo(res);
1159 switch (addr_ret->sa_family) {
1160 case AF_INET:
1161 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001162#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 case AF_INET6:
1164 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001167 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 return -1;
1169 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170}
1171
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Miss Islington (bot)04425992018-02-12 12:12:24 -08001173/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174
Guido van Rossum73624e91994-10-10 17:59:00 +00001175static PyObject *
Miss Islington (bot)04425992018-02-12 12:12:24 -08001176make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177{
Miss Islington (bot)04425992018-02-12 12:12:24 -08001178 char buf[INET_ADDRSTRLEN];
1179 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1180 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 return NULL;
1182 }
1183 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184}
1185
Miss Islington (bot)04425992018-02-12 12:12:24 -08001186#ifdef ENABLE_IPV6
1187/* Convert IPv6 sockaddr to a Python str. */
1188
1189static PyObject *
1190make_ipv6_addr(const struct sockaddr_in6 *addr)
1191{
1192 char buf[INET6_ADDRSTRLEN];
1193 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1194 PyErr_SetFromErrno(PyExc_OSError);
1195 return NULL;
1196 }
1197 return PyUnicode_FromString(buf);
1198}
1199#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001200
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001201#ifdef USE_BLUETOOTH
1202/* Convert a string representation of a Bluetooth address into a numeric
1203 address. Returns the length (6), or raises an exception and returns -1 if
1204 an error occurred. */
1205
1206static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001207setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 unsigned int b0, b1, b2, b3, b4, b5;
1210 char ch;
1211 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1214 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1215 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1216 bdaddr->b[0] = b0;
1217 bdaddr->b[1] = b1;
1218 bdaddr->b[2] = b2;
1219 bdaddr->b[3] = b3;
1220 bdaddr->b[4] = b4;
1221 bdaddr->b[5] = b5;
1222 return 6;
1223 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001224 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 return -1;
1226 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001227}
1228
1229/* Create a string representation of the Bluetooth address. This is always a
1230 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1231 value (zero padded if necessary). */
1232
1233static PyObject *
1234makebdaddr(bdaddr_t *bdaddr)
1235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1239 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1240 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1241 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001242}
1243#endif
1244
1245
Guido van Rossum30a685f1991-06-27 15:51:29 +00001246/* Create an object representing the given socket address,
1247 suitable for passing it back to bind(), connect() etc.
1248 The family field of the sockaddr structure is inspected
1249 to determine what kind of address it really is. */
1250
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001251/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001252static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001253makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 if (addrlen == 0) {
1256 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001257 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 case AF_INET:
1263 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001264 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1265 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 PyObject *ret = NULL;
1267 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1269 Py_DECREF(addrobj);
1270 }
1271 return ret;
1272 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001273
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001274#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 case AF_UNIX:
1276 {
1277 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001278#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001279 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1280 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1281 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 }
1283 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001284#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 {
1286 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001287 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
1289 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001290#endif /* AF_UNIX */
1291
Martin v. Löwis11017b12006-01-14 18:12:57 +00001292#if defined(AF_NETLINK)
1293 case AF_NETLINK:
1294 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1296 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001297 }
1298#endif /* AF_NETLINK */
1299
caaveryeffc12f2017-09-06 18:18:10 -04001300#if defined(AF_VSOCK)
1301 case AF_VSOCK:
1302 {
1303 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1304 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1305 }
1306#endif /* AF_VSOCK */
1307
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001308#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 case AF_INET6:
1310 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001311 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1312 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 PyObject *ret = NULL;
1314 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001315 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 addrobj,
1317 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001318 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 a->sin6_scope_id);
1320 Py_DECREF(addrobj);
1321 }
1322 return ret;
1323 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001324#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001325
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001326#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 case AF_BLUETOOTH:
1328 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 case BTPROTO_L2CAP:
1331 {
1332 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1333 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1334 PyObject *ret = NULL;
1335 if (addrobj) {
1336 ret = Py_BuildValue("Oi",
1337 addrobj,
1338 _BT_L2_MEMB(a, psm));
1339 Py_DECREF(addrobj);
1340 }
1341 return ret;
1342 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case BTPROTO_RFCOMM:
1345 {
1346 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1347 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1348 PyObject *ret = NULL;
1349 if (addrobj) {
1350 ret = Py_BuildValue("Oi",
1351 addrobj,
1352 _BT_RC_MEMB(a, channel));
1353 Py_DECREF(addrobj);
1354 }
1355 return ret;
1356 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case BTPROTO_HCI:
1359 {
1360 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001361#if defined(__NetBSD__) || defined(__DragonFly__)
1362 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001363#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 PyObject *ret = NULL;
1365 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1366 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001367#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001369
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001370#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 case BTPROTO_SCO:
1372 {
1373 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1374 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1375 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001376#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 default:
1379 PyErr_SetString(PyExc_ValueError,
1380 "Unknown Bluetooth protocol");
1381 return NULL;
1382 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001383#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001384
Antoine Pitroub156a462010-10-27 20:13:57 +00001385#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 case AF_PACKET:
1387 {
1388 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001389 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 struct ifreq ifr;
1391 /* need to look up interface name give index */
1392 if (a->sll_ifindex) {
1393 ifr.ifr_ifindex = a->sll_ifindex;
1394 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1395 ifname = ifr.ifr_name;
1396 }
1397 return Py_BuildValue("shbhy#",
1398 ifname,
1399 ntohs(a->sll_protocol),
1400 a->sll_pkttype,
1401 a->sll_hatype,
1402 a->sll_addr,
1403 a->sll_halen);
1404 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001405#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001406
Christian Heimes043d6f62008-01-07 17:19:16 +00001407#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 case AF_TIPC:
1409 {
1410 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1411 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1412 return Py_BuildValue("IIIII",
1413 a->addrtype,
1414 a->addr.nameseq.type,
1415 a->addr.nameseq.lower,
1416 a->addr.nameseq.upper,
1417 a->scope);
1418 } else if (a->addrtype == TIPC_ADDR_NAME) {
1419 return Py_BuildValue("IIIII",
1420 a->addrtype,
1421 a->addr.name.name.type,
1422 a->addr.name.name.instance,
1423 a->addr.name.name.instance,
1424 a->scope);
1425 } else if (a->addrtype == TIPC_ADDR_ID) {
1426 return Py_BuildValue("IIIII",
1427 a->addrtype,
1428 a->addr.id.node,
1429 a->addr.id.ref,
1430 0,
1431 a->scope);
1432 } else {
1433 PyErr_SetString(PyExc_ValueError,
1434 "Invalid address type");
1435 return NULL;
1436 }
1437 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001438#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001439
Serhiy Storchakad3187152017-11-09 18:00:38 +02001440#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001441 case AF_CAN:
1442 {
1443 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001444 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001445 struct ifreq ifr;
1446 /* need to look up interface name given index */
1447 if (a->can_ifindex) {
1448 ifr.ifr_ifindex = a->can_ifindex;
1449 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1450 ifname = ifr.ifr_name;
1451 }
1452
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001453 switch (proto) {
1454#ifdef CAN_ISOTP
1455 case CAN_ISOTP:
1456 {
1457 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1458 ifname,
1459 a->can_addr.tp.rx_id,
1460 a->can_addr.tp.tx_id);
1461 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001462#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001463 default:
1464 {
1465 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1466 ifname);
1467 }
1468 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001469 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001470#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001471
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001472#ifdef PF_SYSTEM
1473 case PF_SYSTEM:
1474 switch(proto) {
1475#ifdef SYSPROTO_CONTROL
1476 case SYSPROTO_CONTROL:
1477 {
1478 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1479 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1480 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001481#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001482 default:
1483 PyErr_SetString(PyExc_ValueError,
1484 "Invalid address type");
1485 return 0;
1486 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001487#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001488
Christian Heimesdffa3942016-09-05 23:54:41 +02001489#ifdef HAVE_SOCKADDR_ALG
1490 case AF_ALG:
1491 {
1492 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1493 return Py_BuildValue("s#s#HH",
1494 a->salg_type,
1495 strnlen((const char*)a->salg_type,
1496 sizeof(a->salg_type)),
1497 a->salg_name,
1498 strnlen((const char*)a->salg_name,
1499 sizeof(a->salg_name)),
1500 a->salg_feat,
1501 a->salg_mask);
1502 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001503#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 default:
1508 /* If we don't know the address family, don't raise an
1509 exception -- return it as an (int, bytes) tuple. */
1510 return Py_BuildValue("iy#",
1511 addr->sa_family,
1512 addr->sa_data,
1513 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001516}
1517
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001518/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1519 (in particular, numeric IP addresses). */
1520struct maybe_idna {
1521 PyObject *obj;
1522 char *buf;
1523};
1524
1525static void
1526idna_cleanup(struct maybe_idna *data)
1527{
1528 Py_CLEAR(data->obj);
1529}
1530
1531static int
1532idna_converter(PyObject *obj, struct maybe_idna *data)
1533{
1534 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001535 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001536 if (obj == NULL) {
1537 idna_cleanup(data);
1538 return 1;
1539 }
1540 data->obj = NULL;
1541 len = -1;
1542 if (PyBytes_Check(obj)) {
1543 data->buf = PyBytes_AsString(obj);
1544 len = PyBytes_Size(obj);
1545 }
1546 else if (PyByteArray_Check(obj)) {
1547 data->buf = PyByteArray_AsString(obj);
1548 len = PyByteArray_Size(obj);
1549 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001550 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001551 if (PyUnicode_READY(obj) == -1) {
1552 return 0;
1553 }
1554 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001555 data->buf = PyUnicode_DATA(obj);
1556 len = PyUnicode_GET_LENGTH(obj);
1557 }
1558 else {
1559 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1560 if (!obj2) {
1561 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1562 return 0;
1563 }
1564 assert(PyBytes_Check(obj2));
1565 data->obj = obj2;
1566 data->buf = PyBytes_AS_STRING(obj2);
1567 len = PyBytes_GET_SIZE(obj2);
1568 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001569 }
1570 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001571 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1572 obj->ob_type->tp_name);
1573 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001574 }
1575 if (strlen(data->buf) != len) {
1576 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001577 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001578 return 0;
1579 }
1580 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001581}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001582
1583/* Parse a socket address argument according to the socket object's
1584 address family. Return 1 if the address was in the proper format,
1585 0 of not. The address is returned through addr_ret, its length
1586 through len_ret. */
1587
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001589getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001594#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 case AF_UNIX:
1596 {
1597 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001598 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001599 int retval = 0;
1600
1601 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1602 allow embedded nulls on Linux. */
1603 if (PyUnicode_Check(args)) {
1604 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1605 return 0;
1606 }
1607 else
1608 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001609 if (!PyArg_Parse(args, "y*", &path)) {
1610 Py_DECREF(args);
1611 return retval;
1612 }
1613 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001616#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001617 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001619 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001620 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001622 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 }
1624 }
1625 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001626#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 {
1628 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001629 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001630 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001632 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001634 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 }
1636 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001637 memcpy(addr->sun_path, path.buf, path.len);
1638 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001639 retval = 1;
1640 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001641 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001642 Py_DECREF(args);
1643 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001645#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646
Martin v. Löwis11017b12006-01-14 18:12:57 +00001647#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 case AF_NETLINK:
1649 {
1650 struct sockaddr_nl* addr;
1651 int pid, groups;
1652 addr = (struct sockaddr_nl *)addr_ret;
1653 if (!PyTuple_Check(args)) {
1654 PyErr_Format(
1655 PyExc_TypeError,
1656 "getsockaddrarg: "
1657 "AF_NETLINK address must be tuple, not %.500s",
1658 Py_TYPE(args)->tp_name);
1659 return 0;
1660 }
1661 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1662 return 0;
1663 addr->nl_family = AF_NETLINK;
1664 addr->nl_pid = pid;
1665 addr->nl_groups = groups;
1666 *len_ret = sizeof(*addr);
1667 return 1;
1668 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001669#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001670
caaveryeffc12f2017-09-06 18:18:10 -04001671#if defined(AF_VSOCK)
1672 case AF_VSOCK:
1673 {
1674 struct sockaddr_vm* addr;
1675 int port, cid;
1676 addr = (struct sockaddr_vm *)addr_ret;
1677 memset(addr, 0, sizeof(struct sockaddr_vm));
1678 if (!PyTuple_Check(args)) {
1679 PyErr_Format(
1680 PyExc_TypeError,
1681 "getsockaddrarg: "
1682 "AF_VSOCK address must be tuple, not %.500s",
1683 Py_TYPE(args)->tp_name);
1684 return 0;
1685 }
1686 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1687 return 0;
1688 addr->svm_family = s->sock_family;
1689 addr->svm_port = port;
1690 addr->svm_cid = cid;
1691 *len_ret = sizeof(*addr);
1692 return 1;
1693 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001694#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001695
1696
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001697#ifdef AF_RDS
1698 case AF_RDS:
1699 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001700#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 case AF_INET:
1703 {
1704 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001705 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 int port, result;
1707 if (!PyTuple_Check(args)) {
1708 PyErr_Format(
1709 PyExc_TypeError,
1710 "getsockaddrarg: "
1711 "AF_INET address must be tuple, not %.500s",
1712 Py_TYPE(args)->tp_name);
1713 return 0;
1714 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001715 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1716 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 return 0;
1718 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001719 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001721 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 if (result < 0)
1723 return 0;
1724 if (port < 0 || port > 0xffff) {
1725 PyErr_SetString(
1726 PyExc_OverflowError,
1727 "getsockaddrarg: port must be 0-65535.");
1728 return 0;
1729 }
1730 addr->sin_family = AF_INET;
1731 addr->sin_port = htons((short)port);
1732 *len_ret = sizeof *addr;
1733 return 1;
1734 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001735
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001736#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 case AF_INET6:
1738 {
1739 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001740 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001741 int port, result;
1742 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 flowinfo = scope_id = 0;
1744 if (!PyTuple_Check(args)) {
1745 PyErr_Format(
1746 PyExc_TypeError,
1747 "getsockaddrarg: "
1748 "AF_INET6 address must be tuple, not %.500s",
1749 Py_TYPE(args)->tp_name);
1750 return 0;
1751 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001752 if (!PyArg_ParseTuple(args, "O&i|II",
1753 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 &scope_id)) {
1755 return 0;
1756 }
1757 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001758 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001760 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 if (result < 0)
1762 return 0;
1763 if (port < 0 || port > 0xffff) {
1764 PyErr_SetString(
1765 PyExc_OverflowError,
1766 "getsockaddrarg: port must be 0-65535.");
1767 return 0;
1768 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001769 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001770 PyErr_SetString(
1771 PyExc_OverflowError,
1772 "getsockaddrarg: flowinfo must be 0-1048575.");
1773 return 0;
1774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 addr->sin6_family = s->sock_family;
1776 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001777 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 addr->sin6_scope_id = scope_id;
1779 *len_ret = sizeof *addr;
1780 return 1;
1781 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001782#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001783
Hye-Shik Chang81268602004-02-02 06:05:24 +00001784#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 case AF_BLUETOOTH:
1786 {
1787 switch (s->sock_proto) {
1788 case BTPROTO_L2CAP:
1789 {
1790 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001791 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 addr = (struct sockaddr_l2 *)addr_ret;
1794 memset(addr, 0, sizeof(struct sockaddr_l2));
1795 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1796 if (!PyArg_ParseTuple(args, "si", &straddr,
1797 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001798 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 "wrong format");
1800 return 0;
1801 }
1802 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1803 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 *len_ret = sizeof *addr;
1806 return 1;
1807 }
1808 case BTPROTO_RFCOMM:
1809 {
1810 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001811 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 addr = (struct sockaddr_rc *)addr_ret;
1814 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1815 if (!PyArg_ParseTuple(args, "si", &straddr,
1816 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001817 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 "wrong format");
1819 return 0;
1820 }
1821 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1822 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 *len_ret = sizeof *addr;
1825 return 1;
1826 }
1827 case BTPROTO_HCI:
1828 {
1829 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001830#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001831 const char *straddr;
1832 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1833 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001834 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001835 "wrong format");
1836 return 0;
1837 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001838 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001839 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1840 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001841#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1843 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001844 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 "wrong format");
1846 return 0;
1847 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001848#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 *len_ret = sizeof *addr;
1850 return 1;
1851 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001852#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 case BTPROTO_SCO:
1854 {
1855 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001856 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 addr = (struct sockaddr_sco *)addr_ret;
1859 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1860 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001861 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 "wrong format");
1863 return 0;
1864 }
1865 straddr = PyBytes_AS_STRING(args);
1866 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1867 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 *len_ret = sizeof *addr;
1870 return 1;
1871 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001872#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001874 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 return 0;
1876 }
1877 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001878#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001879
Antoine Pitroub156a462010-10-27 20:13:57 +00001880#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 case AF_PACKET:
1882 {
1883 struct sockaddr_ll* addr;
1884 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001885 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 int protoNumber;
1887 int hatype = 0;
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001888 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001889 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 if (!PyTuple_Check(args)) {
1892 PyErr_Format(
1893 PyExc_TypeError,
1894 "getsockaddrarg: "
1895 "AF_PACKET address must be tuple, not %.500s",
1896 Py_TYPE(args)->tp_name);
1897 return 0;
1898 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001899 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001901 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 return 0;
1903 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1904 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1905 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1906 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001907 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 return 0;
1909 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001910 if (haddr.buf && haddr.len > 8) {
1911 PyErr_SetString(PyExc_ValueError,
1912 "Hardware address must be 8 bytes or less");
1913 PyBuffer_Release(&haddr);
1914 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 }
1916 if (protoNumber < 0 || protoNumber > 0xffff) {
1917 PyErr_SetString(
1918 PyExc_OverflowError,
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001919 "getsockaddrarg: proto must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001920 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 return 0;
1922 }
1923 addr = (struct sockaddr_ll*)addr_ret;
1924 addr->sll_family = AF_PACKET;
1925 addr->sll_protocol = htons((short)protoNumber);
1926 addr->sll_ifindex = ifr.ifr_ifindex;
1927 addr->sll_pkttype = pkttype;
1928 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001929 if (haddr.buf) {
1930 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1931 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001933 else
1934 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001936 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 return 1;
1938 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001939#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001940
Christian Heimes043d6f62008-01-07 17:19:16 +00001941#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 case AF_TIPC:
1943 {
1944 unsigned int atype, v1, v2, v3;
1945 unsigned int scope = TIPC_CLUSTER_SCOPE;
1946 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 if (!PyTuple_Check(args)) {
1949 PyErr_Format(
1950 PyExc_TypeError,
1951 "getsockaddrarg: "
1952 "AF_TIPC address must be tuple, not %.500s",
1953 Py_TYPE(args)->tp_name);
1954 return 0;
1955 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 if (!PyArg_ParseTuple(args,
1958 "IIII|I;Invalid TIPC address format",
1959 &atype, &v1, &v2, &v3, &scope))
1960 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 addr = (struct sockaddr_tipc *) addr_ret;
1963 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 addr->family = AF_TIPC;
1966 addr->scope = scope;
1967 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 if (atype == TIPC_ADDR_NAMESEQ) {
1970 addr->addr.nameseq.type = v1;
1971 addr->addr.nameseq.lower = v2;
1972 addr->addr.nameseq.upper = v3;
1973 } else if (atype == TIPC_ADDR_NAME) {
1974 addr->addr.name.name.type = v1;
1975 addr->addr.name.name.instance = v2;
1976 } else if (atype == TIPC_ADDR_ID) {
1977 addr->addr.id.node = v1;
1978 addr->addr.id.ref = v2;
1979 } else {
1980 /* Shouldn't happen */
1981 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1982 return 0;
1983 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 return 1;
1988 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001989#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001990
Serhiy Storchakad3187152017-11-09 18:00:38 +02001991#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001992 case AF_CAN:
1993 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001994#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001995 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001996 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001997#endif
1998#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001999 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002000#endif
2001#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 {
2003 struct sockaddr_can *addr;
2004 PyObject *interfaceName;
2005 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002006 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002007 addr = (struct sockaddr_can *)addr_ret;
2008
Charles-François Natali47413c12011-10-06 19:47:44 +02002009 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
2010 &interfaceName))
2011 return 0;
2012
2013 len = PyBytes_GET_SIZE(interfaceName);
2014
2015 if (len == 0) {
2016 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002017 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002018 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2019 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002020 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2021 s->errorhandler();
2022 Py_DECREF(interfaceName);
2023 return 0;
2024 }
2025 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002026 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002027 "AF_CAN interface name too long");
2028 Py_DECREF(interfaceName);
2029 return 0;
2030 }
2031
2032 addr->can_family = AF_CAN;
2033 addr->can_ifindex = ifr.ifr_ifindex;
2034
2035 *len_ret = sizeof(*addr);
2036 Py_DECREF(interfaceName);
2037 return 1;
2038 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002039#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002040
2041#ifdef CAN_ISOTP
2042 case CAN_ISOTP:
2043 {
2044 struct sockaddr_can *addr;
2045 PyObject *interfaceName;
2046 struct ifreq ifr;
2047 Py_ssize_t len;
2048 unsigned long int rx_id, tx_id;
2049
2050 addr = (struct sockaddr_can *)addr_ret;
2051
2052 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2053 &interfaceName,
2054 &rx_id,
2055 &tx_id))
2056 return 0;
2057
2058 len = PyBytes_GET_SIZE(interfaceName);
2059
2060 if (len == 0) {
2061 ifr.ifr_ifindex = 0;
2062 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2063 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2064 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2065 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2066 s->errorhandler();
2067 Py_DECREF(interfaceName);
2068 return 0;
2069 }
2070 } else {
2071 PyErr_SetString(PyExc_OSError,
2072 "AF_CAN interface name too long");
2073 Py_DECREF(interfaceName);
2074 return 0;
2075 }
2076
2077 addr->can_family = AF_CAN;
2078 addr->can_ifindex = ifr.ifr_ifindex;
2079 addr->can_addr.tp.rx_id = rx_id;
2080 addr->can_addr.tp.tx_id = tx_id;
2081
2082 *len_ret = sizeof(*addr);
2083 Py_DECREF(interfaceName);
2084 return 1;
2085 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002086#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002087 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002088 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002089 "getsockaddrarg: unsupported CAN protocol");
2090 return 0;
2091 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002092#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002093
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002094#ifdef PF_SYSTEM
2095 case PF_SYSTEM:
2096 switch (s->sock_proto) {
2097#ifdef SYSPROTO_CONTROL
2098 case SYSPROTO_CONTROL:
2099 {
2100 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002101
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002102 addr = (struct sockaddr_ctl *)addr_ret;
2103 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002104 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002105
2106 if (PyUnicode_Check(args)) {
2107 struct ctl_info info;
2108 PyObject *ctl_name;
2109
2110 if (!PyArg_Parse(args, "O&",
2111 PyUnicode_FSConverter, &ctl_name)) {
2112 return 0;
2113 }
2114
Victor Stinnerf50e1872015-03-20 11:32:24 +01002115 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002116 PyErr_SetString(PyExc_ValueError,
2117 "provided string is too long");
2118 Py_DECREF(ctl_name);
2119 return 0;
2120 }
2121 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2122 sizeof(info.ctl_name));
2123 Py_DECREF(ctl_name);
2124
2125 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2126 PyErr_SetString(PyExc_OSError,
2127 "cannot find kernel control with provided name");
2128 return 0;
2129 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002130
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002131 addr->sc_id = info.ctl_id;
2132 addr->sc_unit = 0;
2133 } else if (!PyArg_ParseTuple(args, "II",
2134 &(addr->sc_id), &(addr->sc_unit))) {
2135 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2136 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002137
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002138 return 0;
2139 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002140
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002141 *len_ret = sizeof(*addr);
2142 return 1;
2143 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002144#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002145 default:
2146 PyErr_SetString(PyExc_OSError,
2147 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2148 return 0;
2149 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002150#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002151#ifdef HAVE_SOCKADDR_ALG
2152 case AF_ALG:
2153 {
2154 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002155 const char *type;
2156 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002157 sa = (struct sockaddr_alg *)addr_ret;
2158
2159 memset(sa, 0, sizeof(*sa));
2160 sa->salg_family = AF_ALG;
2161
2162 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2163 &type, &name, &sa->salg_feat, &sa->salg_mask))
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002164 {
Christian Heimesdffa3942016-09-05 23:54:41 +02002165 return 0;
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002166 }
2167 /* sockaddr_alg has fixed-sized char arrays for type, and name
2168 * both must be NULL terminated.
2169 */
2170 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002171 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2172 return 0;
2173 }
2174 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002175 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002176 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2177 return 0;
2178 }
2179 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2180
2181 *len_ret = sizeof(*sa);
2182 return 1;
2183 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002184#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002189 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002193}
2194
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195
Guido van Rossum48a680c2001-03-02 06:34:14 +00002196/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002197 Return 1 if the family is known, 0 otherwise. The length is returned
2198 through len_ret. */
2199
2200static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002201getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002204
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002205#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 case AF_UNIX:
2207 {
2208 *len_ret = sizeof (struct sockaddr_un);
2209 return 1;
2210 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002211#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002212
Martin v. Löwis11017b12006-01-14 18:12:57 +00002213#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002214 case AF_NETLINK:
2215 {
2216 *len_ret = sizeof (struct sockaddr_nl);
2217 return 1;
2218 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002219#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002220
caaveryeffc12f2017-09-06 18:18:10 -04002221#if defined(AF_VSOCK)
2222 case AF_VSOCK:
2223 {
2224 *len_ret = sizeof (struct sockaddr_vm);
2225 return 1;
2226 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002227#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002228
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002229#ifdef AF_RDS
2230 case AF_RDS:
2231 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002232#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 case AF_INET:
2235 {
2236 *len_ret = sizeof (struct sockaddr_in);
2237 return 1;
2238 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002239
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002240#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 case AF_INET6:
2242 {
2243 *len_ret = sizeof (struct sockaddr_in6);
2244 return 1;
2245 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002246#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002247
Hye-Shik Chang81268602004-02-02 06:05:24 +00002248#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 case AF_BLUETOOTH:
2250 {
2251 switch(s->sock_proto)
2252 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 case BTPROTO_L2CAP:
2255 *len_ret = sizeof (struct sockaddr_l2);
2256 return 1;
2257 case BTPROTO_RFCOMM:
2258 *len_ret = sizeof (struct sockaddr_rc);
2259 return 1;
2260 case BTPROTO_HCI:
2261 *len_ret = sizeof (struct sockaddr_hci);
2262 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002263#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 case BTPROTO_SCO:
2265 *len_ret = sizeof (struct sockaddr_sco);
2266 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002267#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002269 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 "unknown BT protocol");
2271 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 }
2274 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002275#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002276
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002277#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 case AF_PACKET:
2279 {
2280 *len_ret = sizeof (struct sockaddr_ll);
2281 return 1;
2282 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002283#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002284
Christian Heimes043d6f62008-01-07 17:19:16 +00002285#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 case AF_TIPC:
2287 {
2288 *len_ret = sizeof (struct sockaddr_tipc);
2289 return 1;
2290 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002291#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002292
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002293#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002294 case AF_CAN:
2295 {
2296 *len_ret = sizeof (struct sockaddr_can);
2297 return 1;
2298 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002299#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002300
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002301#ifdef PF_SYSTEM
2302 case PF_SYSTEM:
2303 switch(s->sock_proto) {
2304#ifdef SYSPROTO_CONTROL
2305 case SYSPROTO_CONTROL:
2306 *len_ret = sizeof (struct sockaddr_ctl);
2307 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002308#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002309 default:
2310 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2311 "unknown PF_SYSTEM protocol");
2312 return 0;
2313 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002314#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002315#ifdef HAVE_SOCKADDR_ALG
2316 case AF_ALG:
2317 {
2318 *len_ret = sizeof (struct sockaddr_alg);
2319 return 1;
2320 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002321#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002326 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002330}
2331
2332
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002333/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2334 Currently, these methods are only compiled if the RFC 2292/3542
2335 CMSG_LEN() macro is available. Older systems seem to have used
2336 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2337 it may be possible to define CMSG_LEN() that way if it's not
2338 provided. Some architectures might need extra padding after the
2339 cmsghdr, however, and CMSG_LEN() would have to take account of
2340 this. */
2341#ifdef CMSG_LEN
2342/* If length is in range, set *result to CMSG_LEN(length) and return
2343 true; otherwise, return false. */
2344static int
2345get_CMSG_LEN(size_t length, size_t *result)
2346{
2347 size_t tmp;
2348
2349 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2350 return 0;
2351 tmp = CMSG_LEN(length);
2352 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2353 return 0;
2354 *result = tmp;
2355 return 1;
2356}
2357
2358#ifdef CMSG_SPACE
2359/* If length is in range, set *result to CMSG_SPACE(length) and return
2360 true; otherwise, return false. */
2361static int
2362get_CMSG_SPACE(size_t length, size_t *result)
2363{
2364 size_t tmp;
2365
2366 /* Use CMSG_SPACE(1) here in order to take account of the padding
2367 necessary before *and* after the data. */
2368 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2369 return 0;
2370 tmp = CMSG_SPACE(length);
2371 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2372 return 0;
2373 *result = tmp;
2374 return 1;
2375}
2376#endif
2377
2378/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2379 pointer in msg->msg_control with at least "space" bytes after it,
2380 and its cmsg_len member inside the buffer. */
2381static int
2382cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2383{
2384 size_t cmsg_offset;
2385 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2386 sizeof(cmsgh->cmsg_len));
2387
Charles-François Natali466517d2011-08-28 18:23:43 +02002388 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002389 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002390 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002391 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2392 annoying under OS X as it's unsigned there and so it triggers a
2393 tautological comparison warning under Clang when compared against 0.
2394 Since the check is valid on other platforms, silence the warning under
2395 Clang. */
2396 #ifdef __clang__
2397 #pragma clang diagnostic push
2398 #pragma clang diagnostic ignored "-Wtautological-compare"
2399 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002400 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002401 #pragma GCC diagnostic push
2402 #pragma GCC diagnostic ignored "-Wtype-limits"
2403 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002404 if (msg->msg_controllen < 0)
2405 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002406 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002407 #pragma GCC diagnostic pop
2408 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002409 #ifdef __clang__
2410 #pragma clang diagnostic pop
2411 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002412 if (space < cmsg_len_end)
2413 space = cmsg_len_end;
2414 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2415 return (cmsg_offset <= (size_t)-1 - space &&
2416 cmsg_offset + space <= msg->msg_controllen);
2417}
2418
2419/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2420 *space to number of bytes following it in the buffer and return
2421 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2422 msg->msg_controllen are valid. */
2423static int
2424get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2425{
2426 size_t data_offset;
2427 char *data_ptr;
2428
2429 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2430 return 0;
2431 data_offset = data_ptr - (char *)msg->msg_control;
2432 if (data_offset > msg->msg_controllen)
2433 return 0;
2434 *space = msg->msg_controllen - data_offset;
2435 return 1;
2436}
2437
2438/* If cmsgh is invalid or not contained in the buffer pointed to by
2439 msg->msg_control, return -1. If cmsgh is valid and its associated
2440 data is entirely contained in the buffer, set *data_len to the
2441 length of the associated data and return 0. If only part of the
2442 associated data is contained in the buffer but cmsgh is otherwise
2443 valid, set *data_len to the length contained in the buffer and
2444 return 1. */
2445static int
2446get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2447{
2448 size_t space, cmsg_data_len;
2449
2450 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2451 cmsgh->cmsg_len < CMSG_LEN(0))
2452 return -1;
2453 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2454 if (!get_cmsg_data_space(msg, cmsgh, &space))
2455 return -1;
2456 if (space >= cmsg_data_len) {
2457 *data_len = cmsg_data_len;
2458 return 0;
2459 }
2460 *data_len = space;
2461 return 1;
2462}
2463#endif /* CMSG_LEN */
2464
2465
Victor Stinner31bf2d52015-04-01 21:57:09 +02002466struct sock_accept {
2467 socklen_t *addrlen;
2468 sock_addr_t *addrbuf;
2469 SOCKET_T result;
2470};
2471
2472#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2473/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2474static int accept4_works = -1;
2475#endif
2476
2477static int
2478sock_accept_impl(PySocketSockObject *s, void *data)
2479{
2480 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002481 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2482 socklen_t *paddrlen = ctx->addrlen;
2483#ifdef HAVE_SOCKADDR_ALG
2484 /* AF_ALG does not support accept() with addr and raises
2485 * ECONNABORTED instead. */
2486 if (s->sock_family == AF_ALG) {
2487 addr = NULL;
2488 paddrlen = NULL;
2489 *ctx->addrlen = 0;
2490 }
2491#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002492
2493#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2494 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002495 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002496 SOCK_CLOEXEC);
2497 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2498 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2499 accept4_works = (errno != ENOSYS);
2500 }
2501 }
2502 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002503 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002504#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002505 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002506#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002507
2508#ifdef MS_WINDOWS
2509 return (ctx->result != INVALID_SOCKET);
2510#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002511 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002512#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002513}
2514
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002515/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002516
Guido van Rossum73624e91994-10-10 17:59:00 +00002517static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002521 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 socklen_t addrlen;
2523 PyObject *sock = NULL;
2524 PyObject *addr = NULL;
2525 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002526 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 if (!getsockaddrlen(s, &addrlen))
2529 return NULL;
2530 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 if (!IS_SELECTABLE(s))
2533 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002534
Victor Stinner31bf2d52015-04-01 21:57:09 +02002535 ctx.addrlen = &addrlen;
2536 ctx.addrbuf = &addrbuf;
2537 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002539 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002540
Victor Stinnerdaf45552013-08-28 00:53:59 +02002541#ifdef MS_WINDOWS
2542 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2543 PyErr_SetFromWindowsErr(0);
2544 SOCKETCLOSE(newfd);
2545 goto finally;
2546 }
2547#else
2548
2549#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2550 if (!accept4_works)
2551#endif
2552 {
2553 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2554 SOCKETCLOSE(newfd);
2555 goto finally;
2556 }
2557 }
2558#endif
2559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 sock = PyLong_FromSocket_t(newfd);
2561 if (sock == NULL) {
2562 SOCKETCLOSE(newfd);
2563 goto finally;
2564 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2567 addrlen, s->sock_proto);
2568 if (addr == NULL)
2569 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002572
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 Py_XDECREF(sock);
2575 Py_XDECREF(addr);
2576 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002577}
2578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002579PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002580"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002582Wait for an incoming connection. Return a new socket file descriptor\n\
2583representing the connection, and the address of the client.\n\
2584For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002585
Guido van Rossum11ba0942002-06-13 15:07:44 +00002586/* s.setblocking(flag) method. Argument:
2587 False -- non-blocking mode; same as settimeout(0)
2588 True -- blocking mode; same as settimeout(None)
2589*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002590
Guido van Rossum73624e91994-10-10 17:59:00 +00002591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002592sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002593{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002594 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 block = PyLong_AsLong(arg);
2597 if (block == -1 && PyErr_Occurred())
2598 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599
Victor Stinner9001d802015-04-06 23:06:01 +02002600 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002601 if (internal_setblocking(s, block) == -1) {
2602 return NULL;
2603 }
2604 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002605}
Guido van Rossume4485b01994-09-07 14:32:49 +00002606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002607PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002608"setblocking(flag)\n\
2609\n\
2610Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002611setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002613
Yury Selivanovf11b4602018-01-28 17:27:38 -05002614/* s.getblocking() method.
2615 Returns True if socket is in blocking mode,
2616 False if it is in non-blocking mode.
2617*/
2618static PyObject *
2619sock_getblocking(PySocketSockObject *s)
2620{
2621 if (s->sock_timeout) {
2622 Py_RETURN_TRUE;
2623 }
2624 else {
2625 Py_RETURN_FALSE;
2626 }
2627}
2628
2629PyDoc_STRVAR(getblocking_doc,
2630"getblocking()\n\
2631\n\
2632Returns True if socket is in blocking mode, or False if it\n\
2633is in non-blocking mode.");
2634
Victor Stinner71694d52015-03-28 01:18:54 +01002635static int
2636socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2637{
2638#ifdef MS_WINDOWS
2639 struct timeval tv;
2640#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002641#ifndef HAVE_POLL
2642 _PyTime_t ms;
2643#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002644 int overflow = 0;
2645
2646 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002647 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002648 return 0;
2649 }
2650
Victor Stinner869e1772015-03-30 03:49:14 +02002651 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002652 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002653 return -1;
2654
2655 if (*timeout < 0) {
2656 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2657 return -1;
2658 }
2659
2660#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002661 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002662#endif
2663#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002664 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002665 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002666#endif
2667 if (overflow) {
2668 PyErr_SetString(PyExc_OverflowError,
2669 "timeout doesn't fit into C timeval");
2670 return -1;
2671 }
2672
2673 return 0;
2674}
2675
Guido van Rossum11ba0942002-06-13 15:07:44 +00002676/* s.settimeout(timeout) method. Argument:
2677 None -- no timeout, blocking mode; same as setblocking(True)
2678 0.0 -- non-blocking mode; same as setblocking(False)
2679 > 0 -- timeout mode; operations time out after timeout seconds
2680 < 0 -- illegal; raises an exception
2681*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002683sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002684{
Victor Stinner71694d52015-03-28 01:18:54 +01002685 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686
Victor Stinner71694d52015-03-28 01:18:54 +01002687 if (socket_parse_timeout(&timeout, arg) < 0)
2688 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002691
2692 int block = timeout < 0;
2693 /* Blocking mode for a Python socket object means that operations
2694 like :meth:`recv` or :meth:`sendall` will block the execution of
2695 the current thread until they are complete or aborted with a
2696 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2697 the underlying FD is in a blocking mode. When timeout is a positive
2698 number, the FD is in a non-blocking mode, and socket ops are
2699 implemented with a `select()` call.
2700
2701 When timeout is 0.0, the FD is in a non-blocking mode.
2702
2703 This table summarizes all states in which the socket object and
2704 its underlying FD can be:
2705
2706 ==================== ===================== ==============
2707 `gettimeout()` `getblocking()` FD
2708 ==================== ===================== ==============
2709 ``None`` ``True`` blocking
2710 ``0.0`` ``False`` non-blocking
2711 ``> 0`` ``True`` non-blocking
2712 */
2713
2714 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002715 return NULL;
2716 }
2717 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718}
2719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002721"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002723Set a timeout on socket operations. 'timeout' can be a float,\n\
2724giving in seconds, or None. Setting a timeout of None disables\n\
2725the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002728/* s.gettimeout() method.
2729 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002730static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002731sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002732{
Victor Stinner71694d52015-03-28 01:18:54 +01002733 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002734 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 }
Victor Stinner71694d52015-03-28 01:18:54 +01002736 else {
2737 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2738 return PyFloat_FromDouble(seconds);
2739 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002740}
2741
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002742PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002743"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002744\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002745Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002746operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002747operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002748
Guido van Rossumaee08791992-09-08 09:05:33 +00002749/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002750 With an integer third argument, sets an integer optval with optlen=4.
2751 With None as third argument and an integer fourth argument, set
2752 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002753 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002754 use optional built-in module 'struct' to encode the string.
2755*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002756
Guido van Rossum73624e91994-10-10 17:59:00 +00002757static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002758sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 int level;
2761 int optname;
2762 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002763 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002765 unsigned int optlen;
2766 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002767
caaveryeffc12f2017-09-06 18:18:10 -04002768#ifdef AF_VSOCK
2769 if (s->sock_family == AF_VSOCK) {
2770 uint64_t vflag; // Must be set width of 64 bits
2771 /* setsockopt(level, opt, flag) */
2772 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2773 &level, &optname, &vflag)) {
2774 // level should always be set to AF_VSOCK
2775 res = setsockopt(s->sock_fd, level, optname,
2776 (void*)&vflag, sizeof vflag);
2777 goto done;
2778 }
2779 return NULL;
2780 }
2781#endif
2782
Christian Heimesdffa3942016-09-05 23:54:41 +02002783 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 if (PyArg_ParseTuple(args, "iii:setsockopt",
2785 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002786 res = setsockopt(s->sock_fd, level, optname,
2787 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002788 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002790
2791 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002792 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002793 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2794 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2795 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002796 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002797 NULL, (socklen_t)optlen);
2798 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002800
2801 PyErr_Clear();
2802 /* setsockopt(level, opt, buffer) */
2803 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2804 &level, &optname, &optval))
2805 return NULL;
2806
2807#ifdef MS_WINDOWS
2808 if (optval.len > INT_MAX) {
2809 PyBuffer_Release(&optval);
2810 PyErr_Format(PyExc_OverflowError,
2811 "socket option is larger than %i bytes",
2812 INT_MAX);
2813 return NULL;
2814 }
2815 res = setsockopt(s->sock_fd, level, optname,
2816 optval.buf, (int)optval.len);
2817#else
2818 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2819#endif
2820 PyBuffer_Release(&optval);
2821
2822done:
Victor Stinnercc739322016-03-23 21:35:29 +01002823 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002825 }
2826
2827 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002828}
2829
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002830PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002831"setsockopt(level, option, value: int)\n\
2832setsockopt(level, option, value: buffer)\n\
2833setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002834\n\
2835Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002836The value argument can either be an integer, a string buffer, or \n\
2837None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002839
Guido van Rossumaee08791992-09-08 09:05:33 +00002840/* s.getsockopt() method.
2841 With two arguments, retrieves an integer option.
2842 With a third integer argument, retrieves a string buffer of that size;
2843 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002844
Guido van Rossum73624e91994-10-10 17:59:00 +00002845static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 int level;
2849 int optname;
2850 int res;
2851 PyObject *buf;
2852 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002853 int flag = 0;
2854 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2857 &level, &optname, &buflen))
2858 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002861#ifdef AF_VSOCK
2862 if (s->sock_family == AF_VSOCK) {
2863 uint64_t vflag = 0; // Must be set width of 64 bits
2864 flagsize = sizeof vflag;
2865 res = getsockopt(s->sock_fd, level, optname,
2866 (void *)&vflag, &flagsize);
2867 if (res < 0)
2868 return s->errorhandler();
2869 return PyLong_FromUnsignedLong(vflag);
2870 }
2871#endif
2872 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 res = getsockopt(s->sock_fd, level, optname,
2874 (void *)&flag, &flagsize);
2875 if (res < 0)
2876 return s->errorhandler();
2877 return PyLong_FromLong(flag);
2878 }
caaveryeffc12f2017-09-06 18:18:10 -04002879#ifdef AF_VSOCK
2880 if (s->sock_family == AF_VSOCK) {
2881 PyErr_SetString(PyExc_OSError,
2882 "getsockopt string buffer not allowed");
2883 return NULL;
2884 }
2885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002887 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 "getsockopt buflen out of range");
2889 return NULL;
2890 }
2891 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2892 if (buf == NULL)
2893 return NULL;
2894 res = getsockopt(s->sock_fd, level, optname,
2895 (void *)PyBytes_AS_STRING(buf), &buflen);
2896 if (res < 0) {
2897 Py_DECREF(buf);
2898 return s->errorhandler();
2899 }
2900 _PyBytes_Resize(&buf, buflen);
2901 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002902}
2903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002904PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002905"getsockopt(level, option[, buffersize]) -> value\n\
2906\n\
2907Get a socket option. See the Unix manual for level and option.\n\
2908If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002910
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002911
Fred Drake728819a2000-07-01 03:40:12 +00002912/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002913
Guido van Rossum73624e91994-10-10 17:59:00 +00002914static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002915sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 sock_addr_t addrbuf;
2918 int addrlen;
2919 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2922 return NULL;
2923 Py_BEGIN_ALLOW_THREADS
2924 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2925 Py_END_ALLOW_THREADS
2926 if (res < 0)
2927 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002928 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002929}
2930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002931PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002932"bind(address)\n\
2933\n\
2934Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002935pair (host, port); the host must refer to the local host. For raw packet\n\
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07002936sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937
Guido van Rossum30a685f1991-06-27 15:51:29 +00002938
2939/* s.close() method.
2940 Set the file descriptor to -1 so operations tried subsequently
2941 will surely fail. */
2942
Guido van Rossum73624e91994-10-10 17:59:00 +00002943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002944sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002947 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002948
Victor Stinner19a8e842016-03-21 16:36:48 +01002949 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002950 if (fd != INVALID_SOCKET) {
2951 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002952
2953 /* We do not want to retry upon EINTR: see
2954 http://lwn.net/Articles/576478/ and
2955 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2956 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002958 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002960 /* bpo-30319: The peer can already have closed the connection.
2961 Python ignores ECONNRESET on close(). */
2962 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002963 return s->errorhandler();
2964 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002966 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002967}
2968
Christian Heimesd0e31b92018-01-27 09:54:13 +01002969PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970"close()\n\
2971\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002972Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002973
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002974static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002975sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002976{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002977 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002978 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002979 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002980}
2981
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002982PyDoc_STRVAR(detach_doc,
2983"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002984\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002985Close the socket object without closing the underlying file descriptor.\n\
2986The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002987can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002988
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002989static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002990sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002991{
Victor Stinner81c41db2015-04-02 11:50:57 +02002992 int err;
2993 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002994
Victor Stinner81c41db2015-04-02 11:50:57 +02002995 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2996 /* getsockopt() failed */
2997 return 0;
2998 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002999
Victor Stinner81c41db2015-04-02 11:50:57 +02003000 if (err == EISCONN)
3001 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003002 if (err != 0) {
3003 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3004 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003005 return 0;
3006 }
3007 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003008}
3009
3010static int
3011internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3012 int raise)
3013{
3014 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003015
3016 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003018 Py_END_ALLOW_THREADS
3019
Victor Stinner70a46f62015-03-31 22:03:59 +02003020 if (!res) {
3021 /* connect() succeeded, the socket is connected */
3022 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003024
Victor Stinner81c41db2015-04-02 11:50:57 +02003025 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003026
Victor Stinner81c41db2015-04-02 11:50:57 +02003027 /* save error, PyErr_CheckSignals() can replace it */
3028 err = GET_SOCK_ERROR;
3029 if (CHECK_ERRNO(EINTR)) {
3030 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003031 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003032
3033 /* Issue #23618: when connect() fails with EINTR, the connection is
3034 running asynchronously.
3035
3036 If the socket is blocking or has a timeout, wait until the
3037 connection completes, fails or timed out using select(), and then
3038 get the connection status using getsockopt(SO_ERROR).
3039
3040 If the socket is non-blocking, raise InterruptedError. The caller is
3041 responsible to wait until the connection completes, fails or timed
3042 out (it's the case in asyncio for example). */
3043 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3044 }
3045 else {
3046 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3047 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003048 }
3049
Victor Stinner81c41db2015-04-02 11:50:57 +02003050 if (!wait_connect) {
3051 if (raise) {
3052 /* restore error, maybe replaced by PyErr_CheckSignals() */
3053 SET_SOCK_ERROR(err);
3054 s->errorhandler();
3055 return -1;
3056 }
3057 else
3058 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003059 }
3060
Victor Stinner81c41db2015-04-02 11:50:57 +02003061 if (raise) {
3062 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003063 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3064 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003065 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003066 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003067 else {
3068 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003069 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3070 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003071 return err;
3072 }
3073 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003074}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003075
Fred Drake728819a2000-07-01 03:40:12 +00003076/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003077
Guido van Rossum73624e91994-10-10 17:59:00 +00003078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003079sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 sock_addr_t addrbuf;
3082 int addrlen;
3083 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3086 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003087
Victor Stinner81c41db2015-04-02 11:50:57 +02003088 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003089 if (res < 0)
3090 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003091
Victor Stinneree699e92015-03-31 21:28:42 +02003092 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003093}
3094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003095PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096"connect(address)\n\
3097\n\
3098Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003099is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003100
Guido van Rossum30a685f1991-06-27 15:51:29 +00003101
Fred Drake728819a2000-07-01 03:40:12 +00003102/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003103
3104static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003105sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 sock_addr_t addrbuf;
3108 int addrlen;
3109 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3112 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003113
Victor Stinner81c41db2015-04-02 11:50:57 +02003114 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003115 if (res < 0)
3116 return NULL;
3117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003119}
3120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003121PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003122"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003123\n\
3124This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003127
Guido van Rossumed233a51992-06-23 09:07:03 +00003128/* s.fileno() method */
3129
Guido van Rossum73624e91994-10-10 17:59:00 +00003130static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003131sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003134}
3135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003136PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003137"fileno() -> integer\n\
3138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003139Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003140
Guido van Rossumed233a51992-06-23 09:07:03 +00003141
Guido van Rossumc89705d1992-11-26 08:54:07 +00003142/* s.getsockname() method */
3143
Guido van Rossum73624e91994-10-10 17:59:00 +00003144static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003145sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 sock_addr_t addrbuf;
3148 int res;
3149 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 if (!getsockaddrlen(s, &addrlen))
3152 return NULL;
3153 memset(&addrbuf, 0, addrlen);
3154 Py_BEGIN_ALLOW_THREADS
3155 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3156 Py_END_ALLOW_THREADS
3157 if (res < 0)
3158 return s->errorhandler();
3159 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3160 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003161}
3162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003163PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003164"getsockname() -> address info\n\
3165\n\
3166Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003167info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003168
Guido van Rossumc89705d1992-11-26 08:54:07 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003171/* s.getpeername() method */
3172
Guido van Rossum73624e91994-10-10 17:59:00 +00003173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003174sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 sock_addr_t addrbuf;
3177 int res;
3178 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 if (!getsockaddrlen(s, &addrlen))
3181 return NULL;
3182 memset(&addrbuf, 0, addrlen);
3183 Py_BEGIN_ALLOW_THREADS
3184 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3185 Py_END_ALLOW_THREADS
3186 if (res < 0)
3187 return s->errorhandler();
3188 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3189 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003190}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003192PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003193"getpeername() -> address info\n\
3194\n\
3195Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003196info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003197
Guido van Rossumb6775db1994-08-01 11:34:53 +00003198#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003199
3200
Guido van Rossum30a685f1991-06-27 15:51:29 +00003201/* s.listen(n) method */
3202
Guido van Rossum73624e91994-10-10 17:59:00 +00003203static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003204sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003205{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003206 /* We try to choose a default backlog high enough to avoid connection drops
3207 * for common workloads, yet not too high to limit resource usage. */
3208 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003210
Charles-François Natali644b8f52014-05-22 19:45:39 +01003211 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003215 /* To avoid problems on systems that don't allow a negative backlog
3216 * (which doesn't make sense anyway) we force a minimum value of 0. */
3217 if (backlog < 0)
3218 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 res = listen(s->sock_fd, backlog);
3220 Py_END_ALLOW_THREADS
3221 if (res < 0)
3222 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003223 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003224}
3225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003226PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003227"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003228\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003229Enable a server to accept connections. If backlog is specified, it must be\n\
3230at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003231unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003232connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003233
Victor Stinner31bf2d52015-04-01 21:57:09 +02003234struct sock_recv {
3235 char *cbuf;
3236 Py_ssize_t len;
3237 int flags;
3238 Py_ssize_t result;
3239};
3240
3241static int
3242sock_recv_impl(PySocketSockObject *s, void *data)
3243{
3244 struct sock_recv *ctx = data;
3245
3246#ifdef MS_WINDOWS
3247 if (ctx->len > INT_MAX)
3248 ctx->len = INT_MAX;
3249 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3250#else
3251 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3252#endif
3253 return (ctx->result >= 0);
3254}
3255
Guido van Rossum82a5c661998-07-07 20:45:43 +00003256
Thomas Wouters477c8d52006-05-27 19:21:47 +00003257/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003258 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003259 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003260 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003261 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003262 * also possible that we return a number of bytes smaller than the request
3263 * bytes.
3264 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003265
Antoine Pitrou19467d22010-08-17 19:33:30 +00003266static Py_ssize_t
3267sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003268{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003269 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 if (!IS_SELECTABLE(s)) {
3272 select_error();
3273 return -1;
3274 }
3275 if (len == 0) {
3276 /* If 0 bytes were requested, do nothing. */
3277 return 0;
3278 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003279
Victor Stinner31bf2d52015-04-01 21:57:09 +02003280 ctx.cbuf = cbuf;
3281 ctx.len = len;
3282 ctx.flags = flags;
3283 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003285
3286 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003287}
3288
Guido van Rossum48a680c2001-03-02 06:34:14 +00003289
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003290/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003291
Guido van Rossum73624e91994-10-10 17:59:00 +00003292static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003293sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003294{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003295 Py_ssize_t recvlen, outlen;
3296 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003298
Antoine Pitrou19467d22010-08-17 19:33:30 +00003299 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 if (recvlen < 0) {
3303 PyErr_SetString(PyExc_ValueError,
3304 "negative buffersize in recv");
3305 return NULL;
3306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 /* Allocate a new string. */
3309 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3310 if (buf == NULL)
3311 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 /* Call the guts */
3314 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3315 if (outlen < 0) {
3316 /* An error occurred, release the string and return an
3317 error. */
3318 Py_DECREF(buf);
3319 return NULL;
3320 }
3321 if (outlen != recvlen) {
3322 /* We did not read as many bytes as we anticipated, resize the
3323 string if possible and be successful. */
3324 _PyBytes_Resize(&buf, outlen);
3325 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003328}
3329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003330PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003331"recv(buffersize[, flags]) -> data\n\
3332\n\
3333Receive up to buffersize bytes from the socket. For the optional flags\n\
3334argument, see the Unix manual. When no data is available, block until\n\
3335at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003336the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003337
Guido van Rossum30a685f1991-06-27 15:51:29 +00003338
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003339/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003340
Thomas Wouters477c8d52006-05-27 19:21:47 +00003341static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003342sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003345
Antoine Pitrou19467d22010-08-17 19:33:30 +00003346 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 Py_buffer pbuf;
3348 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003349 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003352 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 &pbuf, &recvlen, &flags))
3354 return NULL;
3355 buf = pbuf.buf;
3356 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 if (recvlen < 0) {
3359 PyBuffer_Release(&pbuf);
3360 PyErr_SetString(PyExc_ValueError,
3361 "negative buffersize in recv_into");
3362 return NULL;
3363 }
3364 if (recvlen == 0) {
3365 /* If nbytes was not specified, use the buffer's length */
3366 recvlen = buflen;
3367 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 /* Check if the buffer is large enough */
3370 if (buflen < recvlen) {
3371 PyBuffer_Release(&pbuf);
3372 PyErr_SetString(PyExc_ValueError,
3373 "buffer too small for requested bytes");
3374 return NULL;
3375 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 /* Call the guts */
3378 readlen = sock_recv_guts(s, buf, recvlen, flags);
3379 if (readlen < 0) {
3380 /* Return an error. */
3381 PyBuffer_Release(&pbuf);
3382 return NULL;
3383 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 PyBuffer_Release(&pbuf);
3386 /* Return the number of bytes read. Note that we do not do anything
3387 special here in the case that readlen < recvlen. */
3388 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003389}
3390
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003391PyDoc_STRVAR(recv_into_doc,
3392"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003393\n\
3394A version of recv() that stores its data into a buffer rather than creating \n\
3395a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3396is not specified (or 0), receive up to the size available in the given buffer.\n\
3397\n\
3398See recv() for documentation about the flags.");
3399
Victor Stinner31bf2d52015-04-01 21:57:09 +02003400struct sock_recvfrom {
3401 char* cbuf;
3402 Py_ssize_t len;
3403 int flags;
3404 socklen_t *addrlen;
3405 sock_addr_t *addrbuf;
3406 Py_ssize_t result;
3407};
3408
3409static int
3410sock_recvfrom_impl(PySocketSockObject *s, void *data)
3411{
3412 struct sock_recvfrom *ctx = data;
3413
3414 memset(ctx->addrbuf, 0, *ctx->addrlen);
3415
3416#ifdef MS_WINDOWS
3417 if (ctx->len > INT_MAX)
3418 ctx->len = INT_MAX;
3419 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3420 SAS2SA(ctx->addrbuf), ctx->addrlen);
3421#else
3422 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3423 SAS2SA(ctx->addrbuf), ctx->addrlen);
3424#endif
3425 return (ctx->result >= 0);
3426}
3427
Thomas Wouters477c8d52006-05-27 19:21:47 +00003428
3429/*
Christian Heimes99170a52007-12-19 02:07:34 +00003430 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3431 * into a char buffer. If you have any inc/def ref to do to the objects that
3432 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003433 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003434 * that it is also possible that we return a number of bytes smaller than the
3435 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003436 *
3437 * 'addr' is a return value for the address object. Note that you must decref
3438 * it yourself.
3439 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003440static Py_ssize_t
3441sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003446 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 if (!getsockaddrlen(s, &addrlen))
3451 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 if (!IS_SELECTABLE(s)) {
3454 select_error();
3455 return -1;
3456 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003457
Victor Stinner31bf2d52015-04-01 21:57:09 +02003458 ctx.cbuf = cbuf;
3459 ctx.len = len;
3460 ctx.flags = flags;
3461 ctx.addrbuf = &addrbuf;
3462 ctx.addrlen = &addrlen;
3463 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003465
Victor Stinner31bf2d52015-04-01 21:57:09 +02003466 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3467 s->sock_proto);
3468 if (*addr == NULL)
3469 return -1;
3470
3471 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003472}
3473
3474/* s.recvfrom(nbytes [,flags]) method */
3475
3476static PyObject *
3477sock_recvfrom(PySocketSockObject *s, PyObject *args)
3478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 PyObject *buf = NULL;
3480 PyObject *addr = NULL;
3481 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003482 int flags = 0;
3483 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003484
Antoine Pitrou19467d22010-08-17 19:33:30 +00003485 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 if (recvlen < 0) {
3489 PyErr_SetString(PyExc_ValueError,
3490 "negative buffersize in recvfrom");
3491 return NULL;
3492 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3495 if (buf == NULL)
3496 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3499 recvlen, flags, &addr);
3500 if (outlen < 0) {
3501 goto finally;
3502 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 if (outlen != recvlen) {
3505 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003506 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003508 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 goto finally;
3510 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003513
3514finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 Py_XDECREF(buf);
3516 Py_XDECREF(addr);
3517 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003518}
3519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003521"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3522\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003523Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003524
Thomas Wouters477c8d52006-05-27 19:21:47 +00003525
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003526/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003527
3528static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003529sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003532
Antoine Pitrou19467d22010-08-17 19:33:30 +00003533 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 Py_buffer pbuf;
3535 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003536 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003539
Antoine Pitrou19467d22010-08-17 19:33:30 +00003540 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 kwlist, &pbuf,
3542 &recvlen, &flags))
3543 return NULL;
3544 buf = pbuf.buf;
3545 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 if (recvlen < 0) {
3548 PyBuffer_Release(&pbuf);
3549 PyErr_SetString(PyExc_ValueError,
3550 "negative buffersize in recvfrom_into");
3551 return NULL;
3552 }
3553 if (recvlen == 0) {
3554 /* If nbytes was not specified, use the buffer's length */
3555 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003556 } else if (recvlen > buflen) {
3557 PyBuffer_Release(&pbuf);
3558 PyErr_SetString(PyExc_ValueError,
3559 "nbytes is greater than the length of the buffer");
3560 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3564 if (readlen < 0) {
3565 PyBuffer_Release(&pbuf);
3566 /* Return an error */
3567 Py_XDECREF(addr);
3568 return NULL;
3569 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 PyBuffer_Release(&pbuf);
3572 /* Return the number of bytes read and the address. Note that we do
3573 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003574 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575}
3576
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003577PyDoc_STRVAR(recvfrom_into_doc,
3578"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003579\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003580Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003581
Victor Stinner35bee932015-04-02 12:28:07 +02003582/* The sendmsg() and recvmsg[_into]() methods require a working
3583 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3584#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003585struct sock_recvmsg {
3586 struct msghdr *msg;
3587 int flags;
3588 ssize_t result;
3589};
3590
3591static int
3592sock_recvmsg_impl(PySocketSockObject *s, void *data)
3593{
3594 struct sock_recvmsg *ctx = data;
3595
3596 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3597 return (ctx->result >= 0);
3598}
3599
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003600/*
3601 * Call recvmsg() with the supplied iovec structures, flags, and
3602 * ancillary data buffer size (controllen). Returns the tuple return
3603 * value for recvmsg() or recvmsg_into(), with the first item provided
3604 * by the supplied makeval() function. makeval() will be called with
3605 * the length read and makeval_data as arguments, and must return a
3606 * new reference (which will be decrefed if there is a subsequent
3607 * error). On error, closes any file descriptors received via
3608 * SCM_RIGHTS.
3609 */
3610static PyObject *
3611sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3612 int flags, Py_ssize_t controllen,
3613 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3614{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 sock_addr_t addrbuf;
3616 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003617 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 PyObject *cmsg_list = NULL, *retval = NULL;
3619 void *controlbuf = NULL;
3620 struct cmsghdr *cmsgh;
3621 size_t cmsgdatalen = 0;
3622 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003623 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003624
3625 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3626 ignored" when the socket is connected (Linux fills them in
3627 anyway for AF_UNIX sockets at least). Normally msg_namelen
3628 seems to be set to 0 if there's no address, but try to
3629 initialize msg_name to something that won't be mistaken for a
3630 real address if that doesn't happen. */
3631 if (!getsockaddrlen(s, &addrbuflen))
3632 return NULL;
3633 memset(&addrbuf, 0, addrbuflen);
3634 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3635
3636 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3637 PyErr_SetString(PyExc_ValueError,
3638 "invalid ancillary data buffer length");
3639 return NULL;
3640 }
3641 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3642 return PyErr_NoMemory();
3643
3644 /* Make the system call. */
3645 if (!IS_SELECTABLE(s)) {
3646 select_error();
3647 goto finally;
3648 }
3649
Victor Stinner31bf2d52015-04-01 21:57:09 +02003650 msg.msg_name = SAS2SA(&addrbuf);
3651 msg.msg_namelen = addrbuflen;
3652 msg.msg_iov = iov;
3653 msg.msg_iovlen = iovlen;
3654 msg.msg_control = controlbuf;
3655 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003656
Victor Stinner31bf2d52015-04-01 21:57:09 +02003657 ctx.msg = &msg;
3658 ctx.flags = flags;
3659 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003660 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003661
3662 /* Make list of (level, type, data) tuples from control messages. */
3663 if ((cmsg_list = PyList_New(0)) == NULL)
3664 goto err_closefds;
3665 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3666 implementations didn't do so. */
3667 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3668 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3669 PyObject *bytes, *tuple;
3670 int tmp;
3671
3672 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3673 if (cmsg_status != 0) {
3674 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3675 "received malformed or improperly-truncated "
3676 "ancillary data", 1) == -1)
3677 goto err_closefds;
3678 }
3679 if (cmsg_status < 0)
3680 break;
3681 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003682 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003683 goto err_closefds;
3684 }
3685
3686 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3687 cmsgdatalen);
3688 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3689 (int)cmsgh->cmsg_type, bytes);
3690 if (tuple == NULL)
3691 goto err_closefds;
3692 tmp = PyList_Append(cmsg_list, tuple);
3693 Py_DECREF(tuple);
3694 if (tmp != 0)
3695 goto err_closefds;
3696
3697 if (cmsg_status != 0)
3698 break;
3699 }
3700
3701 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003702 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003703 cmsg_list,
3704 (int)msg.msg_flags,
3705 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3706 ((msg.msg_namelen > addrbuflen) ?
3707 addrbuflen : msg.msg_namelen),
3708 s->sock_proto));
3709 if (retval == NULL)
3710 goto err_closefds;
3711
3712finally:
3713 Py_XDECREF(cmsg_list);
3714 PyMem_Free(controlbuf);
3715 return retval;
3716
3717err_closefds:
3718#ifdef SCM_RIGHTS
3719 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3720 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3721 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3722 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3723 if (cmsg_status < 0)
3724 break;
3725 if (cmsgh->cmsg_level == SOL_SOCKET &&
3726 cmsgh->cmsg_type == SCM_RIGHTS) {
3727 size_t numfds;
3728 int *fdp;
3729
3730 numfds = cmsgdatalen / sizeof(int);
3731 fdp = (int *)CMSG_DATA(cmsgh);
3732 while (numfds-- > 0)
3733 close(*fdp++);
3734 }
3735 if (cmsg_status != 0)
3736 break;
3737 }
3738#endif /* SCM_RIGHTS */
3739 goto finally;
3740}
3741
3742
3743static PyObject *
3744makeval_recvmsg(ssize_t received, void *data)
3745{
3746 PyObject **buf = data;
3747
3748 if (received < PyBytes_GET_SIZE(*buf))
3749 _PyBytes_Resize(buf, received);
3750 Py_XINCREF(*buf);
3751 return *buf;
3752}
3753
3754/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3755
3756static PyObject *
3757sock_recvmsg(PySocketSockObject *s, PyObject *args)
3758{
3759 Py_ssize_t bufsize, ancbufsize = 0;
3760 int flags = 0;
3761 struct iovec iov;
3762 PyObject *buf = NULL, *retval = NULL;
3763
3764 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3765 return NULL;
3766
3767 if (bufsize < 0) {
3768 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3769 return NULL;
3770 }
3771 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3772 return NULL;
3773 iov.iov_base = PyBytes_AS_STRING(buf);
3774 iov.iov_len = bufsize;
3775
3776 /* Note that we're passing a pointer to *our pointer* to the bytes
3777 object here (&buf); makeval_recvmsg() may incref the object, or
3778 deallocate it and set our pointer to NULL. */
3779 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3780 &makeval_recvmsg, &buf);
3781 Py_XDECREF(buf);
3782 return retval;
3783}
3784
3785PyDoc_STRVAR(recvmsg_doc,
3786"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3787\n\
3788Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3789socket. The ancbufsize argument sets the size in bytes of the\n\
3790internal buffer used to receive the ancillary data; it defaults to 0,\n\
3791meaning that no ancillary data will be received. Appropriate buffer\n\
3792sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3793CMSG_LEN(), and items which do not fit into the buffer might be\n\
3794truncated or discarded. The flags argument defaults to 0 and has the\n\
3795same meaning as for recv().\n\
3796\n\
3797The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3798The data item is a bytes object holding the non-ancillary data\n\
3799received. The ancdata item is a list of zero or more tuples\n\
3800(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3801(control messages) received: cmsg_level and cmsg_type are integers\n\
3802specifying the protocol level and protocol-specific type respectively,\n\
3803and cmsg_data is a bytes object holding the associated data. The\n\
3804msg_flags item is the bitwise OR of various flags indicating\n\
3805conditions on the received message; see your system documentation for\n\
3806details. If the receiving socket is unconnected, address is the\n\
3807address of the sending socket, if available; otherwise, its value is\n\
3808unspecified.\n\
3809\n\
3810If recvmsg() raises an exception after the system call returns, it\n\
3811will first attempt to close any file descriptors received via the\n\
3812SCM_RIGHTS mechanism.");
3813
3814
3815static PyObject *
3816makeval_recvmsg_into(ssize_t received, void *data)
3817{
3818 return PyLong_FromSsize_t(received);
3819}
3820
3821/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3822
3823static PyObject *
3824sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3825{
3826 Py_ssize_t ancbufsize = 0;
3827 int flags = 0;
3828 struct iovec *iovs = NULL;
3829 Py_ssize_t i, nitems, nbufs = 0;
3830 Py_buffer *bufs = NULL;
3831 PyObject *buffers_arg, *fast, *retval = NULL;
3832
3833 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3834 &buffers_arg, &ancbufsize, &flags))
3835 return NULL;
3836
3837 if ((fast = PySequence_Fast(buffers_arg,
3838 "recvmsg_into() argument 1 must be an "
3839 "iterable")) == NULL)
3840 return NULL;
3841 nitems = PySequence_Fast_GET_SIZE(fast);
3842 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003843 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003844 goto finally;
3845 }
3846
3847 /* Fill in an iovec for each item, and save the Py_buffer
3848 structs to release afterwards. */
3849 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3850 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3851 PyErr_NoMemory();
3852 goto finally;
3853 }
3854 for (; nbufs < nitems; nbufs++) {
3855 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3856 "w*;recvmsg_into() argument 1 must be an iterable "
3857 "of single-segment read-write buffers",
3858 &bufs[nbufs]))
3859 goto finally;
3860 iovs[nbufs].iov_base = bufs[nbufs].buf;
3861 iovs[nbufs].iov_len = bufs[nbufs].len;
3862 }
3863
3864 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3865 &makeval_recvmsg_into, NULL);
3866finally:
3867 for (i = 0; i < nbufs; i++)
3868 PyBuffer_Release(&bufs[i]);
3869 PyMem_Free(bufs);
3870 PyMem_Free(iovs);
3871 Py_DECREF(fast);
3872 return retval;
3873}
3874
3875PyDoc_STRVAR(recvmsg_into_doc,
3876"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3877\n\
3878Receive normal data and ancillary data from the socket, scattering the\n\
3879non-ancillary data into a series of buffers. The buffers argument\n\
3880must be an iterable of objects that export writable buffers\n\
3881(e.g. bytearray objects); these will be filled with successive chunks\n\
3882of the non-ancillary data until it has all been written or there are\n\
3883no more buffers. The ancbufsize argument sets the size in bytes of\n\
3884the internal buffer used to receive the ancillary data; it defaults to\n\
38850, meaning that no ancillary data will be received. Appropriate\n\
3886buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3887or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3888truncated or discarded. The flags argument defaults to 0 and has the\n\
3889same meaning as for recv().\n\
3890\n\
3891The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3892The nbytes item is the total number of bytes of non-ancillary data\n\
3893written into the buffers. The ancdata item is a list of zero or more\n\
3894tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3895data (control messages) received: cmsg_level and cmsg_type are\n\
3896integers specifying the protocol level and protocol-specific type\n\
3897respectively, and cmsg_data is a bytes object holding the associated\n\
3898data. The msg_flags item is the bitwise OR of various flags\n\
3899indicating conditions on the received message; see your system\n\
3900documentation for details. If the receiving socket is unconnected,\n\
3901address is the address of the sending socket, if available; otherwise,\n\
3902its value is unspecified.\n\
3903\n\
3904If recvmsg_into() raises an exception after the system call returns,\n\
3905it will first attempt to close any file descriptors received via the\n\
3906SCM_RIGHTS mechanism.");
3907#endif /* CMSG_LEN */
3908
3909
Victor Stinner31bf2d52015-04-01 21:57:09 +02003910struct sock_send {
3911 char *buf;
3912 Py_ssize_t len;
3913 int flags;
3914 Py_ssize_t result;
3915};
3916
3917static int
3918sock_send_impl(PySocketSockObject *s, void *data)
3919{
3920 struct sock_send *ctx = data;
3921
3922#ifdef MS_WINDOWS
3923 if (ctx->len > INT_MAX)
3924 ctx->len = INT_MAX;
3925 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3926#else
3927 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3928#endif
3929 return (ctx->result >= 0);
3930}
3931
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003932/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003933
Guido van Rossum73624e91994-10-10 17:59:00 +00003934static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003935sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003936{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003937 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003939 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3942 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 if (!IS_SELECTABLE(s)) {
3945 PyBuffer_Release(&pbuf);
3946 return select_error();
3947 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003948 ctx.buf = pbuf.buf;
3949 ctx.len = pbuf.len;
3950 ctx.flags = flags;
3951 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003952 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 return NULL;
3954 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003955 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003956
3957 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003958}
3959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003960PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003961"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003962\n\
3963Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003964argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003965sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003966
3967
3968/* s.sendall(data [,flags]) method */
3969
3970static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003971sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003974 Py_ssize_t len, n;
3975 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003977 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003978 int has_timeout = (s->sock_timeout > 0);
3979 _PyTime_t interval = s->sock_timeout;
3980 _PyTime_t deadline = 0;
3981 int deadline_initialized = 0;
3982 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003984 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3985 return NULL;
3986 buf = pbuf.buf;
3987 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 if (!IS_SELECTABLE(s)) {
3990 PyBuffer_Release(&pbuf);
3991 return select_error();
3992 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003995 if (has_timeout) {
3996 if (deadline_initialized) {
3997 /* recompute the timeout */
3998 interval = deadline - _PyTime_GetMonotonicClock();
3999 }
4000 else {
4001 deadline_initialized = 1;
4002 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4003 }
4004
4005 if (interval <= 0) {
4006 PyErr_SetString(socket_timeout, "timed out");
4007 goto done;
4008 }
4009 }
4010
Victor Stinner02f32ab2015-04-01 22:53:26 +02004011 ctx.buf = buf;
4012 ctx.len = len;
4013 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004014 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4015 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004016 n = ctx.result;
4017 assert(n >= 0);
4018
4019 buf += n;
4020 len -= n;
4021
4022 /* We must run our signal handlers before looping again.
4023 send() can return a successful partial write when it is
4024 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004025 if (PyErr_CheckSignals())
4026 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004027 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004029
Victor Stinner8912d142015-04-06 23:16:34 +02004030 Py_INCREF(Py_None);
4031 res = Py_None;
4032
4033done:
4034 PyBuffer_Release(&pbuf);
4035 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004036}
4037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004038PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004039"sendall(data[, flags])\n\
4040\n\
4041Send a data string to the socket. For the optional flags\n\
4042argument, see the Unix manual. This calls send() repeatedly\n\
4043until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004044to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004045
Guido van Rossum30a685f1991-06-27 15:51:29 +00004046
Victor Stinner31bf2d52015-04-01 21:57:09 +02004047struct sock_sendto {
4048 char *buf;
4049 Py_ssize_t len;
4050 int flags;
4051 int addrlen;
4052 sock_addr_t *addrbuf;
4053 Py_ssize_t result;
4054};
4055
4056static int
4057sock_sendto_impl(PySocketSockObject *s, void *data)
4058{
4059 struct sock_sendto *ctx = data;
4060
4061#ifdef MS_WINDOWS
4062 if (ctx->len > INT_MAX)
4063 ctx->len = INT_MAX;
4064 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4065 SAS2SA(ctx->addrbuf), ctx->addrlen);
4066#else
4067 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4068 SAS2SA(ctx->addrbuf), ctx->addrlen);
4069#endif
4070 return (ctx->result >= 0);
4071}
4072
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004073/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004074
Guido van Rossum73624e91994-10-10 17:59:00 +00004075static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004076sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 Py_buffer pbuf;
4079 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004080 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004082 int addrlen, flags;
4083 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004086 arglen = PyTuple_Size(args);
4087 switch (arglen) {
4088 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004089 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4090 return NULL;
4091 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004092 break;
4093 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004094 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4095 &pbuf, &flags, &addro)) {
4096 return NULL;
4097 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004098 break;
4099 default:
4100 PyErr_Format(PyExc_TypeError,
4101 "sendto() takes 2 or 3 arguments (%d given)",
4102 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004103 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 if (!IS_SELECTABLE(s)) {
4107 PyBuffer_Release(&pbuf);
4108 return select_error();
4109 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4112 PyBuffer_Release(&pbuf);
4113 return NULL;
4114 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004115
Victor Stinner31bf2d52015-04-01 21:57:09 +02004116 ctx.buf = pbuf.buf;
4117 ctx.len = pbuf.len;
4118 ctx.flags = flags;
4119 ctx.addrlen = addrlen;
4120 ctx.addrbuf = &addrbuf;
4121 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004122 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 return NULL;
4124 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004125 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004126
4127 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004128}
4129
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004130PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004131"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004132\n\
4133Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004134For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004135
Guido van Rossum30a685f1991-06-27 15:51:29 +00004136
Victor Stinner35bee932015-04-02 12:28:07 +02004137/* The sendmsg() and recvmsg[_into]() methods require a working
4138 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4139#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004140struct sock_sendmsg {
4141 struct msghdr *msg;
4142 int flags;
4143 ssize_t result;
4144};
4145
4146static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004147sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4148 struct msghdr *msg,
4149 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4150 Py_ssize_t ndataparts, ndatabufs = 0;
4151 int result = -1;
4152 struct iovec *iovs = NULL;
4153 PyObject *data_fast = NULL;
4154 Py_buffer *databufs = NULL;
4155
4156 /* Fill in an iovec for each message part, and save the Py_buffer
4157 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004158 data_fast = PySequence_Fast(data_arg,
4159 "sendmsg() argument 1 must be an "
4160 "iterable");
4161 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004162 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004163 }
4164
Christian Heimesdffa3942016-09-05 23:54:41 +02004165 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4166 if (ndataparts > INT_MAX) {
4167 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4168 goto finally;
4169 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004170
Christian Heimesdffa3942016-09-05 23:54:41 +02004171 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004172 if (ndataparts > 0) {
4173 iovs = PyMem_New(struct iovec, ndataparts);
4174 if (iovs == NULL) {
4175 PyErr_NoMemory();
4176 goto finally;
4177 }
4178 msg->msg_iov = iovs;
4179
4180 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004181 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004182 PyErr_NoMemory();
4183 goto finally;
4184 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004185 }
4186 for (; ndatabufs < ndataparts; ndatabufs++) {
4187 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4188 "y*;sendmsg() argument 1 must be an iterable of "
4189 "bytes-like objects",
4190 &databufs[ndatabufs]))
4191 goto finally;
4192 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4193 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4194 }
4195 result = 0;
4196 finally:
4197 *databufsout = databufs;
4198 *ndatabufsout = ndatabufs;
4199 Py_XDECREF(data_fast);
4200 return result;
4201}
4202
4203static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004204sock_sendmsg_impl(PySocketSockObject *s, void *data)
4205{
4206 struct sock_sendmsg *ctx = data;
4207
4208 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4209 return (ctx->result >= 0);
4210}
4211
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004212/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4213
4214static PyObject *
4215sock_sendmsg(PySocketSockObject *s, PyObject *args)
4216{
Christian Heimesdffa3942016-09-05 23:54:41 +02004217 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004218 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004219 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004220 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221 struct cmsginfo {
4222 int level;
4223 int type;
4224 Py_buffer data;
4225 } *cmsgs = NULL;
4226 void *controlbuf = NULL;
4227 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004228 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004229 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004230 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004231 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232
4233 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004234 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004235 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004236 }
4237
4238 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240 /* Parse destination address. */
4241 if (addr_arg != NULL && addr_arg != Py_None) {
4242 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4243 goto finally;
4244 msg.msg_name = &addrbuf;
4245 msg.msg_namelen = addrlen;
4246 }
4247
4248 /* Fill in an iovec for each message part, and save the Py_buffer
4249 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004250 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004251 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004252 }
4253
4254 if (cmsg_arg == NULL)
4255 ncmsgs = 0;
4256 else {
4257 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4258 "sendmsg() argument 2 must be an "
4259 "iterable")) == NULL)
4260 goto finally;
4261 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4262 }
4263
4264#ifndef CMSG_SPACE
4265 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004266 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004267 "sending multiple control messages is not supported "
4268 "on this system");
4269 goto finally;
4270 }
4271#endif
4272 /* Save level, type and Py_buffer for each control message,
4273 and calculate total size. */
4274 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4275 PyErr_NoMemory();
4276 goto finally;
4277 }
4278 controllen = controllen_last = 0;
4279 while (ncmsgbufs < ncmsgs) {
4280 size_t bufsize, space;
4281
4282 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4283 "(iiy*):[sendmsg() ancillary data items]",
4284 &cmsgs[ncmsgbufs].level,
4285 &cmsgs[ncmsgbufs].type,
4286 &cmsgs[ncmsgbufs].data))
4287 goto finally;
4288 bufsize = cmsgs[ncmsgbufs++].data.len;
4289
4290#ifdef CMSG_SPACE
4291 if (!get_CMSG_SPACE(bufsize, &space)) {
4292#else
4293 if (!get_CMSG_LEN(bufsize, &space)) {
4294#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004295 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004296 goto finally;
4297 }
4298 controllen += space;
4299 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004300 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004301 goto finally;
4302 }
4303 controllen_last = controllen;
4304 }
4305
4306 /* Construct ancillary data block from control message info. */
4307 if (ncmsgbufs > 0) {
4308 struct cmsghdr *cmsgh = NULL;
4309
Victor Stinner52d61e42016-09-12 11:41:58 +02004310 controlbuf = PyMem_Malloc(controllen);
4311 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004312 PyErr_NoMemory();
4313 goto finally;
4314 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004315 msg.msg_control = controlbuf;
4316
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004317 msg.msg_controllen = controllen;
4318
4319 /* Need to zero out the buffer as a workaround for glibc's
4320 CMSG_NXTHDR() implementation. After getting the pointer to
4321 the next header, it checks its (uninitialized) cmsg_len
4322 member to see if the "message" fits in the buffer, and
4323 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004324 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004325 memset(controlbuf, 0, controllen);
4326
4327 for (i = 0; i < ncmsgbufs; i++) {
4328 size_t msg_len, data_len = cmsgs[i].data.len;
4329 int enough_space = 0;
4330
4331 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4332 if (cmsgh == NULL) {
4333 PyErr_Format(PyExc_RuntimeError,
4334 "unexpected NULL result from %s()",
4335 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4336 goto finally;
4337 }
4338 if (!get_CMSG_LEN(data_len, &msg_len)) {
4339 PyErr_SetString(PyExc_RuntimeError,
4340 "item size out of range for CMSG_LEN()");
4341 goto finally;
4342 }
4343 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4344 size_t space;
4345
4346 cmsgh->cmsg_len = msg_len;
4347 if (get_cmsg_data_space(&msg, cmsgh, &space))
4348 enough_space = (space >= data_len);
4349 }
4350 if (!enough_space) {
4351 PyErr_SetString(PyExc_RuntimeError,
4352 "ancillary data does not fit in calculated "
4353 "space");
4354 goto finally;
4355 }
4356 cmsgh->cmsg_level = cmsgs[i].level;
4357 cmsgh->cmsg_type = cmsgs[i].type;
4358 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4359 }
4360 }
4361
4362 /* Make the system call. */
4363 if (!IS_SELECTABLE(s)) {
4364 select_error();
4365 goto finally;
4366 }
4367
Victor Stinner31bf2d52015-04-01 21:57:09 +02004368 ctx.msg = &msg;
4369 ctx.flags = flags;
4370 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004372
4373 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004374
4375finally:
4376 PyMem_Free(controlbuf);
4377 for (i = 0; i < ncmsgbufs; i++)
4378 PyBuffer_Release(&cmsgs[i].data);
4379 PyMem_Free(cmsgs);
4380 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004381 PyMem_Free(msg.msg_iov);
4382 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004383 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004384 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004385 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004386 return retval;
4387}
4388
4389PyDoc_STRVAR(sendmsg_doc,
4390"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4391\n\
4392Send normal and ancillary data to the socket, gathering the\n\
4393non-ancillary data from a series of buffers and concatenating it into\n\
4394a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004395data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004396The ancdata argument specifies the ancillary data (control messages)\n\
4397as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4398cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4399protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004400is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004401argument defaults to 0 and has the same meaning as for send(). If\n\
4402address is supplied and not None, it sets a destination address for\n\
4403the message. The return value is the number of bytes of non-ancillary\n\
4404data sent.");
4405#endif /* CMSG_LEN */
4406
Christian Heimesdffa3942016-09-05 23:54:41 +02004407#ifdef HAVE_SOCKADDR_ALG
4408static PyObject*
4409sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4410{
4411 PyObject *retval = NULL;
4412
4413 Py_ssize_t i, ndatabufs = 0;
4414 Py_buffer *databufs = NULL;
4415 PyObject *data_arg = NULL;
4416
4417 Py_buffer iv = {NULL, NULL};
4418
4419 PyObject *opobj = NULL;
4420 int op = -1;
4421
4422 PyObject *assoclenobj = NULL;
4423 int assoclen = -1;
4424
4425 unsigned int *uiptr;
4426 int flags = 0;
4427
4428 struct msghdr msg;
4429 struct cmsghdr *header = NULL;
4430 struct af_alg_iv *alg_iv = NULL;
4431 struct sock_sendmsg ctx;
4432 Py_ssize_t controllen;
4433 void *controlbuf = NULL;
4434 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4435
4436 if (self->sock_family != AF_ALG) {
4437 PyErr_SetString(PyExc_OSError,
4438 "algset is only supported for AF_ALG");
4439 return NULL;
4440 }
4441
4442 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4443 "|O$O!y*O!i:sendmsg_afalg", keywords,
4444 &data_arg,
4445 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004446 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004447 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004448 }
4449
4450 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004451
4452 /* op is a required, keyword-only argument >= 0 */
4453 if (opobj != NULL) {
4454 op = _PyLong_AsInt(opobj);
4455 }
4456 if (op < 0) {
4457 /* override exception from _PyLong_AsInt() */
4458 PyErr_SetString(PyExc_TypeError,
4459 "Invalid or missing argument 'op'");
4460 goto finally;
4461 }
4462 /* assoclen is optional but must be >= 0 */
4463 if (assoclenobj != NULL) {
4464 assoclen = _PyLong_AsInt(assoclenobj);
4465 if (assoclen == -1 && PyErr_Occurred()) {
4466 goto finally;
4467 }
4468 if (assoclen < 0) {
4469 PyErr_SetString(PyExc_TypeError,
4470 "assoclen must be positive");
4471 goto finally;
4472 }
4473 }
4474
4475 controllen = CMSG_SPACE(4);
4476 if (iv.buf != NULL) {
4477 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4478 }
4479 if (assoclen >= 0) {
4480 controllen += CMSG_SPACE(4);
4481 }
4482
4483 controlbuf = PyMem_Malloc(controllen);
4484 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004485 PyErr_NoMemory();
4486 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004487 }
4488 memset(controlbuf, 0, controllen);
4489
Christian Heimesdffa3942016-09-05 23:54:41 +02004490 msg.msg_controllen = controllen;
4491 msg.msg_control = controlbuf;
4492
4493 /* Fill in an iovec for each message part, and save the Py_buffer
4494 structs to release afterwards. */
4495 if (data_arg != NULL) {
4496 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4497 goto finally;
4498 }
4499 }
4500
4501 /* set operation to encrypt or decrypt */
4502 header = CMSG_FIRSTHDR(&msg);
4503 if (header == NULL) {
4504 PyErr_SetString(PyExc_RuntimeError,
4505 "unexpected NULL result from CMSG_FIRSTHDR");
4506 goto finally;
4507 }
4508 header->cmsg_level = SOL_ALG;
4509 header->cmsg_type = ALG_SET_OP;
4510 header->cmsg_len = CMSG_LEN(4);
4511 uiptr = (void*)CMSG_DATA(header);
4512 *uiptr = (unsigned int)op;
4513
4514 /* set initialization vector */
4515 if (iv.buf != NULL) {
4516 header = CMSG_NXTHDR(&msg, header);
4517 if (header == NULL) {
4518 PyErr_SetString(PyExc_RuntimeError,
4519 "unexpected NULL result from CMSG_NXTHDR(iv)");
4520 goto finally;
4521 }
4522 header->cmsg_level = SOL_ALG;
4523 header->cmsg_type = ALG_SET_IV;
4524 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4525 alg_iv = (void*)CMSG_DATA(header);
4526 alg_iv->ivlen = iv.len;
4527 memcpy(alg_iv->iv, iv.buf, iv.len);
4528 }
4529
4530 /* set length of associated data for AEAD */
4531 if (assoclen >= 0) {
4532 header = CMSG_NXTHDR(&msg, header);
4533 if (header == NULL) {
4534 PyErr_SetString(PyExc_RuntimeError,
4535 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4536 goto finally;
4537 }
4538 header->cmsg_level = SOL_ALG;
4539 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4540 header->cmsg_len = CMSG_LEN(4);
4541 uiptr = (void*)CMSG_DATA(header);
4542 *uiptr = (unsigned int)assoclen;
4543 }
4544
4545 ctx.msg = &msg;
4546 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004547 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004548 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004549 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004550
4551 retval = PyLong_FromSsize_t(ctx.result);
4552
4553 finally:
4554 PyMem_Free(controlbuf);
4555 if (iv.buf != NULL) {
4556 PyBuffer_Release(&iv);
4557 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004558 PyMem_Free(msg.msg_iov);
4559 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004560 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004561 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004562 PyMem_Free(databufs);
4563 return retval;
4564}
4565
4566PyDoc_STRVAR(sendmsg_afalg_doc,
4567"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4568\n\
4569Set operation mode, IV and length of associated data for an AF_ALG\n\
4570operation socket.");
4571#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004572
Guido van Rossum30a685f1991-06-27 15:51:29 +00004573/* s.shutdown(how) method */
4574
Guido van Rossum73624e91994-10-10 17:59:00 +00004575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004576sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 int how;
4579 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004580
Serhiy Storchaka78980432013-01-15 01:12:17 +02004581 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 if (how == -1 && PyErr_Occurred())
4583 return NULL;
4584 Py_BEGIN_ALLOW_THREADS
4585 res = shutdown(s->sock_fd, how);
4586 Py_END_ALLOW_THREADS
4587 if (res < 0)
4588 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004589 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004590}
4591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004592PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004593"shutdown(flag)\n\
4594\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004595Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4596of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004597
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004598#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004599static PyObject*
4600sock_ioctl(PySocketSockObject *s, PyObject *arg)
4601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 unsigned long cmd = SIO_RCVALL;
4603 PyObject *argO;
4604 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4607 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 switch (cmd) {
4610 case SIO_RCVALL: {
4611 unsigned int option = RCVALL_ON;
4612 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4613 return NULL;
4614 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4615 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4616 return set_error();
4617 }
4618 return PyLong_FromUnsignedLong(recv); }
4619 case SIO_KEEPALIVE_VALS: {
4620 struct tcp_keepalive ka;
4621 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4622 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4623 return NULL;
4624 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4625 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4626 return set_error();
4627 }
4628 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004629#if defined(SIO_LOOPBACK_FAST_PATH)
4630 case SIO_LOOPBACK_FAST_PATH: {
4631 unsigned int option;
4632 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4633 return NULL;
4634 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4635 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4636 return set_error();
4637 }
4638 return PyLong_FromUnsignedLong(recv); }
4639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 default:
4641 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4642 return NULL;
4643 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004644}
4645PyDoc_STRVAR(sock_ioctl_doc,
4646"ioctl(cmd, option) -> long\n\
4647\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004648Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4649SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004650SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4651SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004652#endif
4653
4654#if defined(MS_WINDOWS)
4655static PyObject*
4656sock_share(PySocketSockObject *s, PyObject *arg)
4657{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004658 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004659 DWORD processId;
4660 int result;
4661
4662 if (!PyArg_ParseTuple(arg, "I", &processId))
4663 return NULL;
4664
4665 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004666 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004667 Py_END_ALLOW_THREADS
4668 if (result == SOCKET_ERROR)
4669 return set_error();
4670 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4671}
4672PyDoc_STRVAR(sock_share_doc,
4673"share(process_id) -> bytes\n\
4674\n\
4675Share the socket with another process. The target process id\n\
4676must be provided and the resulting bytes object passed to the target\n\
4677process. There the shared socket can be instantiated by calling\n\
4678socket.fromshare().");
4679
Christian Heimesfaf2f632008-01-06 16:59:19 +00004680
4681#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004682
4683/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004684
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004685static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4687 accept_doc},
4688 {"bind", (PyCFunction)sock_bind, METH_O,
4689 bind_doc},
4690 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004691 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 {"connect", (PyCFunction)sock_connect, METH_O,
4693 connect_doc},
4694 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4695 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004696 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4697 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4699 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004700#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 {"getpeername", (PyCFunction)sock_getpeername,
4702 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 {"getsockname", (PyCFunction)sock_getsockname,
4705 METH_NOARGS, getsockname_doc},
4706 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4707 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004708#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4710 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004711#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004712#if defined(MS_WINDOWS)
4713 {"share", (PyCFunction)sock_share, METH_VARARGS,
4714 sock_share_doc},
4715#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004716 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 listen_doc},
4718 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4719 recv_doc},
4720 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4721 recv_into_doc},
4722 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4723 recvfrom_doc},
4724 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4725 recvfrom_into_doc},
4726 {"send", (PyCFunction)sock_send, METH_VARARGS,
4727 send_doc},
4728 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4729 sendall_doc},
4730 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4731 sendto_doc},
4732 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4733 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004734 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4735 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4737 settimeout_doc},
4738 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4739 gettimeout_doc},
4740 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4741 setsockopt_doc},
4742 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4743 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004744#ifdef CMSG_LEN
4745 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4746 recvmsg_doc},
4747 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4748 recvmsg_into_doc,},
4749 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4750 sendmsg_doc},
4751#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004752#ifdef HAVE_SOCKADDR_ALG
4753 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4754 sendmsg_afalg_doc},
4755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004757};
4758
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004759/* SockObject members */
4760static PyMemberDef sock_memberlist[] = {
4761 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4762 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4763 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004764 {0},
4765};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004766
Victor Stinner71694d52015-03-28 01:18:54 +01004767static PyGetSetDef sock_getsetlist[] = {
4768 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4769 {NULL} /* sentinel */
4770};
4771
Guido van Rossum73624e91994-10-10 17:59:00 +00004772/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004773 First close the file description. */
4774
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004775static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004776sock_finalize(PySocketSockObject *s)
4777{
4778 SOCKET_T fd;
4779 PyObject *error_type, *error_value, *error_traceback;
4780
4781 /* Save the current exception, if any. */
4782 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4783
Victor Stinnerd3afb622016-07-22 17:47:09 +02004784 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004785 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4786 /* Spurious errors can appear at shutdown */
4787 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4788 PyErr_WriteUnraisable((PyObject *)s);
4789 }
4790 }
4791
4792 /* Only close the socket *after* logging the ResourceWarning warning
4793 to allow the logger to call socket methods like
4794 socket.getsockname(). If the socket is closed before, socket
4795 methods fails with the EBADF error. */
4796 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004797 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004798
4799 /* We do not want to retry upon EINTR: see sock_close() */
4800 Py_BEGIN_ALLOW_THREADS
4801 (void) SOCKETCLOSE(fd);
4802 Py_END_ALLOW_THREADS
4803 }
4804
4805 /* Restore the saved exception. */
4806 PyErr_Restore(error_type, error_value, error_traceback);
4807}
4808
4809static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004810sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004811{
Victor Stinner19a8e842016-03-21 16:36:48 +01004812 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4813 return;
4814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004816}
4817
Guido van Rossum30a685f1991-06-27 15:51:29 +00004818
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004820sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004821{
Victor Stinnere254e532014-07-26 14:36:55 +02004822 long sock_fd;
4823 /* On Windows, this test is needed because SOCKET_T is unsigned */
4824 if (s->sock_fd == INVALID_SOCKET) {
4825 sock_fd = -1;
4826 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004827#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004828 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 /* this can occur on Win64, and actually there is a special
4830 ugly printf formatter for decimal pointer length integer
4831 printing, only bother if necessary*/
4832 PyErr_SetString(PyExc_OverflowError,
4833 "no printf formatter to display "
4834 "the socket descriptor in decimal");
4835 return NULL;
4836 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004837#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004838 else
4839 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 return PyUnicode_FromFormat(
4841 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004842 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 s->sock_type,
4844 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004845}
4846
4847
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004848/* Create a new, uninitialized socket object. */
4849
4850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004851sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 new = type->tp_alloc(type, 0);
4856 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004857 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004858 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 ((PySocketSockObject *)new)->errorhandler = &set_error;
4860 }
4861 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004862}
4863
4864
4865/* Initialize a new socket object. */
4866
Victor Stinnerdaf45552013-08-28 00:53:59 +02004867#ifdef SOCK_CLOEXEC
4868/* socket() and socketpair() fail with EINVAL on Linux kernel older
4869 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4870static int sock_cloexec_works = -1;
4871#endif
4872
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004873/*ARGSUSED*/
4874static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004875sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 PySocketSockObject *s = (PySocketSockObject *)self;
4878 PyObject *fdobj = NULL;
4879 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004880 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004882#ifndef MS_WINDOWS
4883#ifdef SOCK_CLOEXEC
4884 int *atomic_flag_works = &sock_cloexec_works;
4885#else
4886 int *atomic_flag_works = NULL;
4887#endif
4888#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4891 "|iiiO:socket", keywords,
4892 &family, &type, &proto, &fdobj))
4893 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004896#ifdef MS_WINDOWS
4897 /* recreate a socket that was duplicated */
4898 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004899 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004900 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4901 PyErr_Format(PyExc_ValueError,
4902 "socket descriptor string has wrong size, "
4903 "should be %zu bytes.", sizeof(info));
4904 return -1;
4905 }
4906 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4907 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004908 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004909 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4910 Py_END_ALLOW_THREADS
4911 if (fd == INVALID_SOCKET) {
4912 set_error();
4913 return -1;
4914 }
4915 family = info.iAddressFamily;
4916 type = info.iSocketType;
4917 proto = info.iProtocol;
4918 }
4919 else
4920#endif
4921 {
4922 fd = PyLong_AsSocket_t(fdobj);
4923 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4924 return -1;
4925 if (fd == INVALID_SOCKET) {
4926 PyErr_SetString(PyExc_ValueError,
4927 "can't use invalid socket value");
4928 return -1;
4929 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004930
4931 if (family == -1) {
4932 sock_addr_t addrbuf;
4933 socklen_t addrlen = sizeof(sock_addr_t);
4934
4935 memset(&addrbuf, 0, addrlen);
4936 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4937 family = SAS2SA(&addrbuf)->sa_family;
4938 } else {
4939#ifdef MS_WINDOWS
4940 PyErr_SetFromWindowsErrWithFilename(0, "family");
4941#else
4942 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4943#endif
4944 return -1;
4945 }
4946 }
4947#ifdef SO_TYPE
4948 if (type == -1) {
4949 int tmp;
4950 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004951 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4952 (void *)&tmp, &slen) == 0)
4953 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004954 type = tmp;
4955 } else {
4956#ifdef MS_WINDOWS
4957 PyErr_SetFromWindowsErrWithFilename(0, "type");
4958#else
4959 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4960#endif
4961 return -1;
4962 }
4963 }
4964#else
4965 type = SOCK_STREAM;
4966#endif
4967#ifdef SO_PROTOCOL
4968 if (proto == -1) {
4969 int tmp;
4970 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004971 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4972 (void *)&tmp, &slen) == 0)
4973 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004974 proto = tmp;
4975 } else {
4976#ifdef MS_WINDOWS
4977 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4978#else
4979 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4980#endif
4981 return -1;
4982 }
4983 }
4984#else
4985 proto = 0;
4986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 }
4988 }
4989 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004990 /* No fd, default to AF_INET and SOCK_STREAM */
4991 if (family == -1) {
4992 family = AF_INET;
4993 }
4994 if (type == -1) {
4995 type = SOCK_STREAM;
4996 }
4997 if (proto == -1) {
4998 proto = 0;
4999 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005000#ifdef MS_WINDOWS
5001 /* Windows implementation */
5002#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5003#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5004#endif
5005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005007 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005008 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005009 NULL, 0,
5010 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5011 if (fd == INVALID_SOCKET) {
5012 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5013 support_wsa_no_inherit = 0;
5014 fd = socket(family, type, proto);
5015 }
5016 }
5017 else {
5018 fd = socket(family, type, proto);
5019 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 if (fd == INVALID_SOCKET) {
5023 set_error();
5024 return -1;
5025 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005026
5027 if (!support_wsa_no_inherit) {
5028 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5029 closesocket(fd);
5030 PyErr_SetFromWindowsErr(0);
5031 return -1;
5032 }
5033 }
5034#else
5035 /* UNIX */
5036 Py_BEGIN_ALLOW_THREADS
5037#ifdef SOCK_CLOEXEC
5038 if (sock_cloexec_works != 0) {
5039 fd = socket(family, type | SOCK_CLOEXEC, proto);
5040 if (sock_cloexec_works == -1) {
5041 if (fd >= 0) {
5042 sock_cloexec_works = 1;
5043 }
5044 else if (errno == EINVAL) {
5045 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5046 sock_cloexec_works = 0;
5047 fd = socket(family, type, proto);
5048 }
5049 }
5050 }
5051 else
5052#endif
5053 {
5054 fd = socket(family, type, proto);
5055 }
5056 Py_END_ALLOW_THREADS
5057
5058 if (fd == INVALID_SOCKET) {
5059 set_error();
5060 return -1;
5061 }
5062
5063 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5064 SOCKETCLOSE(fd);
5065 return -1;
5066 }
5067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005069 if (init_sockobject(s, fd, family, type, proto) == -1) {
5070 SOCKETCLOSE(fd);
5071 return -1;
5072 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005075
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005076}
5077
5078
Guido van Rossumb6775db1994-08-01 11:34:53 +00005079/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005080
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005081static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5083 "_socket.socket", /* tp_name */
5084 sizeof(PySocketSockObject), /* tp_basicsize */
5085 0, /* tp_itemsize */
5086 (destructor)sock_dealloc, /* tp_dealloc */
5087 0, /* tp_print */
5088 0, /* tp_getattr */
5089 0, /* tp_setattr */
5090 0, /* tp_reserved */
5091 (reprfunc)sock_repr, /* tp_repr */
5092 0, /* tp_as_number */
5093 0, /* tp_as_sequence */
5094 0, /* tp_as_mapping */
5095 0, /* tp_hash */
5096 0, /* tp_call */
5097 0, /* tp_str */
5098 PyObject_GenericGetAttr, /* tp_getattro */
5099 0, /* tp_setattro */
5100 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005101 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5102 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 sock_doc, /* tp_doc */
5104 0, /* tp_traverse */
5105 0, /* tp_clear */
5106 0, /* tp_richcompare */
5107 0, /* tp_weaklistoffset */
5108 0, /* tp_iter */
5109 0, /* tp_iternext */
5110 sock_methods, /* tp_methods */
5111 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005112 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 0, /* tp_base */
5114 0, /* tp_dict */
5115 0, /* tp_descr_get */
5116 0, /* tp_descr_set */
5117 0, /* tp_dictoffset */
5118 sock_initobj, /* tp_init */
5119 PyType_GenericAlloc, /* tp_alloc */
5120 sock_new, /* tp_new */
5121 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005122 0, /* tp_is_gc */
5123 0, /* tp_bases */
5124 0, /* tp_mro */
5125 0, /* tp_cache */
5126 0, /* tp_subclasses */
5127 0, /* tp_weaklist */
5128 0, /* tp_del */
5129 0, /* tp_version_tag */
5130 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005131};
5132
Guido van Rossum30a685f1991-06-27 15:51:29 +00005133
Guido van Rossum81194471991-07-27 21:42:02 +00005134/* Python interface to gethostname(). */
5135
5136/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005137static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005138socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005139{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005140#ifdef MS_WINDOWS
5141 /* Don't use winsock's gethostname, as this returns the ANSI
5142 version of the hostname, whereas we need a Unicode string.
5143 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005144 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005145 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005146 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005147 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005148
5149 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005150 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005151
5152 if (GetLastError() != ERROR_MORE_DATA)
5153 return PyErr_SetFromWindowsErr(0);
5154
5155 if (size == 0)
5156 return PyUnicode_New(0, 0);
5157
5158 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5159 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005160 name = PyMem_New(wchar_t, size);
5161 if (!name) {
5162 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005163 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005164 }
Victor Stinner74168972011-11-17 01:11:36 +01005165 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5166 name,
5167 &size))
5168 {
5169 PyMem_Free(name);
5170 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005171 }
Victor Stinner74168972011-11-17 01:11:36 +01005172
5173 result = PyUnicode_FromWideChar(name, size);
5174 PyMem_Free(name);
5175 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005176#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 char buf[1024];
5178 int res;
5179 Py_BEGIN_ALLOW_THREADS
5180 res = gethostname(buf, (int) sizeof buf - 1);
5181 Py_END_ALLOW_THREADS
5182 if (res < 0)
5183 return set_error();
5184 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005185 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005186#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005187}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005189PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005190"gethostname() -> string\n\
5191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005192Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005193
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005194#ifdef HAVE_SETHOSTNAME
5195PyDoc_STRVAR(sethostname_doc,
5196"sethostname(name)\n\n\
5197Sets the hostname to name.");
5198
5199static PyObject *
5200socket_sethostname(PyObject *self, PyObject *args)
5201{
5202 PyObject *hnobj;
5203 Py_buffer buf;
5204 int res, flag = 0;
5205
Christian Heimesd2774c72013-06-19 02:06:29 +02005206#ifdef _AIX
5207/* issue #18259, not declared in any useful header file */
5208extern int sethostname(const char *, size_t);
5209#endif
5210
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005211 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5212 PyErr_Clear();
5213 if (!PyArg_ParseTuple(args, "O&:sethostname",
5214 PyUnicode_FSConverter, &hnobj))
5215 return NULL;
5216 flag = 1;
5217 }
5218 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5219 if (!res) {
5220 res = sethostname(buf.buf, buf.len);
5221 PyBuffer_Release(&buf);
5222 }
5223 if (flag)
5224 Py_DECREF(hnobj);
5225 if (res)
5226 return set_error();
5227 Py_RETURN_NONE;
5228}
5229#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005230
Guido van Rossum30a685f1991-06-27 15:51:29 +00005231/* Python interface to gethostbyname(name). */
5232
5233/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005234static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005235socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 char *name;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005238 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005239 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005240
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005241 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 return NULL;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005243 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005244 goto finally;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005245 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005246finally:
5247 PyMem_Free(name);
5248 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005249}
5250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005251PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005252"gethostbyname(host) -> address\n\
5253\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005254Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005255
5256
Victor Stinner72400302016-01-28 15:41:01 +01005257static PyObject*
5258sock_decode_hostname(const char *name)
5259{
5260#ifdef MS_WINDOWS
5261 /* Issue #26227: gethostbyaddr() returns a string encoded
5262 * to the ANSI code page */
5263 return PyUnicode_DecodeFSDefault(name);
5264#else
5265 /* Decode from UTF-8 */
5266 return PyUnicode_FromString(name);
5267#endif
5268}
5269
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005270/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5271
5272static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005273gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 char **pch;
5276 PyObject *rtn_tuple = (PyObject *)NULL;
5277 PyObject *name_list = (PyObject *)NULL;
5278 PyObject *addr_list = (PyObject *)NULL;
5279 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005280 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 if (h == NULL) {
5283 /* Let's get real error message to return */
5284 set_herror(h_errno);
5285 return NULL;
5286 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 if (h->h_addrtype != af) {
5289 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005290 errno = EAFNOSUPPORT;
5291 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 return NULL;
5293 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 case AF_INET:
5298 if (alen < sizeof(struct sockaddr_in))
5299 return NULL;
5300 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005301
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005302#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 case AF_INET6:
5304 if (alen < sizeof(struct sockaddr_in6))
5305 return NULL;
5306 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 if ((name_list = PyList_New(0)) == NULL)
5312 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 if ((addr_list = PyList_New(0)) == NULL)
5315 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 /* SF #1511317: h_aliases can be NULL */
5318 if (h->h_aliases) {
5319 for (pch = h->h_aliases; *pch != NULL; pch++) {
5320 int status;
5321 tmp = PyUnicode_FromString(*pch);
5322 if (tmp == NULL)
5323 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 status = PyList_Append(name_list, tmp);
5326 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 if (status)
5329 goto err;
5330 }
5331 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5334 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 case AF_INET:
5339 {
5340 struct sockaddr_in sin;
5341 memset(&sin, 0, sizeof(sin));
5342 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005343#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005347 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 if (pch == h->h_addr_list && alen >= sizeof(sin))
5350 memcpy((char *) addr, &sin, sizeof(sin));
5351 break;
5352 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005353
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005354#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 case AF_INET6:
5356 {
5357 struct sockaddr_in6 sin6;
5358 memset(&sin6, 0, sizeof(sin6));
5359 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005360#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005364 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5367 memcpy((char *) addr, &sin6, sizeof(sin6));
5368 break;
5369 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005373 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 "unsupported address family");
5375 return NULL;
5376 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 if (tmp == NULL)
5379 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 status = PyList_Append(addr_list, tmp);
5382 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 if (status)
5385 goto err;
5386 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005387
Victor Stinner72400302016-01-28 15:41:01 +01005388 name = sock_decode_hostname(h->h_name);
5389 if (name == NULL)
5390 goto err;
5391 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005392
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005393 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 Py_XDECREF(name_list);
5395 Py_XDECREF(addr_list);
5396 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005397}
5398
5399
5400/* Python interface to gethostbyname_ex(name). */
5401
5402/*ARGSUSED*/
5403static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005404socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 char *name;
5407 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005408 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005410 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005411#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005413#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005415#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 char buf[16384];
5417 int buf_len = (sizeof buf) - 1;
5418 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005419#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005420#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005422#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005423#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005424
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005425 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005427 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005428 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005430#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005431#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005432 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005434#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005436#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 memset((void *) &data, '\0', sizeof(data));
5438 result = gethostbyname_r(name, &hp_allocated, &data);
5439 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005440#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005441#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005442#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005444#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005445 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005447#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 Py_END_ALLOW_THREADS
5449 /* Some C libraries would require addr.__ss_family instead of
5450 addr.ss_family.
5451 Therefore, we cast the sockaddr_storage into sockaddr to
5452 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005453 sa = SAS2SA(&addr);
5454 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005456#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005458#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005459finally:
5460 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005462}
5463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005464PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005465"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5466\n\
5467Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005468for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005469
5470
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005471/* Python interface to gethostbyaddr(IP). */
5472
5473/*ARGSUSED*/
5474static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005475socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005476{
Charles-François Natali8b759652011-12-23 16:44:51 +01005477 sock_addr_t addr;
5478 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 char *ip_num;
5480 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005481 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005482#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005484#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005486#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 /* glibcs up to 2.10 assume that the buf argument to
5488 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5489 does not ensure. The attribute below instructs the compiler
5490 to maintain this alignment. */
5491 char buf[16384] Py_ALIGNED(8);
5492 int buf_len = (sizeof buf) - 1;
5493 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005494#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005495#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005497#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005498#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005499 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 int al;
5501 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005502
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005503 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 return NULL;
5505 af = AF_UNSPEC;
5506 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005507 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 af = sa->sa_family;
5509 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005510 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 switch (af) {
5512 case AF_INET:
5513 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5514 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5515 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005516#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 case AF_INET6:
5518 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5519 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5520 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005523 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005524 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 }
5526 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005527#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005528#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005529 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 &hp_allocated, buf, buf_len,
5531 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005532#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 h = gethostbyaddr_r(ap, al, af,
5534 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005535#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 memset((void *) &data, '\0', sizeof(data));
5537 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5538 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005539#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005540#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005541#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005543#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005544 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005546#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005548 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005549#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005551#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005552finally:
5553 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005555}
5556
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005557PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005558"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5559\n\
5560Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005561for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005562
Guido van Rossum30a685f1991-06-27 15:51:29 +00005563
5564/* Python interface to getservbyname(name).
5565 This only returns the port number, since the other info is already
5566 known or not useful (like the list of aliases). */
5567
5568/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005569static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005570socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005571{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005572 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 struct servent *sp;
5574 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5575 return NULL;
5576 Py_BEGIN_ALLOW_THREADS
5577 sp = getservbyname(name, proto);
5578 Py_END_ALLOW_THREADS
5579 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005580 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 return NULL;
5582 }
5583 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005584}
5585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005586PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005587"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005588\n\
5589Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005590The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5591otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005592
Guido van Rossum30a685f1991-06-27 15:51:29 +00005593
Barry Warsaw11b91a02004-06-28 00:50:43 +00005594/* Python interface to getservbyport(port).
5595 This only returns the service name, since the other info is already
5596 known or not useful (like the list of aliases). */
5597
5598/*ARGSUSED*/
5599static PyObject *
5600socket_getservbyport(PyObject *self, PyObject *args)
5601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005603 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 struct servent *sp;
5605 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5606 return NULL;
5607 if (port < 0 || port > 0xffff) {
5608 PyErr_SetString(
5609 PyExc_OverflowError,
5610 "getservbyport: port must be 0-65535.");
5611 return NULL;
5612 }
5613 Py_BEGIN_ALLOW_THREADS
5614 sp = getservbyport(htons((short)port), proto);
5615 Py_END_ALLOW_THREADS
5616 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005617 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 return NULL;
5619 }
5620 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005621}
5622
5623PyDoc_STRVAR(getservbyport_doc,
5624"getservbyport(port[, protocolname]) -> string\n\
5625\n\
5626Return the service name from a port number and protocol name.\n\
5627The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5628otherwise any protocol will match.");
5629
Guido van Rossum3901d851996-12-19 16:35:04 +00005630/* Python interface to getprotobyname(name).
5631 This only returns the protocol number, since the other info is
5632 already known or not useful (like the list of aliases). */
5633
5634/*ARGSUSED*/
5635static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005636socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005637{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005638 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 struct protoent *sp;
5640 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5641 return NULL;
5642 Py_BEGIN_ALLOW_THREADS
5643 sp = getprotobyname(name);
5644 Py_END_ALLOW_THREADS
5645 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005646 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 return NULL;
5648 }
5649 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005650}
5651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005652PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005653"getprotobyname(name) -> integer\n\
5654\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005655Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005656
Christian Heimesd0e31b92018-01-27 09:54:13 +01005657static PyObject *
5658socket_close(PyObject *self, PyObject *fdobj)
5659{
5660 SOCKET_T fd;
5661 int res;
5662
5663 fd = PyLong_AsSocket_t(fdobj);
5664 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5665 return NULL;
5666 Py_BEGIN_ALLOW_THREADS
5667 res = SOCKETCLOSE(fd);
5668 Py_END_ALLOW_THREADS
5669 /* bpo-30319: The peer can already have closed the connection.
5670 Python ignores ECONNRESET on close(). */
5671 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5672 return set_error();
5673 }
5674 Py_RETURN_NONE;
5675}
5676
5677PyDoc_STRVAR(close_doc,
5678"close(integer) -> None\n\
5679\n\
5680Close an integer socket file descriptor. This is like os.close(), but for\n\
5681sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005682
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005683#ifndef NO_DUP
5684/* dup() function for socket fds */
5685
5686static PyObject *
5687socket_dup(PyObject *self, PyObject *fdobj)
5688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 SOCKET_T fd, newfd;
5690 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005691#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005692 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005693#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 fd = PyLong_AsSocket_t(fdobj);
5696 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5697 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005698
Victor Stinnerdaf45552013-08-28 00:53:59 +02005699#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005700 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005701 return set_error();
5702
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005703 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005704 FROM_PROTOCOL_INFO,
5705 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 if (newfd == INVALID_SOCKET)
5707 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005708
Victor Stinnerdaf45552013-08-28 00:53:59 +02005709 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5710 closesocket(newfd);
5711 PyErr_SetFromWindowsErr(0);
5712 return NULL;
5713 }
5714#else
5715 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5716 newfd = _Py_dup(fd);
5717 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005718 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005719#endif
5720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 newfdobj = PyLong_FromSocket_t(newfd);
5722 if (newfdobj == NULL)
5723 SOCKETCLOSE(newfd);
5724 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005725}
5726
5727PyDoc_STRVAR(dup_doc,
5728"dup(integer) -> integer\n\
5729\n\
5730Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5731sockets; on some platforms os.dup() won't work for socket file descriptors.");
5732#endif
5733
5734
Dave Cole331708b2004-08-09 04:51:41 +00005735#ifdef HAVE_SOCKETPAIR
5736/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005737 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005738 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005739
5740/*ARGSUSED*/
5741static PyObject *
5742socket_socketpair(PyObject *self, PyObject *args)
5743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744 PySocketSockObject *s0 = NULL, *s1 = NULL;
5745 SOCKET_T sv[2];
5746 int family, type = SOCK_STREAM, proto = 0;
5747 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005748#ifdef SOCK_CLOEXEC
5749 int *atomic_flag_works = &sock_cloexec_works;
5750#else
5751 int *atomic_flag_works = NULL;
5752#endif
5753 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005754
5755#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5761 &family, &type, &proto))
5762 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005765 Py_BEGIN_ALLOW_THREADS
5766#ifdef SOCK_CLOEXEC
5767 if (sock_cloexec_works != 0) {
5768 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5769 if (sock_cloexec_works == -1) {
5770 if (ret >= 0) {
5771 sock_cloexec_works = 1;
5772 }
5773 else if (errno == EINVAL) {
5774 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5775 sock_cloexec_works = 0;
5776 ret = socketpair(family, type, proto, sv);
5777 }
5778 }
5779 }
5780 else
5781#endif
5782 {
5783 ret = socketpair(family, type, proto, sv);
5784 }
5785 Py_END_ALLOW_THREADS
5786
5787 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005789
5790 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5791 goto finally;
5792 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5793 goto finally;
5794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 s0 = new_sockobject(sv[0], family, type, proto);
5796 if (s0 == NULL)
5797 goto finally;
5798 s1 = new_sockobject(sv[1], family, type, proto);
5799 if (s1 == NULL)
5800 goto finally;
5801 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005802
5803finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 if (res == NULL) {
5805 if (s0 == NULL)
5806 SOCKETCLOSE(sv[0]);
5807 if (s1 == NULL)
5808 SOCKETCLOSE(sv[1]);
5809 }
5810 Py_XDECREF(s0);
5811 Py_XDECREF(s1);
5812 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005813}
5814
5815PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005816"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005817\n\
5818Create a pair of socket objects from the sockets returned by the platform\n\
5819socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005820The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005821AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005822
5823#endif /* HAVE_SOCKETPAIR */
5824
5825
Guido van Rossum006bf911996-06-12 04:04:55 +00005826static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005827socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005828{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005829 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005830
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005831 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 return NULL;
5833 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005834 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005836 "ntohs: can't convert negative Python int to C "
5837 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 return NULL;
5839 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005840 if (x > 0xffff) {
5841 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5842 "ntohs: Python int too large to convert to C "
5843 "16-bit unsigned integer (The silent truncation "
5844 "is deprecated)",
5845 1)) {
5846 return NULL;
5847 }
5848 }
5849 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005850}
5851
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005852PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005853"ntohs(integer) -> integer\n\
5854\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005855Convert a 16-bit unsigned integer from network to host byte order.\n\
5856Note that in case the received integer does not fit in 16-bit unsigned\n\
5857integer, but does fit in a positive C int, it is silently truncated to\n\
585816-bit unsigned integer.\n\
5859However, this silent truncation feature is deprecated, and will raise an \n\
5860exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005861
5862
Guido van Rossum006bf911996-06-12 04:04:55 +00005863static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005864socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 if (PyLong_Check(arg)) {
5869 x = PyLong_AsUnsignedLong(arg);
5870 if (x == (unsigned long) -1 && PyErr_Occurred())
5871 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005872#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 {
5874 unsigned long y;
5875 /* only want the trailing 32 bits */
5876 y = x & 0xFFFFFFFFUL;
5877 if (y ^ x)
5878 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005879 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 x = y;
5881 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 }
5884 else
5885 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005886 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005889}
5890
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005891PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005892"ntohl(integer) -> integer\n\
5893\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005894Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005895
5896
Guido van Rossum006bf911996-06-12 04:04:55 +00005897static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005898socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005899{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005900 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005901
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005902 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 return NULL;
5904 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005905 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005907 "htons: can't convert negative Python int to C "
5908 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 return NULL;
5910 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005911 if (x > 0xffff) {
5912 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5913 "htons: Python int too large to convert to C "
5914 "16-bit unsigned integer (The silent truncation "
5915 "is deprecated)",
5916 1)) {
5917 return NULL;
5918 }
5919 }
5920 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005921}
5922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005923PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005924"htons(integer) -> integer\n\
5925\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005926Convert a 16-bit unsigned integer from host to network byte order.\n\
5927Note that in case the received integer does not fit in 16-bit unsigned\n\
5928integer, but does fit in a positive C int, it is silently truncated to\n\
592916-bit unsigned integer.\n\
5930However, this silent truncation feature is deprecated, and will raise an \n\
5931exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005932
5933
Guido van Rossum006bf911996-06-12 04:04:55 +00005934static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005935socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 if (PyLong_Check(arg)) {
5940 x = PyLong_AsUnsignedLong(arg);
5941 if (x == (unsigned long) -1 && PyErr_Occurred())
5942 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005943#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 {
5945 unsigned long y;
5946 /* only want the trailing 32 bits */
5947 y = x & 0xFFFFFFFFUL;
5948 if (y ^ x)
5949 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005950 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 x = y;
5952 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 }
5955 else
5956 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005957 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 Py_TYPE(arg)->tp_name);
5959 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005960}
5961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005962PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005963"htonl(integer) -> integer\n\
5964\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005965Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005966
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005967/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005968
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005969PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005970"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005971\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005972Convert 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 +00005973binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005974
5975static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005976socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005977{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005978#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005980#endif
5981
5982#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005983#if (SIZEOF_INT != 4)
5984#error "Not sure if in_addr_t exists and int is not 32-bits."
5985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 /* Have to use inet_addr() instead */
5987 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005988#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005989 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5992 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005993
Tim Peters1df9fdd2003-02-13 03:13:40 +00005994
5995#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005996
5997#ifdef USE_INET_ATON_WEAKLINK
5998 if (inet_aton != NULL) {
5999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 if (inet_aton(ip_addr, &buf))
6001 return PyBytes_FromStringAndSize((char *)(&buf),
6002 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006003
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006004 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 "illegal IP address string passed to inet_aton");
6006 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006007
Thomas Wouters477c8d52006-05-27 19:21:47 +00006008#ifdef USE_INET_ATON_WEAKLINK
6009 } else {
6010#endif
6011
6012#endif
6013
6014#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 /* special-case this address as inet_addr might return INADDR_NONE
6017 * for this */
6018 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006019 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006021
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006022 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006026 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 "illegal IP address string passed to inet_aton");
6028 return NULL;
6029 }
6030 }
6031 return PyBytes_FromStringAndSize((char *) &packed_addr,
6032 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006033
6034#ifdef USE_INET_ATON_WEAKLINK
6035 }
6036#endif
6037
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006038#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006039}
6040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006041PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006042"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006043\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006044Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006045
6046static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006047socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006048{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006049 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006051
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006052 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 return NULL;
6054 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006055
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006056 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006057 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006059 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 return NULL;
6061 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006062
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006063 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6064 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006065
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006066 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006068}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006069
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006070#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006071
6072PyDoc_STRVAR(inet_pton_doc,
6073"inet_pton(af, ip) -> packed IP address string\n\
6074\n\
6075Convert an IP address from string format to a packed string suitable\n\
6076for use with low-level network functions.");
6077
6078static PyObject *
6079socket_inet_pton(PyObject *self, PyObject *args)
6080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006082 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006084#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006085 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6090 return NULL;
6091 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006092
Martin v. Löwis04697e82004-06-02 12:35:29 +00006093#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006095 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 "can't use AF_INET6, IPv6 is disabled");
6097 return NULL;
6098 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006099#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 retval = inet_pton(af, ip, packed);
6102 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006103 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 return NULL;
6105 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006106 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 "illegal IP address string passed to inet_pton");
6108 return NULL;
6109 } else if (af == AF_INET) {
6110 return PyBytes_FromStringAndSize(packed,
6111 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006112#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 } else if (af == AF_INET6) {
6114 return PyBytes_FromStringAndSize(packed,
6115 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006118 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 return NULL;
6120 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006121}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006122
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006123PyDoc_STRVAR(inet_ntop_doc,
6124"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6125\n\
6126Convert a packed IP address of the given family to string format.");
6127
6128static PyObject *
6129socket_inet_ntop(PyObject *self, PyObject *args)
6130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006132 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006134#ifdef ENABLE_IPV6
Miss Islington (bot)04425992018-02-12 12:12:24 -08006135 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006136#else
Miss Islington (bot)04425992018-02-12 12:12:24 -08006137 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006138#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006139
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006140 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 return NULL;
6142 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006145 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 PyErr_SetString(PyExc_ValueError,
6147 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006148 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 return NULL;
6150 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006151#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006153 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 PyErr_SetString(PyExc_ValueError,
6155 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006156 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 return NULL;
6158 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 } else {
6161 PyErr_Format(PyExc_ValueError,
6162 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006163 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 return NULL;
6165 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006166
Miss Islington (bot)04425992018-02-12 12:12:24 -08006167 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006168 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6169 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006171 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 return NULL;
6173 } else {
6174 return PyUnicode_FromString(retval);
6175 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006176}
6177
6178#endif /* HAVE_INET_PTON */
6179
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006180/* Python interface to getaddrinfo(host, port). */
6181
6182/*ARGSUSED*/
6183static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006184socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006185{
Victor Stinner77af1722011-05-26 14:05:59 +02006186 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006187 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188 struct addrinfo hints, *res;
6189 struct addrinfo *res0 = NULL;
6190 PyObject *hobj = NULL;
6191 PyObject *pobj = (PyObject *)NULL;
6192 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006193 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 int family, socktype, protocol, flags;
6195 int error;
6196 PyObject *all = (PyObject *)NULL;
6197 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006198
Georg Brandl6083a4b2013-10-14 06:51:46 +02006199 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006201 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006202 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 &protocol, &flags)) {
6204 return NULL;
6205 }
6206 if (hobj == Py_None) {
6207 hptr = NULL;
6208 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006209 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 if (!idna)
6211 return NULL;
6212 assert(PyBytes_Check(idna));
6213 hptr = PyBytes_AS_STRING(idna);
6214 } else if (PyBytes_Check(hobj)) {
6215 hptr = PyBytes_AsString(hobj);
6216 } else {
6217 PyErr_SetString(PyExc_TypeError,
6218 "getaddrinfo() argument 1 must be string or None");
6219 return NULL;
6220 }
6221 if (PyLong_CheckExact(pobj)) {
6222 long value = PyLong_AsLong(pobj);
6223 if (value == -1 && PyErr_Occurred())
6224 goto err;
6225 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6226 pptr = pbuf;
6227 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006228 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006229 if (pptr == NULL)
6230 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006232 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 } else if (pobj == Py_None) {
6234 pptr = (char *)NULL;
6235 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006236 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 goto err;
6238 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006239#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006240 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006241 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006242 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6243 * This workaround avoids a segfault in libsystem.
6244 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006245 pptr = "00";
6246 }
6247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 memset(&hints, 0, sizeof(hints));
6249 hints.ai_family = family;
6250 hints.ai_socktype = socktype;
6251 hints.ai_protocol = protocol;
6252 hints.ai_flags = flags;
6253 Py_BEGIN_ALLOW_THREADS
6254 ACQUIRE_GETADDRINFO_LOCK
6255 error = getaddrinfo(hptr, pptr, &hints, &res0);
6256 Py_END_ALLOW_THREADS
6257 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6258 if (error) {
6259 set_gaierror(error);
6260 goto err;
6261 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006262
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006263 all = PyList_New(0);
6264 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 goto err;
6266 for (res = res0; res; res = res->ai_next) {
6267 PyObject *single;
6268 PyObject *addr =
6269 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6270 if (addr == NULL)
6271 goto err;
6272 single = Py_BuildValue("iiisO", res->ai_family,
6273 res->ai_socktype, res->ai_protocol,
6274 res->ai_canonname ? res->ai_canonname : "",
6275 addr);
6276 Py_DECREF(addr);
6277 if (single == NULL)
6278 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006279
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006280 if (PyList_Append(all, single)) {
6281 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 goto err;
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006283 }
6284 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285 }
6286 Py_XDECREF(idna);
6287 if (res0)
6288 freeaddrinfo(res0);
6289 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006290 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 Py_XDECREF(all);
6292 Py_XDECREF(idna);
6293 if (res0)
6294 freeaddrinfo(res0);
6295 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006296}
6297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006298PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006299"getaddrinfo(host, port [, family, type, proto, flags])\n\
6300 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006301\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006302Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006303
6304/* Python interface to getnameinfo(sa, flags). */
6305
6306/*ARGSUSED*/
6307static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006308socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 PyObject *sa = (PyObject *)NULL;
6311 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006312 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006313 int port;
6314 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6316 struct addrinfo hints, *res = NULL;
6317 int error;
6318 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006319 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 flags = flowinfo = scope_id = 0;
6322 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6323 return NULL;
6324 if (!PyTuple_Check(sa)) {
6325 PyErr_SetString(PyExc_TypeError,
6326 "getnameinfo() argument 1 must be a tuple");
6327 return NULL;
6328 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006329 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006331 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006333 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006334 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006335 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006336 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006337 return NULL;
6338 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6340 memset(&hints, 0, sizeof(hints));
6341 hints.ai_family = AF_UNSPEC;
6342 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006343 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 Py_BEGIN_ALLOW_THREADS
6345 ACQUIRE_GETADDRINFO_LOCK
6346 error = getaddrinfo(hostp, pbuf, &hints, &res);
6347 Py_END_ALLOW_THREADS
6348 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6349 if (error) {
6350 set_gaierror(error);
6351 goto fail;
6352 }
6353 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006354 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 "sockaddr resolved to multiple addresses");
6356 goto fail;
6357 }
6358 switch (res->ai_family) {
6359 case AF_INET:
6360 {
6361 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006362 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 "IPv4 sockaddr must be 2 tuple");
6364 goto fail;
6365 }
6366 break;
6367 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006368#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 case AF_INET6:
6370 {
6371 struct sockaddr_in6 *sin6;
6372 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006373 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 sin6->sin6_scope_id = scope_id;
6375 break;
6376 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006379 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6381 if (error) {
6382 set_gaierror(error);
6383 goto fail;
6384 }
Victor Stinner72400302016-01-28 15:41:01 +01006385
6386 name = sock_decode_hostname(hbuf);
6387 if (name == NULL)
6388 goto fail;
6389 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006390
6391fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 if (res)
6393 freeaddrinfo(res);
6394 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006395}
6396
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006397PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006398"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006399\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006400Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006401
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006402
6403/* Python API to getting and setting the default timeout value. */
6404
6405static PyObject *
6406socket_getdefaulttimeout(PyObject *self)
6407{
Victor Stinner71694d52015-03-28 01:18:54 +01006408 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006409 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 }
Victor Stinner71694d52015-03-28 01:18:54 +01006411 else {
6412 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6413 return PyFloat_FromDouble(seconds);
6414 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006415}
6416
6417PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006418"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006419\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006420Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006421A value of None indicates that new socket objects have no timeout.\n\
6422When the socket module is first imported, the default is None.");
6423
6424static PyObject *
6425socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6426{
Victor Stinner71694d52015-03-28 01:18:54 +01006427 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006428
Victor Stinner71694d52015-03-28 01:18:54 +01006429 if (socket_parse_timeout(&timeout, arg) < 0)
6430 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006433
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006434 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006435}
6436
6437PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006438"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006439\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006440Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006441A value of None indicates that new socket objects have no timeout.\n\
6442When the socket module is first imported, the default is None.");
6443
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006444#ifdef HAVE_IF_NAMEINDEX
6445/* Python API for getting interface indices and names */
6446
6447static PyObject *
6448socket_if_nameindex(PyObject *self, PyObject *arg)
6449{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006450 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006451 int i;
6452 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006453
Charles-François Natali60713592011-05-20 16:55:06 +02006454 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006455 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006456 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006457 return NULL;
6458 }
6459
6460 list = PyList_New(0);
6461 if (list == NULL) {
6462 if_freenameindex(ni);
6463 return NULL;
6464 }
6465
Charles-François Natali60713592011-05-20 16:55:06 +02006466 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6467 PyObject *ni_tuple = Py_BuildValue("IO&",
6468 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006469
6470 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6471 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006472 Py_DECREF(list);
6473 if_freenameindex(ni);
6474 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006475 }
6476 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006477 }
6478
6479 if_freenameindex(ni);
6480 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006481}
6482
6483PyDoc_STRVAR(if_nameindex_doc,
6484"if_nameindex()\n\
6485\n\
6486Returns a list of network interface information (index, name) tuples.");
6487
Charles-François Natali60713592011-05-20 16:55:06 +02006488static PyObject *
6489socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006490{
Charles-François Natali60713592011-05-20 16:55:06 +02006491 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006492 unsigned long index;
6493
Charles-François Natali60713592011-05-20 16:55:06 +02006494 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6495 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006496 return NULL;
6497
Charles-François Natali60713592011-05-20 16:55:06 +02006498 index = if_nametoindex(PyBytes_AS_STRING(oname));
6499 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006500 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006501 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006502 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006503 return NULL;
6504 }
6505
6506 return PyLong_FromUnsignedLong(index);
6507}
6508
6509PyDoc_STRVAR(if_nametoindex_doc,
6510"if_nametoindex(if_name)\n\
6511\n\
6512Returns the interface index corresponding to the interface name if_name.");
6513
Charles-François Natali60713592011-05-20 16:55:06 +02006514static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006515socket_if_indextoname(PyObject *self, PyObject *arg)
6516{
Charles-François Natali60713592011-05-20 16:55:06 +02006517 unsigned long index;
6518 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006519
Charles-François Natali60713592011-05-20 16:55:06 +02006520 index = PyLong_AsUnsignedLong(arg);
6521 if (index == (unsigned long) -1)
6522 return NULL;
6523
6524 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006525 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006526 return NULL;
6527 }
6528
Charles-François Natali60713592011-05-20 16:55:06 +02006529 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006530}
6531
6532PyDoc_STRVAR(if_indextoname_doc,
6533"if_indextoname(if_index)\n\
6534\n\
6535Returns the interface name corresponding to the interface index if_index.");
6536
6537#endif /* HAVE_IF_NAMEINDEX */
6538
6539
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006540#ifdef CMSG_LEN
6541/* Python interface to CMSG_LEN(length). */
6542
6543static PyObject *
6544socket_CMSG_LEN(PyObject *self, PyObject *args)
6545{
6546 Py_ssize_t length;
6547 size_t result;
6548
6549 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6550 return NULL;
6551 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6552 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6553 return NULL;
6554 }
6555 return PyLong_FromSize_t(result);
6556}
6557
6558PyDoc_STRVAR(CMSG_LEN_doc,
6559"CMSG_LEN(length) -> control message length\n\
6560\n\
6561Return the total length, without trailing padding, of an ancillary\n\
6562data item with associated data of the given length. This value can\n\
6563often be used as the buffer size for recvmsg() to receive a single\n\
6564item of ancillary data, but RFC 3542 requires portable applications to\n\
6565use CMSG_SPACE() and thus include space for padding, even when the\n\
6566item will be the last in the buffer. Raises OverflowError if length\n\
6567is outside the permissible range of values.");
6568
6569
6570#ifdef CMSG_SPACE
6571/* Python interface to CMSG_SPACE(length). */
6572
6573static PyObject *
6574socket_CMSG_SPACE(PyObject *self, PyObject *args)
6575{
6576 Py_ssize_t length;
6577 size_t result;
6578
6579 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6580 return NULL;
6581 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6582 PyErr_SetString(PyExc_OverflowError,
6583 "CMSG_SPACE() argument out of range");
6584 return NULL;
6585 }
6586 return PyLong_FromSize_t(result);
6587}
6588
6589PyDoc_STRVAR(CMSG_SPACE_doc,
6590"CMSG_SPACE(length) -> buffer size\n\
6591\n\
6592Return the buffer size needed for recvmsg() to receive an ancillary\n\
6593data item with associated data of the given length, along with any\n\
6594trailing padding. The buffer space needed to receive multiple items\n\
6595is the sum of the CMSG_SPACE() values for their associated data\n\
6596lengths. Raises OverflowError if length is outside the permissible\n\
6597range of values.");
6598#endif /* CMSG_SPACE */
6599#endif /* CMSG_LEN */
6600
6601
Guido van Rossum30a685f1991-06-27 15:51:29 +00006602/* List of functions exported by this module. */
6603
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006604static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 {"gethostbyname", socket_gethostbyname,
6606 METH_VARARGS, gethostbyname_doc},
6607 {"gethostbyname_ex", socket_gethostbyname_ex,
6608 METH_VARARGS, ghbn_ex_doc},
6609 {"gethostbyaddr", socket_gethostbyaddr,
6610 METH_VARARGS, gethostbyaddr_doc},
6611 {"gethostname", socket_gethostname,
6612 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006613#ifdef HAVE_SETHOSTNAME
6614 {"sethostname", socket_sethostname,
6615 METH_VARARGS, sethostname_doc},
6616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 {"getservbyname", socket_getservbyname,
6618 METH_VARARGS, getservbyname_doc},
6619 {"getservbyport", socket_getservbyport,
6620 METH_VARARGS, getservbyport_doc},
6621 {"getprotobyname", socket_getprotobyname,
6622 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006623 {"close", socket_close,
6624 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006625#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 {"dup", socket_dup,
6627 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006628#endif
Dave Cole331708b2004-08-09 04:51:41 +00006629#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 {"socketpair", socket_socketpair,
6631 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 {"ntohs", socket_ntohs,
6634 METH_VARARGS, ntohs_doc},
6635 {"ntohl", socket_ntohl,
6636 METH_O, ntohl_doc},
6637 {"htons", socket_htons,
6638 METH_VARARGS, htons_doc},
6639 {"htonl", socket_htonl,
6640 METH_O, htonl_doc},
6641 {"inet_aton", socket_inet_aton,
6642 METH_VARARGS, inet_aton_doc},
6643 {"inet_ntoa", socket_inet_ntoa,
6644 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006645#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 {"inet_pton", socket_inet_pton,
6647 METH_VARARGS, inet_pton_doc},
6648 {"inet_ntop", socket_inet_ntop,
6649 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006650#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006651 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6652 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 {"getnameinfo", socket_getnameinfo,
6654 METH_VARARGS, getnameinfo_doc},
6655 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6656 METH_NOARGS, getdefaulttimeout_doc},
6657 {"setdefaulttimeout", socket_setdefaulttimeout,
6658 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006659#ifdef HAVE_IF_NAMEINDEX
6660 {"if_nameindex", socket_if_nameindex,
6661 METH_NOARGS, if_nameindex_doc},
6662 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006663 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006664 {"if_indextoname", socket_if_indextoname,
6665 METH_O, if_indextoname_doc},
6666#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006667#ifdef CMSG_LEN
6668 {"CMSG_LEN", socket_CMSG_LEN,
6669 METH_VARARGS, CMSG_LEN_doc},
6670#ifdef CMSG_SPACE
6671 {"CMSG_SPACE", socket_CMSG_SPACE,
6672 METH_VARARGS, CMSG_SPACE_doc},
6673#endif
6674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006676};
6677
Guido van Rossum30a685f1991-06-27 15:51:29 +00006678
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006679#ifdef MS_WINDOWS
6680#define OS_INIT_DEFINED
6681
6682/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006683
6684static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006685os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006688}
6689
6690static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006691os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 WSADATA WSAData;
6694 int ret;
6695 ret = WSAStartup(0x0101, &WSAData);
6696 switch (ret) {
6697 case 0: /* No error */
6698 Py_AtExit(os_cleanup);
6699 return 1; /* Success */
6700 case WSASYSNOTREADY:
6701 PyErr_SetString(PyExc_ImportError,
6702 "WSAStartup failed: network not ready");
6703 break;
6704 case WSAVERNOTSUPPORTED:
6705 case WSAEINVAL:
6706 PyErr_SetString(
6707 PyExc_ImportError,
6708 "WSAStartup failed: requested version not supported");
6709 break;
6710 default:
6711 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6712 break;
6713 }
6714 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006715}
6716
Guido van Rossum8d665e61996-06-26 18:22:49 +00006717#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006718
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006719
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006720
6721#ifndef OS_INIT_DEFINED
6722static int
6723os_init(void)
6724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006726}
6727#endif
6728
6729
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006730/* C API table - always add new things to the end for binary
6731 compatibility. */
6732static
6733PySocketModule_APIObject PySocketModuleAPI =
6734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006736 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006737 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006738};
6739
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006740
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006741/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006742
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006743 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006744 "socket.py" which implements some additional functionality.
6745 The import of "_socket" may fail with an ImportError exception if
6746 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006747 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006748 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006749*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006750
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006751PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006752"Implementation module for socket operations.\n\
6753\n\
6754See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006755
Martin v. Löwis1a214512008-06-11 05:26:20 +00006756static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757 PyModuleDef_HEAD_INIT,
6758 PySocket_MODULE_NAME,
6759 socket_doc,
6760 -1,
6761 socket_methods,
6762 NULL,
6763 NULL,
6764 NULL,
6765 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006766};
6767
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006768PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006769PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006771 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 if (!os_init())
6774 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006775
Victor Stinnerdaf45552013-08-28 00:53:59 +02006776#ifdef MS_WINDOWS
6777 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006778 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006779 }
6780#endif
6781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782 Py_TYPE(&sock_type) = &PyType_Type;
6783 m = PyModule_Create(&socketmodule);
6784 if (m == NULL)
6785 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006786
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006787 Py_INCREF(PyExc_OSError);
6788 PySocketModuleAPI.error = PyExc_OSError;
6789 Py_INCREF(PyExc_OSError);
6790 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006792 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793 if (socket_herror == NULL)
6794 return NULL;
6795 Py_INCREF(socket_herror);
6796 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006797 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798 NULL);
6799 if (socket_gaierror == NULL)
6800 return NULL;
6801 Py_INCREF(socket_gaierror);
6802 PyModule_AddObject(m, "gaierror", socket_gaierror);
6803 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006804 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006805 if (socket_timeout == NULL)
6806 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006807 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006808 Py_INCREF(socket_timeout);
6809 PyModule_AddObject(m, "timeout", socket_timeout);
6810 Py_INCREF((PyObject *)&sock_type);
6811 if (PyModule_AddObject(m, "SocketType",
6812 (PyObject *)&sock_type) != 0)
6813 return NULL;
6814 Py_INCREF((PyObject *)&sock_type);
6815 if (PyModule_AddObject(m, "socket",
6816 (PyObject *)&sock_type) != 0)
6817 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006818
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006819#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006821#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006824 Py_INCREF(has_ipv6);
6825 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006827 /* Export C API */
6828 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6829 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6830 ) != 0)
6831 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006833 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006834#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006836#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006838#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006840#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006841#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006844#endif
6845#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006847#endif
6848#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006851#endif
6852#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006855#endif
6856#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006859#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006860#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006863#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006867#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006868#ifdef HAVE_SOCKADDR_ALG
6869 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6870#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006871#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006872 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006874#endif
6875#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006877#endif
6878#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006879 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006881#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006882#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006885#endif
6886#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006889#endif
6890#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006893#endif
6894#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006897#endif
6898#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, AF_NETLINK);
6901 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006902#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006904#endif
6905#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006907#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6909 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006910#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006912#endif
6913#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006915#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006916#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006918#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006919#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006921#endif
6922#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006924#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006926#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006928#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006929#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006931#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006932#ifdef NETLINK_CRYPTO
6933 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6934#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006935#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006936
6937#ifdef AF_VSOCK
6938 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6939 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6940 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6941 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6942 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6943 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6944 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6945 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6946 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6947#endif
6948
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006949#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006952#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006953#ifdef AF_LINK
6954 PyModule_AddIntMacro(m, AF_LINK);
6955#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006956#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006959#endif
6960#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006963#endif
6964#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006967#endif
6968#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006971#endif
6972#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006975#endif
6976#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006979#endif
6980#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006983#endif
6984#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006987#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006988
Hye-Shik Chang81268602004-02-02 06:05:24 +00006989#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6991 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6992 PyModule_AddIntMacro(m, BTPROTO_HCI);
6993 PyModule_AddIntMacro(m, SOL_HCI);
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_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006996#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006997#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006998#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007000#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7002 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007003#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7006 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007007#endif
7008
Charles-François Natali47413c12011-10-06 19:47:44 +02007009#ifdef AF_CAN
7010 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007012#endif
7013#ifdef PF_CAN
7014 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007016#endif
7017
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007018/* Reliable Datagram Sockets */
7019#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007021#endif
7022#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007024#endif
7025
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007026/* Kernel event messages */
7027#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007029#endif
7030#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007032#endif
7033
Antoine Pitroub156a462010-10-27 20:13:57 +00007034#ifdef AF_PACKET
7035 PyModule_AddIntMacro(m, AF_PACKET);
7036#endif
7037#ifdef PF_PACKET
7038 PyModule_AddIntMacro(m, PF_PACKET);
7039#endif
7040#ifdef PACKET_HOST
7041 PyModule_AddIntMacro(m, PACKET_HOST);
7042#endif
7043#ifdef PACKET_BROADCAST
7044 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7045#endif
7046#ifdef PACKET_MULTICAST
7047 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7048#endif
7049#ifdef PACKET_OTHERHOST
7050 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7051#endif
7052#ifdef PACKET_OUTGOING
7053 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7054#endif
7055#ifdef PACKET_LOOPBACK
7056 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7057#endif
7058#ifdef PACKET_FASTROUTE
7059 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007060#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007061
Christian Heimes043d6f62008-01-07 17:19:16 +00007062#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7067 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7068 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007069
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7071 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7072 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007074 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, SOL_TIPC);
7076 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7077 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7078 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7079 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007080
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7082 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7083 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7084 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7088 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007089#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007092#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7094 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7095 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7096 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7097 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7098 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007099#endif
7100
Christian Heimesdffa3942016-09-05 23:54:41 +02007101#ifdef HAVE_SOCKADDR_ALG
7102 /* Socket options */
7103 PyModule_AddIntMacro(m, ALG_SET_KEY);
7104 PyModule_AddIntMacro(m, ALG_SET_IV);
7105 PyModule_AddIntMacro(m, ALG_SET_OP);
7106 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7107 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7108 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7109
7110 /* Operations */
7111 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7112 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7113 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7114 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7115#endif
7116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, SOCK_STREAM);
7119 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007120/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007121#ifdef SOCK_RAW
7122 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007124#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007126#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007128#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007129#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007131#endif
7132#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007134#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007144#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007145#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007147#endif
7148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007161#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007166#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007167#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007170#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007198#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007199#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007201#endif
7202#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007204#endif
7205#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007207#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007208#ifdef SO_PASSSEC
7209 PyModule_AddIntMacro(m, SO_PASSSEC);
7210#endif
7211#ifdef SO_PEERSEC
7212 PyModule_AddIntMacro(m, SO_PEERSEC);
7213#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007214#ifdef SO_BINDTODEVICE
7215 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7216#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007217#ifdef SO_PRIORITY
7218 PyModule_AddIntMacro(m, SO_PRIORITY);
7219#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007220#ifdef SO_MARK
7221 PyModule_AddIntMacro(m, SO_MARK);
7222#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007223#ifdef SO_DOMAIN
7224 PyModule_AddIntMacro(m, SO_DOMAIN);
7225#endif
7226#ifdef SO_PROTOCOL
7227 PyModule_AddIntMacro(m, SO_PROTOCOL);
7228#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 /* Maximum number of connections for "listen" */
7231#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007235#endif
7236
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007237 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007238#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007240#endif
7241#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007243#endif
7244#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007246#endif
7247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248 /* Flags for send, recv */
7249#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007278#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007279#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007281#endif
7282#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007284#endif
7285#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007287#endif
7288#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007290#endif
7291#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007293#endif
7294#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007296#endif
7297#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007299#endif
7300#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007302#endif
7303#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007305#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007306#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007308#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 /* Protocol level and numbers, usable for [gs]etsockopt */
7311#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007316#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007319#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007325#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007341#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007343#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007344#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007346#endif
7347#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7349 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007350#endif
7351#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7353 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7354 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007355
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007356 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7357 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7358 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007359#ifdef CAN_ISOTP
7360 PyModule_AddIntMacro(m, CAN_ISOTP);
7361#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007362#endif
7363#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7365 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7366 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7367 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007368#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007369#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7370 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7371#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007372#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007374 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7375 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7376 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7377 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7378 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7379 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7380 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7381 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7382 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7383 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7384 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7385 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7386#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007387#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007389#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007390#ifdef HAVE_SOCKADDR_ALG
7391 PyModule_AddIntMacro(m, SOL_ALG);
7392#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007393#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007395#endif
7396#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007398#endif
7399#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007401#endif
7402#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007404#endif
7405#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007407#endif
7408#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007411#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007413#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007421#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007422 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007433#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007452#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007458#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007479#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007482#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007485#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007511#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007512#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
7518/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007521#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
7527
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007528#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007530#endif
7531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532 /* Some port configuration */
7533#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007541 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007542#endif
7543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544 /* Some reserved IP v.4 addresses */
7545#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007547#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007552#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007553 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007557#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007560#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007562#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007563 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565#ifdef INADDR_ALLHOSTS_GROUP
7566 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7567 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007573#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007574 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007580#endif
7581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582 /* IPv4 [gs]etsockopt options */
7583#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007592#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007610#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007613#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007628#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007630#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007631#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007633#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7636#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007654 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007655#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007658 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007659#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007661#endif
7662#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007664#endif
7665#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007667#endif
7668#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007670#endif
7671#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007673#endif
7674#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007676#endif
7677#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007679#endif
7680#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007682#endif
7683#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007685#endif
7686#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007688#endif
7689#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007691#endif
7692#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007694#endif
7695#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007696 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007697#endif
7698#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007699 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007700#endif
7701#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007702 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007703#endif
7704#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007706#endif
7707#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007708 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007709#endif
7710#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007711 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007712#endif
7713#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007714 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007715#endif
7716#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007717 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007718#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720 /* TCP options */
7721#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007725 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007728 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007730#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007731 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007734 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007736#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007737 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007739#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007740 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007742#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007743 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007745#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007746 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007749 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007751#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007752 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007754#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007755 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007756#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007757#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007758 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007759#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007760#ifdef TCP_CONGESTION
7761 PyModule_AddIntMacro(m, TCP_CONGESTION);
7762#endif
7763#ifdef TCP_USER_TIMEOUT
7764 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7765#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007766#ifdef TCP_NOTSENT_LOWAT
7767 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7768#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007770 /* IPX options */
7771#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007772 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007773#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007774
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007775/* Reliable Datagram Sockets */
7776#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007777 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007778#endif
7779#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007781#endif
7782#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007783 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007784#endif
7785#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007787#endif
7788#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007790#endif
7791#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007793#endif
7794#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007796#endif
7797#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007799#endif
7800#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007802#endif
7803#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007805#endif
7806#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007808#endif
7809#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007811#endif
7812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007813 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007814#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007816#endif
7817#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007819#endif
7820#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007822#endif
7823#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007824 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007825#endif
7826#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007827 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007828#endif
7829#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007830 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007831#endif
7832#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007833 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007834#endif
7835#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007837#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007838#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007839 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007840#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007841#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007842 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007843#endif
7844#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007845 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007846#endif
7847#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007848 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007849#endif
7850#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007851 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007852#endif
7853#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007854 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007855#endif
7856#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007857 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007858#endif
7859#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007860 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007861#endif
7862#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007863 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007864#endif
7865#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007866 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007867#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007868#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007869 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007870#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007871#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007872 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007873#endif
7874#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007875 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007876#endif
7877#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007879#endif
7880#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007881 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007882#endif
7883#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007884 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007885#endif
7886#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007887 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007888#endif
7889#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007890 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007891#endif
7892#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007893 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007894#endif
7895#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007896 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007897#endif
7898#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007900#endif
7901#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007902 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007903#endif
7904#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007905 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007906#endif
7907#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007908 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007909#endif
7910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007912#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007914#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007915 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007916#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007918#endif
7919#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007920 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007921#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007922 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007923#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007924 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007925#endif
7926#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007927 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007928#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007929 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007930#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007932#endif
7933
Christian Heimesfaf2f632008-01-06 16:59:19 +00007934#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007936 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7937#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007938 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007939#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007940 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007941 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7942#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007943 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007944#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007945 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007947 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007948 PyObject *tmp;
7949 tmp = PyLong_FromUnsignedLong(codes[i]);
7950 if (tmp == NULL)
7951 return NULL;
7952 PyModule_AddObject(m, names[i], tmp);
7953 }
7954 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007955 PyModule_AddIntMacro(m, RCVALL_OFF);
7956 PyModule_AddIntMacro(m, RCVALL_ON);
7957 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007958#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007960#endif
7961#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007963#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007964#endif /* _MSTCPIP_ */
7965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007967#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007969#endif
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08007970
7971#ifdef MS_WINDOWS
7972 /* remove some flags on older version Windows during run-time */
7973 remove_unusable_flags(m);
7974#endif
7975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007977}