blob: 014f3ba8b5ea98b0f4d6217d81d15cf65d6cdfbe [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100105"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
106socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000107\n\
108Open a socket of the given type. The family argument specifies the\n\
109address family; it defaults to AF_INET. The type argument specifies\n\
110whether this is a stream (SOCK_STREAM, this is the default)\n\
111or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
112specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200113The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100115When a fileno is passed in, family, type and proto are auto-detected,\n\
116unless they are explicitly set.\n\
117\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118A socket object represents one endpoint of a network connection.\n\
119\n\
120Methods of socket objects (keyword arguments not allowed):\n\
121\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000122_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000123bind(addr) -- bind the socket to a local address\n\
124close() -- close the socket\n\
125connect(addr) -- connect the socket to a remote address\n\
126connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200127dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000128fileno() -- return underlying file descriptor\n\
129getpeername() -- return remote address [*]\n\
130getsockname() -- return local address\n\
131getsockopt(level, optname[, buflen]) -- get socket options\n\
132gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100133listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000134recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000135recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000137recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000138 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000139sendall(data[, flags]) -- send all data\n\
140send(data[, flags]) -- send data, may not send all of it\n\
141sendto(data[, flags], addr) -- send data to a given address\n\
142setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500143getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200144setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145settimeout(None | float) -- set or clear the timeout\n\
146shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700147if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700148if_nametoindex(name) -- return the corresponding interface index\n\
149if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000151 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000152
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000153/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000154 I hope some day someone can clean this up please... */
155
Guido van Rossum9376b741999-09-15 22:01:40 +0000156/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
157 script doesn't get this right, so we hardcode some platform checks below.
158 On the other hand, not all Linux versions agree, so there the settings
159 computed by the configure script are needed! */
160
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700161#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R_3_ARG
163# undef HAVE_GETHOSTBYNAME_R_5_ARG
164# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000165#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000166
Victor Stinner710d27e2011-08-23 10:57:32 +0200167#if defined(__OpenBSD__)
168# include <sys/uio.h>
169#endif
170
Stefan Krah1f9eb872016-05-22 17:35:34 +0200171#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000173#endif
174
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000176# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define HAVE_GETHOSTBYNAME_R_3_ARG
178# elif defined(__sun) || defined(__sgi)
179# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700180# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000181/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000182# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
183# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# else
185# undef HAVE_GETHOSTBYNAME_R
186# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000187#endif
188
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200189#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000191#endif
192
Ned Deilye1d4e582016-02-23 22:05:29 +1100193/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000194#ifdef HAVE_SYS_PARAM_H
195#include <sys/param.h>
196#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000197/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100198 (this includes the getaddrinfo emulation) protect access with a lock.
199
200 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
201 a mix of code including an unsafe implementation from an old BSD's
202 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
203 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100205
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
207 http://www.openbsd.org/plus54.html
208
209 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
210
211http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100212 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200213#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100214 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000215 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100216 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
217 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100218 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000219#define USE_GETADDRINFO_LOCK
220#endif
221
222#ifdef USE_GETADDRINFO_LOCK
223#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
224#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
225#else
226#define ACQUIRE_GETADDRINFO_LOCK
227#define RELEASE_GETADDRINFO_LOCK
228#endif
229
230#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000232#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000233
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000234
Serhiy Storchakad3187152017-11-09 18:00:38 +0200235#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100236# include <sys/ioctl.h>
237#endif
238
239
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241/* make sure that the reentrant (gethostbyaddr_r etc)
242 functions are declared correctly if compiling with
243 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244
Thomas Wouters477c8d52006-05-27 19:21:47 +0000245/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000247#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000249
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000250#undef _XOPEN_SOURCE
251#include <sys/socket.h>
252#include <sys/types.h>
253#include <netinet/in.h>
254#ifdef _SS_ALIGNSIZE
255#define HAVE_GETADDRINFO 1
256#define HAVE_GETNAMEINFO 1
257#endif
258
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000259#define HAVE_INET_PTON
260#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000261#endif
262
Benjamin Peterson06930632017-09-04 16:36:05 -0700263/* Solaris fails to define this variable at all. */
264#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000265#define INET_ADDRSTRLEN 16
266#endif
267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000270#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700273#ifdef HAVE_SYS_SOCKET_H
274#include <sys/socket.h>
275#endif
276
277#ifdef HAVE_NET_IF_H
278#include <net/if.h>
279#endif
280
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000281/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000283#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284
285/* Addressing includes */
286
Guido van Rossum6f489d91996-06-28 20:15:15 +0000287#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
289/* Non-MS WINDOWS includes */
290# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000291# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000292
Guido van Rossum9376b741999-09-15 22:01:40 +0000293/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000298#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301# ifdef HAVE_FCNTL_H
302# include <fcntl.h>
303# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304
Steve Dower65e4cb12014-11-22 12:54:57 -0800305/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200306#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800307
animalize19e7d482018-02-27 02:10:36 +0800308/* remove some flags on older version Windows during run-time.
309 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
310typedef struct {
311 DWORD build_number; /* available starting with this Win10 BuildNumber */
312 const char flag_name[20];
313} FlagRuntimeInfo;
314
315/* IMPORTANT: make sure the list ordered by descending build_number */
316static FlagRuntimeInfo win_runtime_flags[] = {
317 /* available starting with Windows 10 1709 */
318 {16299, "TCP_KEEPIDLE"},
319 {16299, "TCP_KEEPINTVL"},
320 /* available starting with Windows 10 1703 */
321 {15063, "TCP_KEEPCNT"},
322 /* available starting with Windows 10 1607 */
323 {14393, "TCP_FASTOPEN"}
324};
325
326static void
327remove_unusable_flags(PyObject *m)
328{
329 PyObject *dict;
330 OSVERSIONINFOEX info;
331 DWORDLONG dwlConditionMask;
332
333 dict = PyModule_GetDict(m);
334 if (dict == NULL) {
335 return;
336 }
337
338 /* set to Windows 10, except BuildNumber. */
339 memset(&info, 0, sizeof(info));
340 info.dwOSVersionInfoSize = sizeof(info);
341 info.dwMajorVersion = 10;
342 info.dwMinorVersion = 0;
343
344 /* set Condition Mask */
345 dwlConditionMask = 0;
346 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
347 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
348 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
349
350 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
351 info.dwBuildNumber = win_runtime_flags[i].build_number;
352 /* greater than or equal to the specified version?
353 Compatibility Mode will not cheat VerifyVersionInfo(...) */
354 if (VerifyVersionInfo(
355 &info,
356 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
357 dwlConditionMask)) {
358 break;
359 }
360 else {
361 if (PyDict_GetItemString(
362 dict,
363 win_runtime_flags[i].flag_name) != NULL) {
364 PyDict_DelItemString(
365 dict,
366 win_runtime_flags[i].flag_name);
367 }
368 }
369 }
370}
371
Jeremy Hylton22308652001-02-02 03:23:09 +0000372#endif
373
Skip Montanaro7befb992004-02-10 16:50:21 +0000374#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000375
Neal Norwitz39d22e52002-11-02 19:55:21 +0000376#ifndef O_NONBLOCK
377# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000378#endif
379
Trent Micka708d6e2004-09-07 17:48:26 +0000380/* include Python's addrinfo.h unless it causes trouble */
381#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
382 /* Do not include addinfo.h on some newer IRIX versions.
383 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
384 * for example, but not by 6.5.10.
385 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000386#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000387 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
388 * EAI_* constants are defined in (the already included) ws2tcpip.h.
389 */
390#else
391# include "addrinfo.h"
392#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000393
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000394#ifdef __APPLE__
395/* On OS X, getaddrinfo returns no error indication of lookup
396 failure, so we must use the emulation instead of the libinfo
397 implementation. Unfortunately, performing an autoconf test
398 for this bug would require DNS access for the machine performing
399 the configuration, which is not acceptable. Therefore, we
400 determine the bug just by checking for __APPLE__. If this bug
401 gets ever fixed, perhaps checking for sys/version.h would be
402 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000403#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600404/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000405 Find to check for Jaguar is that it has getnameinfo(), which
406 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000407#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000408#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409
410#ifdef HAVE_INET_ATON
411#define USE_INET_ATON_WEAKLINK
412#endif
413
Jack Jansen84262fb2002-07-02 14:40:42 +0000414#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000415
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000416/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000418/* avoid clashes with the C library definition of the symbol. */
419#define getaddrinfo fake_getaddrinfo
420#define gai_strerror fake_gai_strerror
421#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000422#include "getaddrinfo.c"
423#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000424#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000425#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000426#include "getnameinfo.c"
427#endif
428
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000429#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000430#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000431#endif
432
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000433#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000434#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000435#define EAFNOSUPPORT WSAEAFNOSUPPORT
436#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000438
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000439#ifndef SOCKETCLOSE
440#define SOCKETCLOSE close
441#endif
442
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000443#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000444#define USE_BLUETOOTH 1
445#if defined(__FreeBSD__)
446#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
447#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000448#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000449#define SOL_HCI SOL_HCI_RAW
450#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000451#define sockaddr_l2 sockaddr_l2cap
452#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000454#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
455#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000456#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000457#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458#define sockaddr_l2 sockaddr_bt
459#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000462#define SOL_HCI BTPROTO_HCI
463#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
465#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000466#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000468#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000469#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
470#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000471#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000472#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
473#endif
474#endif
475
Charles-François Natali8b759652011-12-23 16:44:51 +0100476/* Convert "sock_addr_t *" to "struct sockaddr *". */
477#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000478
Martin v. Löwise9416172003-05-03 10:12:45 +0000479/*
480 * Constants for getnameinfo()
481 */
482#if !defined(NI_MAXHOST)
483#define NI_MAXHOST 1025
484#endif
485#if !defined(NI_MAXSERV)
486#define NI_MAXSERV 32
487#endif
488
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000489#ifndef INVALID_SOCKET /* MS defines this */
490#define INVALID_SOCKET (-1)
491#endif
492
Charles-François Natali0cc86852013-09-13 19:53:08 +0200493#ifndef INADDR_NONE
494#define INADDR_NONE (-1)
495#endif
496
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000497/* XXX There's a problem here: *static* functions are not supposed to have
498 a Py prefix (or use CapitalizedWords). Later... */
499
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500/* Global variable holding the exception type for errors detected
501 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000502static PyObject *socket_herror;
503static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000504static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505
Tim Peters643a7fc2002-02-17 04:13:21 +0000506/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000507 The sock_type variable contains pointers to various functions,
508 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000509 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000510static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000511
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000512#if defined(HAVE_POLL_H)
513#include <poll.h>
514#elif defined(HAVE_SYS_POLL_H)
515#include <sys/poll.h>
516#endif
517
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000518/* Largest value to try to store in a socklen_t (used when handling
519 ancillary data). POSIX requires socklen_t to hold at least
520 (2**31)-1 and recommends against storing larger values, but
521 socklen_t was originally int in the BSD interface, so to be on the
522 safe side we use the smaller of (2**31)-1 and INT_MAX. */
523#if INT_MAX > 0x7fffffff
524#define SOCKLEN_T_LIMIT 0x7fffffff
525#else
526#define SOCKLEN_T_LIMIT INT_MAX
527#endif
528
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200529#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000530/* Instead of select(), we'll use poll() since poll() works on any fd. */
531#define IS_SELECTABLE(s) 1
532/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000533#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200534/* If there's no timeout left, we don't have to call select, so it's a safe,
535 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100536#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000537#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000538
539static PyObject*
540select_error(void)
541{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200542 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000544}
545
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000546#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000547#ifndef WSAEAGAIN
548#define WSAEAGAIN WSAEWOULDBLOCK
549#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000550#define CHECK_ERRNO(expected) \
551 (WSAGetLastError() == WSA ## expected)
552#else
553#define CHECK_ERRNO(expected) \
554 (errno == expected)
555#endif
556
Victor Stinnerdaf45552013-08-28 00:53:59 +0200557#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200558# define GET_SOCK_ERROR WSAGetLastError()
559# define SET_SOCK_ERROR(err) WSASetLastError(err)
560# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
561# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
562#else
563# define GET_SOCK_ERROR errno
564# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
565# define SOCK_TIMEOUT_ERR EWOULDBLOCK
566# define SOCK_INPROGRESS_ERR EINPROGRESS
567#endif
568
Erik Janssens874809e2018-09-05 08:29:42 +0200569#ifdef _MSC_VER
570# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
571#else
572# define SUPPRESS_DEPRECATED_CALL
573#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200574
575#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200576/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
577static int support_wsa_no_inherit = -1;
578#endif
579
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580/* Convenience function to raise an error according to errno
581 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582
Guido van Rossum73624e91994-10-10 17:59:00 +0000583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000584set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000586#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 int err_no = WSAGetLastError();
588 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
589 recognizes the error codes used by both GetLastError() and
590 WSAGetLastError */
591 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200592 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000593#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000594
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200595 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596}
597
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000600set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000603
604#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (v != NULL) {
610 PyErr_SetObject(socket_herror, v);
611 Py_DECREF(v);
612 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615}
616
617
618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000619set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622
Martin v. Löwis272cb402002-03-01 08:31:07 +0000623#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* EAI_SYSTEM is not available on Windows XP. */
625 if (error == EAI_SYSTEM)
626 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000627#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000629#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000631#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 if (v != NULL) {
635 PyErr_SetObject(socket_gaierror, v);
636 Py_DECREF(v);
637 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640}
641
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000642/* Function to perform the setting of socket blocking mode
643 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644static int
645internal_setblocking(PySocketSockObject *s, int block)
646{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400647 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200648#ifdef MS_WINDOWS
649 u_long arg;
650#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100651#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100652 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100653 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100658#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200660 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400661 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200664 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400665 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100667 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 else
Victor Stinner9a954832013-12-04 00:41:24 +0100669 new_delay_flag = delay_flag | O_NONBLOCK;
670 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200671 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400672 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100673#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200675 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200676 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400677 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400679
680 result = 0;
681
682 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684
Yury Selivanovfa22b292016-10-18 16:03:52 -0400685 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200686#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400687 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200688#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200690#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691 }
692
693 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694}
695
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000696static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200697internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
698 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100701#ifdef HAVE_POLL
702 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200703 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100704#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200705 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200706 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100707#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000708
Victor Stinnerb7df3142015-03-27 22:59:32 +0100709 /* must be called with the GIL held */
710 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100711
Victor Stinner416f2e62015-03-31 13:56:29 +0200712 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200713 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200716 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 /* Prefer poll, if available, since you can poll() any fd
720 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100722 pollfd.fd = s->sock_fd;
723 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200724 if (connect) {
725 /* On Windows, the socket becomes writable on connection success,
726 but a connection failure is notified as an error. On POSIX, the
727 socket becomes writable on connection success or on connection
728 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200729 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Victor Stinner71694d52015-03-28 01:18:54 +0100732 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200733 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200734 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000735
Victor Stinner71694d52015-03-28 01:18:54 +0100736 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200737 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100738 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000739#else
Victor Stinnerced11742015-04-09 10:27:25 +0200740 if (interval >= 0) {
741 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
742 tvp = &tv;
743 }
744 else
745 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000746
Victor Stinner71694d52015-03-28 01:18:54 +0100747 FD_ZERO(&fds);
748 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200749 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200750 if (connect) {
751 /* On Windows, the socket becomes writable on connection success,
752 but a connection failure is notified as an error. On POSIX, the
753 socket becomes writable on connection success or on connection
754 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200755 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200756 }
Victor Stinner71694d52015-03-28 01:18:54 +0100757
758 /* See if the socket is ready */
759 Py_BEGIN_ALLOW_THREADS;
760 if (writing)
761 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200762 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100763 else
764 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200765 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100766 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000767#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (n < 0)
770 return -1;
771 if (n == 0)
772 return 1;
773 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000774}
775
Victor Stinner31bf2d52015-04-01 21:57:09 +0200776/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000777
Victor Stinner81c41db2015-04-02 11:50:57 +0200778 On error, raise an exception and return -1 if err is set, or fill err and
779 return -1 otherwise. If a signal was received and the signal handler raised
780 an exception, return -1, and set err to -1 if err is set.
781
782 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100783
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784 If the socket has a timeout, wait until the socket is ready before calling
785 the function: wait until the socket is writable if writing is nonzero, wait
786 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100787
Victor Stinner81c41db2015-04-02 11:50:57 +0200788 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200789 the function, except if the signal handler raised an exception (PEP 475).
790
791 When the function is retried, recompute the timeout using a monotonic clock.
792
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 sock_call_ex() must be called with the GIL held. The socket function is
794 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200796sock_call_ex(PySocketSockObject *s,
797 int writing,
798 int (*sock_func) (PySocketSockObject *s, void *data),
799 void *data,
800 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200801 int *err,
802 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803{
Victor Stinner8912d142015-04-06 23:16:34 +0200804 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 _PyTime_t deadline = 0;
806 int deadline_initialized = 0;
807 int res;
808
809 /* sock_call() must be called with the GIL held. */
810 assert(PyGILState_Check());
811
812 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200814 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 /* For connect(), poll even for blocking socket. The connection
816 runs asynchronously. */
817 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200819 _PyTime_t interval;
820
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 if (deadline_initialized) {
822 /* recompute the timeout */
823 interval = deadline - _PyTime_GetMonotonicClock();
824 }
825 else {
826 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200827 deadline = _PyTime_GetMonotonicClock() + timeout;
828 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830
Victor Stinner10550cd2015-04-03 13:22:27 +0200831 if (interval >= 0)
832 res = internal_select(s, writing, interval, connect);
833 else
834 res = 1;
835 }
836 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200837 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200838 }
839
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 if (err)
842 *err = GET_SOCK_ERROR;
843
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 if (CHECK_ERRNO(EINTR)) {
845 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200846 if (PyErr_CheckSignals()) {
847 if (err)
848 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200849 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200850 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851
852 /* retry select() */
853 continue;
854 }
855
856 /* select() failed */
857 s->errorhandler();
858 return -1;
859 }
860
861 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200862 if (err)
863 *err = SOCK_TIMEOUT_ERR;
864 else
865 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200866 return -1;
867 }
868
869 /* the socket is ready */
870 }
871
Victor Stinner81c41db2015-04-02 11:50:57 +0200872 /* inner loop to retry sock_func() when sock_func() is interrupted
873 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 while (1) {
875 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200877 Py_END_ALLOW_THREADS
878
879 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 /* sock_func() succeeded */
881 if (err)
882 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200883 return 0;
884 }
885
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 if (err)
887 *err = GET_SOCK_ERROR;
888
Victor Stinner31bf2d52015-04-01 21:57:09 +0200889 if (!CHECK_ERRNO(EINTR))
890 break;
891
Victor Stinner81c41db2015-04-02 11:50:57 +0200892 /* sock_func() was interrupted by a signal */
893 if (PyErr_CheckSignals()) {
894 if (err)
895 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200896 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200897 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898
Victor Stinner81c41db2015-04-02 11:50:57 +0200899 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200900 }
901
902 if (s->sock_timeout > 0
903 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200904 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200905
906 For example, select() could indicate a socket is ready for
907 reading, but the data then discarded by the OS because of a
908 wrong checksum.
909
910 Loop on select() to recheck for socket readyness. */
911 continue;
912 }
913
Victor Stinner81c41db2015-04-02 11:50:57 +0200914 /* sock_func() failed */
915 if (!err)
916 s->errorhandler();
917 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000918 return -1;
919 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200920}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000921
Victor Stinner81c41db2015-04-02 11:50:57 +0200922static int
923sock_call(PySocketSockObject *s,
924 int writing,
925 int (*func) (PySocketSockObject *s, void *data),
926 void *data)
927{
Victor Stinner8912d142015-04-06 23:16:34 +0200928 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200929}
930
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000931
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000932/* Initialize a new socket object. */
933
Victor Stinner88ed6402015-04-09 10:23:12 +0200934/* Default timeout for new sockets */
935static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000936
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200937static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000938init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 s->sock_fd = fd;
942 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500945
946 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
947 on some OSes as part of socket.type. We want to reset them here,
948 to make socket.type be set to the same value on all platforms.
949 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
950 not portable.
951 */
952#ifdef SOCK_NONBLOCK
953 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
954#endif
955#ifdef SOCK_CLOEXEC
956 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
957#endif
958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000962#ifdef SOCK_NONBLOCK
963 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100964 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000965 else
966#endif
967 {
968 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200969 if (defaulttimeout >= 0) {
970 if (internal_setblocking(s, 0) == -1) {
971 return -1;
972 }
973 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000974 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200975 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000976}
977
978
Guido van Rossum30a685f1991-06-27 15:51:29 +0000979/* Create a new socket object.
980 This just creates the object and initializes it.
981 If the creation fails, return NULL and set an exception (implicit
982 in NEWOBJ()). */
983
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000985new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 PySocketSockObject *s;
988 s = (PySocketSockObject *)
989 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200990 if (s == NULL)
991 return NULL;
992 if (init_sockobject(s, fd, family, type, proto) == -1) {
993 Py_DECREF(s);
994 return NULL;
995 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000997}
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Guido van Rossum48a680c2001-03-02 06:34:14 +00001000/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001001 thread to be in gethostbyname or getaddrinfo */
1002#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001003static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001004#endif
1005
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007/* Convert a string specifying a host name or one of a few symbolic
1008 names to a numeric IP address. This usually calls gethostbyname()
1009 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001010 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011 an error occurred; then an exception is raised. */
1012
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001014setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 struct addrinfo hints, *res;
1017 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1020 if (name[0] == '\0') {
1021 int siz;
1022 memset(&hints, 0, sizeof(hints));
1023 hints.ai_family = af;
1024 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1025 hints.ai_flags = AI_PASSIVE;
1026 Py_BEGIN_ALLOW_THREADS
1027 ACQUIRE_GETADDRINFO_LOCK
1028 error = getaddrinfo(NULL, "0", &hints, &res);
1029 Py_END_ALLOW_THREADS
1030 /* We assume that those thread-unsafe getaddrinfo() versions
1031 *are* safe regarding their return value, ie. that a
1032 subsequent call to getaddrinfo() does not destroy the
1033 outcome of the first call. */
1034 RELEASE_GETADDRINFO_LOCK
1035 if (error) {
1036 set_gaierror(error);
1037 return -1;
1038 }
1039 switch (res->ai_family) {
1040 case AF_INET:
1041 siz = 4;
1042 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001043#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 case AF_INET6:
1045 siz = 16;
1046 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 default:
1049 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001050 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 "unsupported address family");
1052 return -1;
1053 }
1054 if (res->ai_next) {
1055 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 "wildcard resolved to multiple address");
1058 return -1;
1059 }
1060 if (res->ai_addrlen < addr_ret_size)
1061 addr_ret_size = res->ai_addrlen;
1062 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1063 freeaddrinfo(res);
1064 return siz;
1065 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001066 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001067 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001068 if (strcmp(name, "255.255.255.255") == 0 ||
1069 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 struct sockaddr_in *sin;
1071 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001072 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 "address family mismatched");
1074 return -1;
1075 }
1076 sin = (struct sockaddr_in *)addr_ret;
1077 memset((void *) sin, '\0', sizeof(*sin));
1078 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 sin->sin_addr.s_addr = INADDR_BROADCAST;
1083 return sizeof(sin->sin_addr);
1084 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001085
1086 /* avoid a name resolution in case of numeric address */
1087#ifdef HAVE_INET_PTON
1088 /* check for an IPv4 address */
1089 if (af == AF_UNSPEC || af == AF_INET) {
1090 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1091 memset(sin, 0, sizeof(*sin));
1092 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1093 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001094#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001095 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001096#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001097 return 4;
1098 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001100#ifdef ENABLE_IPV6
1101 /* check for an IPv6 address - if the address contains a scope ID, we
1102 * fallback to getaddrinfo(), which can handle translation from interface
1103 * name to interface index */
1104 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1105 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1106 memset(sin, 0, sizeof(*sin));
1107 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1108 sin->sin6_family = AF_INET6;
1109#ifdef HAVE_SOCKADDR_SA_LEN
1110 sin->sin6_len = sizeof(*sin);
1111#endif
1112 return 16;
1113 }
1114 }
1115#endif /* ENABLE_IPV6 */
1116#else /* HAVE_INET_PTON */
1117 /* check for an IPv4 address */
1118 if (af == AF_INET || af == AF_UNSPEC) {
1119 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1120 memset(sin, 0, sizeof(*sin));
1121 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1122 sin->sin_family = AF_INET;
1123#ifdef HAVE_SOCKADDR_SA_LEN
1124 sin->sin_len = sizeof(*sin);
1125#endif
1126 return 4;
1127 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001128 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001129#endif /* HAVE_INET_PTON */
1130
1131 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 memset(&hints, 0, sizeof(hints));
1133 hints.ai_family = af;
1134 Py_BEGIN_ALLOW_THREADS
1135 ACQUIRE_GETADDRINFO_LOCK
1136 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001137#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 if (error == EAI_NONAME && af == AF_UNSPEC) {
1139 /* On Tru64 V5.1, numeric-to-addr conversion fails
1140 if no address family is given. Assume IPv4 for now.*/
1141 hints.ai_family = AF_INET;
1142 error = getaddrinfo(name, NULL, &hints, &res);
1143 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 Py_END_ALLOW_THREADS
1146 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1147 if (error) {
1148 set_gaierror(error);
1149 return -1;
1150 }
1151 if (res->ai_addrlen < addr_ret_size)
1152 addr_ret_size = res->ai_addrlen;
1153 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1154 freeaddrinfo(res);
1155 switch (addr_ret->sa_family) {
1156 case AF_INET:
1157 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001158#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 case AF_INET6:
1160 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001163 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return -1;
1165 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001166}
1167
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168
Коренберг Марк7766b962018-02-13 00:47:42 +05001169/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
Guido van Rossum73624e91994-10-10 17:59:00 +00001171static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001172make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173{
Коренберг Марк7766b962018-02-13 00:47:42 +05001174 char buf[INET_ADDRSTRLEN];
1175 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1176 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 return NULL;
1178 }
1179 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180}
1181
Коренберг Марк7766b962018-02-13 00:47:42 +05001182#ifdef ENABLE_IPV6
1183/* Convert IPv6 sockaddr to a Python str. */
1184
1185static PyObject *
1186make_ipv6_addr(const struct sockaddr_in6 *addr)
1187{
1188 char buf[INET6_ADDRSTRLEN];
1189 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1190 PyErr_SetFromErrno(PyExc_OSError);
1191 return NULL;
1192 }
1193 return PyUnicode_FromString(buf);
1194}
1195#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001196
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001197#ifdef USE_BLUETOOTH
1198/* Convert a string representation of a Bluetooth address into a numeric
1199 address. Returns the length (6), or raises an exception and returns -1 if
1200 an error occurred. */
1201
1202static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001203setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 unsigned int b0, b1, b2, b3, b4, b5;
1206 char ch;
1207 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1210 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1211 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1212 bdaddr->b[0] = b0;
1213 bdaddr->b[1] = b1;
1214 bdaddr->b[2] = b2;
1215 bdaddr->b[3] = b3;
1216 bdaddr->b[4] = b4;
1217 bdaddr->b[5] = b5;
1218 return 6;
1219 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001220 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 return -1;
1222 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001223}
1224
1225/* Create a string representation of the Bluetooth address. This is always a
1226 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1227 value (zero padded if necessary). */
1228
1229static PyObject *
1230makebdaddr(bdaddr_t *bdaddr)
1231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1235 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1236 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1237 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001238}
1239#endif
1240
1241
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242/* Create an object representing the given socket address,
1243 suitable for passing it back to bind(), connect() etc.
1244 The family field of the sockaddr structure is inspected
1245 to determine what kind of address it really is. */
1246
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001248static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001249makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 if (addrlen == 0) {
1252 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001253 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case AF_INET:
1259 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001260 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1261 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 PyObject *ret = NULL;
1263 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1265 Py_DECREF(addrobj);
1266 }
1267 return ret;
1268 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001269
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001270#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 case AF_UNIX:
1272 {
1273 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001274#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001275 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1276 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1277 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 }
1279 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001280#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 {
1282 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001283 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 }
1285 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001286#endif /* AF_UNIX */
1287
Martin v. Löwis11017b12006-01-14 18:12:57 +00001288#if defined(AF_NETLINK)
1289 case AF_NETLINK:
1290 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1292 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001293 }
1294#endif /* AF_NETLINK */
1295
caaveryeffc12f2017-09-06 18:18:10 -04001296#if defined(AF_VSOCK)
1297 case AF_VSOCK:
1298 {
1299 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1300 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1301 }
1302#endif /* AF_VSOCK */
1303
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001304#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_INET6:
1306 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001307 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1308 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 PyObject *ret = NULL;
1310 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001311 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 addrobj,
1313 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001314 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 a->sin6_scope_id);
1316 Py_DECREF(addrobj);
1317 }
1318 return ret;
1319 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001320#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001321
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001322#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 case AF_BLUETOOTH:
1324 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 case BTPROTO_L2CAP:
1327 {
1328 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1329 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1330 PyObject *ret = NULL;
1331 if (addrobj) {
1332 ret = Py_BuildValue("Oi",
1333 addrobj,
1334 _BT_L2_MEMB(a, psm));
1335 Py_DECREF(addrobj);
1336 }
1337 return ret;
1338 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 case BTPROTO_RFCOMM:
1341 {
1342 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1343 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1344 PyObject *ret = NULL;
1345 if (addrobj) {
1346 ret = Py_BuildValue("Oi",
1347 addrobj,
1348 _BT_RC_MEMB(a, channel));
1349 Py_DECREF(addrobj);
1350 }
1351 return ret;
1352 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 case BTPROTO_HCI:
1355 {
1356 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001357#if defined(__NetBSD__) || defined(__DragonFly__)
1358 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001359#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyObject *ret = NULL;
1361 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1362 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001363#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001365
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001366#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 case BTPROTO_SCO:
1368 {
1369 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1370 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1371 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001372#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 default:
1375 PyErr_SetString(PyExc_ValueError,
1376 "Unknown Bluetooth protocol");
1377 return NULL;
1378 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001379#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001380
Antoine Pitroub156a462010-10-27 20:13:57 +00001381#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 case AF_PACKET:
1383 {
1384 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001385 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 struct ifreq ifr;
1387 /* need to look up interface name give index */
1388 if (a->sll_ifindex) {
1389 ifr.ifr_ifindex = a->sll_ifindex;
1390 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1391 ifname = ifr.ifr_name;
1392 }
1393 return Py_BuildValue("shbhy#",
1394 ifname,
1395 ntohs(a->sll_protocol),
1396 a->sll_pkttype,
1397 a->sll_hatype,
1398 a->sll_addr,
1399 a->sll_halen);
1400 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001401#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001402
Christian Heimes043d6f62008-01-07 17:19:16 +00001403#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 case AF_TIPC:
1405 {
1406 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1407 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1408 return Py_BuildValue("IIIII",
1409 a->addrtype,
1410 a->addr.nameseq.type,
1411 a->addr.nameseq.lower,
1412 a->addr.nameseq.upper,
1413 a->scope);
1414 } else if (a->addrtype == TIPC_ADDR_NAME) {
1415 return Py_BuildValue("IIIII",
1416 a->addrtype,
1417 a->addr.name.name.type,
1418 a->addr.name.name.instance,
1419 a->addr.name.name.instance,
1420 a->scope);
1421 } else if (a->addrtype == TIPC_ADDR_ID) {
1422 return Py_BuildValue("IIIII",
1423 a->addrtype,
1424 a->addr.id.node,
1425 a->addr.id.ref,
1426 0,
1427 a->scope);
1428 } else {
1429 PyErr_SetString(PyExc_ValueError,
1430 "Invalid address type");
1431 return NULL;
1432 }
1433 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001434#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001435
Serhiy Storchakad3187152017-11-09 18:00:38 +02001436#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001437 case AF_CAN:
1438 {
1439 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001440 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001441 struct ifreq ifr;
1442 /* need to look up interface name given index */
1443 if (a->can_ifindex) {
1444 ifr.ifr_ifindex = a->can_ifindex;
1445 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1446 ifname = ifr.ifr_name;
1447 }
1448
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001449 switch (proto) {
1450#ifdef CAN_ISOTP
1451 case CAN_ISOTP:
1452 {
1453 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1454 ifname,
1455 a->can_addr.tp.rx_id,
1456 a->can_addr.tp.tx_id);
1457 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001458#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001459 default:
1460 {
1461 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1462 ifname);
1463 }
1464 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001466#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001467
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001468#ifdef PF_SYSTEM
1469 case PF_SYSTEM:
1470 switch(proto) {
1471#ifdef SYSPROTO_CONTROL
1472 case SYSPROTO_CONTROL:
1473 {
1474 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1475 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1476 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001477#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001478 default:
1479 PyErr_SetString(PyExc_ValueError,
1480 "Invalid address type");
1481 return 0;
1482 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001483#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001484
Christian Heimesdffa3942016-09-05 23:54:41 +02001485#ifdef HAVE_SOCKADDR_ALG
1486 case AF_ALG:
1487 {
1488 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1489 return Py_BuildValue("s#s#HH",
1490 a->salg_type,
1491 strnlen((const char*)a->salg_type,
1492 sizeof(a->salg_type)),
1493 a->salg_name,
1494 strnlen((const char*)a->salg_name,
1495 sizeof(a->salg_name)),
1496 a->salg_feat,
1497 a->salg_mask);
1498 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001499#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 default:
1504 /* If we don't know the address family, don't raise an
1505 exception -- return it as an (int, bytes) tuple. */
1506 return Py_BuildValue("iy#",
1507 addr->sa_family,
1508 addr->sa_data,
1509 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001512}
1513
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001514/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1515 (in particular, numeric IP addresses). */
1516struct maybe_idna {
1517 PyObject *obj;
1518 char *buf;
1519};
1520
1521static void
1522idna_cleanup(struct maybe_idna *data)
1523{
1524 Py_CLEAR(data->obj);
1525}
1526
1527static int
1528idna_converter(PyObject *obj, struct maybe_idna *data)
1529{
1530 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001531 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001532 if (obj == NULL) {
1533 idna_cleanup(data);
1534 return 1;
1535 }
1536 data->obj = NULL;
1537 len = -1;
1538 if (PyBytes_Check(obj)) {
1539 data->buf = PyBytes_AsString(obj);
1540 len = PyBytes_Size(obj);
1541 }
1542 else if (PyByteArray_Check(obj)) {
1543 data->buf = PyByteArray_AsString(obj);
1544 len = PyByteArray_Size(obj);
1545 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001546 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001547 if (PyUnicode_READY(obj) == -1) {
1548 return 0;
1549 }
1550 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001551 data->buf = PyUnicode_DATA(obj);
1552 len = PyUnicode_GET_LENGTH(obj);
1553 }
1554 else {
1555 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1556 if (!obj2) {
1557 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1558 return 0;
1559 }
1560 assert(PyBytes_Check(obj2));
1561 data->obj = obj2;
1562 data->buf = PyBytes_AS_STRING(obj2);
1563 len = PyBytes_GET_SIZE(obj2);
1564 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 }
1566 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001567 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1568 obj->ob_type->tp_name);
1569 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001570 }
1571 if (strlen(data->buf) != len) {
1572 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001573 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001574 return 0;
1575 }
1576 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001577}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001578
1579/* Parse a socket address argument according to the socket object's
1580 address family. Return 1 if the address was in the proper format,
1581 0 of not. The address is returned through addr_ret, its length
1582 through len_ret. */
1583
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001585getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001589
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001590#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 case AF_UNIX:
1592 {
1593 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001594 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001595 int retval = 0;
1596
1597 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1598 allow embedded nulls on Linux. */
1599 if (PyUnicode_Check(args)) {
1600 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1601 return 0;
1602 }
1603 else
1604 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001605 if (!PyArg_Parse(args, "y*", &path)) {
1606 Py_DECREF(args);
1607 return retval;
1608 }
1609 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001612#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001613 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001615 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001616 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001618 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 }
1620 }
1621 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001622#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 {
1624 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001625 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001626 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001628 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001630 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 }
1632 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 memcpy(addr->sun_path, path.buf, path.len);
1634 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001635 retval = 1;
1636 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001637 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001638 Py_DECREF(args);
1639 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001642
Martin v. Löwis11017b12006-01-14 18:12:57 +00001643#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 case AF_NETLINK:
1645 {
1646 struct sockaddr_nl* addr;
1647 int pid, groups;
1648 addr = (struct sockaddr_nl *)addr_ret;
1649 if (!PyTuple_Check(args)) {
1650 PyErr_Format(
1651 PyExc_TypeError,
1652 "getsockaddrarg: "
1653 "AF_NETLINK address must be tuple, not %.500s",
1654 Py_TYPE(args)->tp_name);
1655 return 0;
1656 }
1657 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1658 return 0;
1659 addr->nl_family = AF_NETLINK;
1660 addr->nl_pid = pid;
1661 addr->nl_groups = groups;
1662 *len_ret = sizeof(*addr);
1663 return 1;
1664 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001665#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001666
caaveryeffc12f2017-09-06 18:18:10 -04001667#if defined(AF_VSOCK)
1668 case AF_VSOCK:
1669 {
1670 struct sockaddr_vm* addr;
1671 int port, cid;
1672 addr = (struct sockaddr_vm *)addr_ret;
1673 memset(addr, 0, sizeof(struct sockaddr_vm));
1674 if (!PyTuple_Check(args)) {
1675 PyErr_Format(
1676 PyExc_TypeError,
1677 "getsockaddrarg: "
1678 "AF_VSOCK address must be tuple, not %.500s",
1679 Py_TYPE(args)->tp_name);
1680 return 0;
1681 }
1682 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1683 return 0;
1684 addr->svm_family = s->sock_family;
1685 addr->svm_port = port;
1686 addr->svm_cid = cid;
1687 *len_ret = sizeof(*addr);
1688 return 1;
1689 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001690#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001691
1692
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001693#ifdef AF_RDS
1694 case AF_RDS:
1695 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001696#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 case AF_INET:
1699 {
1700 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001701 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 int port, result;
1703 if (!PyTuple_Check(args)) {
1704 PyErr_Format(
1705 PyExc_TypeError,
1706 "getsockaddrarg: "
1707 "AF_INET address must be tuple, not %.500s",
1708 Py_TYPE(args)->tp_name);
1709 return 0;
1710 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001711 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1712 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return 0;
1714 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001715 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001717 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (result < 0)
1719 return 0;
1720 if (port < 0 || port > 0xffff) {
1721 PyErr_SetString(
1722 PyExc_OverflowError,
1723 "getsockaddrarg: port must be 0-65535.");
1724 return 0;
1725 }
1726 addr->sin_family = AF_INET;
1727 addr->sin_port = htons((short)port);
1728 *len_ret = sizeof *addr;
1729 return 1;
1730 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001732#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 case AF_INET6:
1734 {
1735 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001736 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001737 int port, result;
1738 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 flowinfo = scope_id = 0;
1740 if (!PyTuple_Check(args)) {
1741 PyErr_Format(
1742 PyExc_TypeError,
1743 "getsockaddrarg: "
1744 "AF_INET6 address must be tuple, not %.500s",
1745 Py_TYPE(args)->tp_name);
1746 return 0;
1747 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001748 if (!PyArg_ParseTuple(args, "O&i|II",
1749 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 &scope_id)) {
1751 return 0;
1752 }
1753 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001754 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001756 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (result < 0)
1758 return 0;
1759 if (port < 0 || port > 0xffff) {
1760 PyErr_SetString(
1761 PyExc_OverflowError,
1762 "getsockaddrarg: port must be 0-65535.");
1763 return 0;
1764 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001765 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001766 PyErr_SetString(
1767 PyExc_OverflowError,
1768 "getsockaddrarg: flowinfo must be 0-1048575.");
1769 return 0;
1770 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 addr->sin6_family = s->sock_family;
1772 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001773 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 addr->sin6_scope_id = scope_id;
1775 *len_ret = sizeof *addr;
1776 return 1;
1777 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001778#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001779
Hye-Shik Chang81268602004-02-02 06:05:24 +00001780#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 case AF_BLUETOOTH:
1782 {
1783 switch (s->sock_proto) {
1784 case BTPROTO_L2CAP:
1785 {
1786 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001787 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 addr = (struct sockaddr_l2 *)addr_ret;
1790 memset(addr, 0, sizeof(struct sockaddr_l2));
1791 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1792 if (!PyArg_ParseTuple(args, "si", &straddr,
1793 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001794 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 "wrong format");
1796 return 0;
1797 }
1798 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1799 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 *len_ret = sizeof *addr;
1802 return 1;
1803 }
1804 case BTPROTO_RFCOMM:
1805 {
1806 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001807 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 addr = (struct sockaddr_rc *)addr_ret;
1810 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1811 if (!PyArg_ParseTuple(args, "si", &straddr,
1812 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001813 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 "wrong format");
1815 return 0;
1816 }
1817 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1818 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 *len_ret = sizeof *addr;
1821 return 1;
1822 }
1823 case BTPROTO_HCI:
1824 {
1825 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001826#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001827 const char *straddr;
1828 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1829 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001830 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001831 "wrong format");
1832 return 0;
1833 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001834 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001835 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1836 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001837#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1839 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001840 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 "wrong format");
1842 return 0;
1843 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001844#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 *len_ret = sizeof *addr;
1846 return 1;
1847 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001848#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 case BTPROTO_SCO:
1850 {
1851 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001852 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 addr = (struct sockaddr_sco *)addr_ret;
1855 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1856 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001857 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 "wrong format");
1859 return 0;
1860 }
1861 straddr = PyBytes_AS_STRING(args);
1862 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1863 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 *len_ret = sizeof *addr;
1866 return 1;
1867 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001868#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001870 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 return 0;
1872 }
1873 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001874#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001875
Antoine Pitroub156a462010-10-27 20:13:57 +00001876#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 case AF_PACKET:
1878 {
1879 struct sockaddr_ll* addr;
1880 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001881 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 int protoNumber;
1883 int hatype = 0;
1884 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001885 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 if (!PyTuple_Check(args)) {
1888 PyErr_Format(
1889 PyExc_TypeError,
1890 "getsockaddrarg: "
1891 "AF_PACKET address must be tuple, not %.500s",
1892 Py_TYPE(args)->tp_name);
1893 return 0;
1894 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001895 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001897 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 return 0;
1899 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1900 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1901 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1902 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001903 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 return 0;
1905 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001906 if (haddr.buf && haddr.len > 8) {
1907 PyErr_SetString(PyExc_ValueError,
1908 "Hardware address must be 8 bytes or less");
1909 PyBuffer_Release(&haddr);
1910 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 }
1912 if (protoNumber < 0 || protoNumber > 0xffff) {
1913 PyErr_SetString(
1914 PyExc_OverflowError,
1915 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001916 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 return 0;
1918 }
1919 addr = (struct sockaddr_ll*)addr_ret;
1920 addr->sll_family = AF_PACKET;
1921 addr->sll_protocol = htons((short)protoNumber);
1922 addr->sll_ifindex = ifr.ifr_ifindex;
1923 addr->sll_pkttype = pkttype;
1924 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001925 if (haddr.buf) {
1926 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1927 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001929 else
1930 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001932 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 return 1;
1934 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001935#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001936
Christian Heimes043d6f62008-01-07 17:19:16 +00001937#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 case AF_TIPC:
1939 {
1940 unsigned int atype, v1, v2, v3;
1941 unsigned int scope = TIPC_CLUSTER_SCOPE;
1942 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 if (!PyTuple_Check(args)) {
1945 PyErr_Format(
1946 PyExc_TypeError,
1947 "getsockaddrarg: "
1948 "AF_TIPC address must be tuple, not %.500s",
1949 Py_TYPE(args)->tp_name);
1950 return 0;
1951 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (!PyArg_ParseTuple(args,
1954 "IIII|I;Invalid TIPC address format",
1955 &atype, &v1, &v2, &v3, &scope))
1956 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 addr = (struct sockaddr_tipc *) addr_ret;
1959 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 addr->family = AF_TIPC;
1962 addr->scope = scope;
1963 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if (atype == TIPC_ADDR_NAMESEQ) {
1966 addr->addr.nameseq.type = v1;
1967 addr->addr.nameseq.lower = v2;
1968 addr->addr.nameseq.upper = v3;
1969 } else if (atype == TIPC_ADDR_NAME) {
1970 addr->addr.name.name.type = v1;
1971 addr->addr.name.name.instance = v2;
1972 } else if (atype == TIPC_ADDR_ID) {
1973 addr->addr.id.node = v1;
1974 addr->addr.id.ref = v2;
1975 } else {
1976 /* Shouldn't happen */
1977 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1978 return 0;
1979 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 return 1;
1984 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001985#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001986
Serhiy Storchakad3187152017-11-09 18:00:38 +02001987#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001988 case AF_CAN:
1989 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001990#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001991 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001992 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001993#endif
1994#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001995 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001996#endif
1997#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001998 {
1999 struct sockaddr_can *addr;
2000 PyObject *interfaceName;
2001 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002003 addr = (struct sockaddr_can *)addr_ret;
2004
Charles-François Natali47413c12011-10-06 19:47:44 +02002005 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
2006 &interfaceName))
2007 return 0;
2008
2009 len = PyBytes_GET_SIZE(interfaceName);
2010
2011 if (len == 0) {
2012 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002013 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002014 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2015 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002016 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2017 s->errorhandler();
2018 Py_DECREF(interfaceName);
2019 return 0;
2020 }
2021 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002022 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002023 "AF_CAN interface name too long");
2024 Py_DECREF(interfaceName);
2025 return 0;
2026 }
2027
2028 addr->can_family = AF_CAN;
2029 addr->can_ifindex = ifr.ifr_ifindex;
2030
2031 *len_ret = sizeof(*addr);
2032 Py_DECREF(interfaceName);
2033 return 1;
2034 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002035#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002036
2037#ifdef CAN_ISOTP
2038 case CAN_ISOTP:
2039 {
2040 struct sockaddr_can *addr;
2041 PyObject *interfaceName;
2042 struct ifreq ifr;
2043 Py_ssize_t len;
2044 unsigned long int rx_id, tx_id;
2045
2046 addr = (struct sockaddr_can *)addr_ret;
2047
2048 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2049 &interfaceName,
2050 &rx_id,
2051 &tx_id))
2052 return 0;
2053
2054 len = PyBytes_GET_SIZE(interfaceName);
2055
2056 if (len == 0) {
2057 ifr.ifr_ifindex = 0;
2058 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2059 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2060 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2061 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2062 s->errorhandler();
2063 Py_DECREF(interfaceName);
2064 return 0;
2065 }
2066 } else {
2067 PyErr_SetString(PyExc_OSError,
2068 "AF_CAN interface name too long");
2069 Py_DECREF(interfaceName);
2070 return 0;
2071 }
2072
2073 addr->can_family = AF_CAN;
2074 addr->can_ifindex = ifr.ifr_ifindex;
2075 addr->can_addr.tp.rx_id = rx_id;
2076 addr->can_addr.tp.tx_id = tx_id;
2077
2078 *len_ret = sizeof(*addr);
2079 Py_DECREF(interfaceName);
2080 return 1;
2081 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002082#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002083 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002084 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002085 "getsockaddrarg: unsupported CAN protocol");
2086 return 0;
2087 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002088#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002089
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002090#ifdef PF_SYSTEM
2091 case PF_SYSTEM:
2092 switch (s->sock_proto) {
2093#ifdef SYSPROTO_CONTROL
2094 case SYSPROTO_CONTROL:
2095 {
2096 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002097
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002098 addr = (struct sockaddr_ctl *)addr_ret;
2099 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002100 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002101
2102 if (PyUnicode_Check(args)) {
2103 struct ctl_info info;
2104 PyObject *ctl_name;
2105
2106 if (!PyArg_Parse(args, "O&",
2107 PyUnicode_FSConverter, &ctl_name)) {
2108 return 0;
2109 }
2110
Victor Stinnerf50e1872015-03-20 11:32:24 +01002111 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002112 PyErr_SetString(PyExc_ValueError,
2113 "provided string is too long");
2114 Py_DECREF(ctl_name);
2115 return 0;
2116 }
2117 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2118 sizeof(info.ctl_name));
2119 Py_DECREF(ctl_name);
2120
2121 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2122 PyErr_SetString(PyExc_OSError,
2123 "cannot find kernel control with provided name");
2124 return 0;
2125 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002126
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002127 addr->sc_id = info.ctl_id;
2128 addr->sc_unit = 0;
2129 } else if (!PyArg_ParseTuple(args, "II",
2130 &(addr->sc_id), &(addr->sc_unit))) {
2131 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2132 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002133
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002134 return 0;
2135 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002136
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002137 *len_ret = sizeof(*addr);
2138 return 1;
2139 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002140#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002141 default:
2142 PyErr_SetString(PyExc_OSError,
2143 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2144 return 0;
2145 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002146#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002147#ifdef HAVE_SOCKADDR_ALG
2148 case AF_ALG:
2149 {
2150 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002151 const char *type;
2152 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002153 sa = (struct sockaddr_alg *)addr_ret;
2154
2155 memset(sa, 0, sizeof(*sa));
2156 sa->salg_family = AF_ALG;
2157
2158 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2159 &type, &name, &sa->salg_feat, &sa->salg_mask))
2160 return 0;
2161 /* sockaddr_alg has fixed-sized char arrays for type and name */
2162 if (strlen(type) > sizeof(sa->salg_type)) {
2163 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2164 return 0;
2165 }
2166 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2167 if (strlen(name) > sizeof(sa->salg_name)) {
2168 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2169 return 0;
2170 }
2171 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2172
2173 *len_ret = sizeof(*sa);
2174 return 1;
2175 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002176#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002181 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002185}
2186
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187
Guido van Rossum48a680c2001-03-02 06:34:14 +00002188/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002189 Return 1 if the family is known, 0 otherwise. The length is returned
2190 through len_ret. */
2191
2192static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002193getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002196
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002197#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 case AF_UNIX:
2199 {
2200 *len_ret = sizeof (struct sockaddr_un);
2201 return 1;
2202 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002203#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002204
Martin v. Löwis11017b12006-01-14 18:12:57 +00002205#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002206 case AF_NETLINK:
2207 {
2208 *len_ret = sizeof (struct sockaddr_nl);
2209 return 1;
2210 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002211#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002212
caaveryeffc12f2017-09-06 18:18:10 -04002213#if defined(AF_VSOCK)
2214 case AF_VSOCK:
2215 {
2216 *len_ret = sizeof (struct sockaddr_vm);
2217 return 1;
2218 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002219#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002220
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002221#ifdef AF_RDS
2222 case AF_RDS:
2223 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002224#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 case AF_INET:
2227 {
2228 *len_ret = sizeof (struct sockaddr_in);
2229 return 1;
2230 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002231
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002232#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 case AF_INET6:
2234 {
2235 *len_ret = sizeof (struct sockaddr_in6);
2236 return 1;
2237 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002238#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002239
Hye-Shik Chang81268602004-02-02 06:05:24 +00002240#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 case AF_BLUETOOTH:
2242 {
2243 switch(s->sock_proto)
2244 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 case BTPROTO_L2CAP:
2247 *len_ret = sizeof (struct sockaddr_l2);
2248 return 1;
2249 case BTPROTO_RFCOMM:
2250 *len_ret = sizeof (struct sockaddr_rc);
2251 return 1;
2252 case BTPROTO_HCI:
2253 *len_ret = sizeof (struct sockaddr_hci);
2254 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002255#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 case BTPROTO_SCO:
2257 *len_ret = sizeof (struct sockaddr_sco);
2258 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002259#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002261 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 "unknown BT protocol");
2263 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 }
2266 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002267#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002268
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002269#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 case AF_PACKET:
2271 {
2272 *len_ret = sizeof (struct sockaddr_ll);
2273 return 1;
2274 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002275#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002276
Christian Heimes043d6f62008-01-07 17:19:16 +00002277#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 case AF_TIPC:
2279 {
2280 *len_ret = sizeof (struct sockaddr_tipc);
2281 return 1;
2282 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002283#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002284
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002285#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002286 case AF_CAN:
2287 {
2288 *len_ret = sizeof (struct sockaddr_can);
2289 return 1;
2290 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002291#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002292
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002293#ifdef PF_SYSTEM
2294 case PF_SYSTEM:
2295 switch(s->sock_proto) {
2296#ifdef SYSPROTO_CONTROL
2297 case SYSPROTO_CONTROL:
2298 *len_ret = sizeof (struct sockaddr_ctl);
2299 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002300#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002301 default:
2302 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2303 "unknown PF_SYSTEM protocol");
2304 return 0;
2305 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002306#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002307#ifdef HAVE_SOCKADDR_ALG
2308 case AF_ALG:
2309 {
2310 *len_ret = sizeof (struct sockaddr_alg);
2311 return 1;
2312 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002313#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002318 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002322}
2323
2324
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002325/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2326 Currently, these methods are only compiled if the RFC 2292/3542
2327 CMSG_LEN() macro is available. Older systems seem to have used
2328 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2329 it may be possible to define CMSG_LEN() that way if it's not
2330 provided. Some architectures might need extra padding after the
2331 cmsghdr, however, and CMSG_LEN() would have to take account of
2332 this. */
2333#ifdef CMSG_LEN
2334/* If length is in range, set *result to CMSG_LEN(length) and return
2335 true; otherwise, return false. */
2336static int
2337get_CMSG_LEN(size_t length, size_t *result)
2338{
2339 size_t tmp;
2340
2341 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2342 return 0;
2343 tmp = CMSG_LEN(length);
2344 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2345 return 0;
2346 *result = tmp;
2347 return 1;
2348}
2349
2350#ifdef CMSG_SPACE
2351/* If length is in range, set *result to CMSG_SPACE(length) and return
2352 true; otherwise, return false. */
2353static int
2354get_CMSG_SPACE(size_t length, size_t *result)
2355{
2356 size_t tmp;
2357
2358 /* Use CMSG_SPACE(1) here in order to take account of the padding
2359 necessary before *and* after the data. */
2360 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2361 return 0;
2362 tmp = CMSG_SPACE(length);
2363 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2364 return 0;
2365 *result = tmp;
2366 return 1;
2367}
2368#endif
2369
2370/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2371 pointer in msg->msg_control with at least "space" bytes after it,
2372 and its cmsg_len member inside the buffer. */
2373static int
2374cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2375{
2376 size_t cmsg_offset;
2377 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2378 sizeof(cmsgh->cmsg_len));
2379
Charles-François Natali466517d2011-08-28 18:23:43 +02002380 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002381 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002382 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002383 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2384 annoying under OS X as it's unsigned there and so it triggers a
2385 tautological comparison warning under Clang when compared against 0.
2386 Since the check is valid on other platforms, silence the warning under
2387 Clang. */
2388 #ifdef __clang__
2389 #pragma clang diagnostic push
2390 #pragma clang diagnostic ignored "-Wtautological-compare"
2391 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002392 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002393 #pragma GCC diagnostic push
2394 #pragma GCC diagnostic ignored "-Wtype-limits"
2395 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002396 if (msg->msg_controllen < 0)
2397 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002398 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002399 #pragma GCC diagnostic pop
2400 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002401 #ifdef __clang__
2402 #pragma clang diagnostic pop
2403 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002404 if (space < cmsg_len_end)
2405 space = cmsg_len_end;
2406 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2407 return (cmsg_offset <= (size_t)-1 - space &&
2408 cmsg_offset + space <= msg->msg_controllen);
2409}
2410
2411/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2412 *space to number of bytes following it in the buffer and return
2413 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2414 msg->msg_controllen are valid. */
2415static int
2416get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2417{
2418 size_t data_offset;
2419 char *data_ptr;
2420
2421 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2422 return 0;
2423 data_offset = data_ptr - (char *)msg->msg_control;
2424 if (data_offset > msg->msg_controllen)
2425 return 0;
2426 *space = msg->msg_controllen - data_offset;
2427 return 1;
2428}
2429
2430/* If cmsgh is invalid or not contained in the buffer pointed to by
2431 msg->msg_control, return -1. If cmsgh is valid and its associated
2432 data is entirely contained in the buffer, set *data_len to the
2433 length of the associated data and return 0. If only part of the
2434 associated data is contained in the buffer but cmsgh is otherwise
2435 valid, set *data_len to the length contained in the buffer and
2436 return 1. */
2437static int
2438get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2439{
2440 size_t space, cmsg_data_len;
2441
2442 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2443 cmsgh->cmsg_len < CMSG_LEN(0))
2444 return -1;
2445 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2446 if (!get_cmsg_data_space(msg, cmsgh, &space))
2447 return -1;
2448 if (space >= cmsg_data_len) {
2449 *data_len = cmsg_data_len;
2450 return 0;
2451 }
2452 *data_len = space;
2453 return 1;
2454}
2455#endif /* CMSG_LEN */
2456
2457
Victor Stinner31bf2d52015-04-01 21:57:09 +02002458struct sock_accept {
2459 socklen_t *addrlen;
2460 sock_addr_t *addrbuf;
2461 SOCKET_T result;
2462};
2463
2464#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2465/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2466static int accept4_works = -1;
2467#endif
2468
2469static int
2470sock_accept_impl(PySocketSockObject *s, void *data)
2471{
2472 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002473 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2474 socklen_t *paddrlen = ctx->addrlen;
2475#ifdef HAVE_SOCKADDR_ALG
2476 /* AF_ALG does not support accept() with addr and raises
2477 * ECONNABORTED instead. */
2478 if (s->sock_family == AF_ALG) {
2479 addr = NULL;
2480 paddrlen = NULL;
2481 *ctx->addrlen = 0;
2482 }
2483#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002484
2485#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2486 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002487 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002488 SOCK_CLOEXEC);
2489 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2490 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2491 accept4_works = (errno != ENOSYS);
2492 }
2493 }
2494 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002495 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002496#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002497 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002498#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002499
2500#ifdef MS_WINDOWS
2501 return (ctx->result != INVALID_SOCKET);
2502#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002503 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002504#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002505}
2506
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002507/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002508
Guido van Rossum73624e91994-10-10 17:59:00 +00002509static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302510sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002513 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 socklen_t addrlen;
2515 PyObject *sock = NULL;
2516 PyObject *addr = NULL;
2517 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002518 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (!getsockaddrlen(s, &addrlen))
2521 return NULL;
2522 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 if (!IS_SELECTABLE(s))
2525 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002526
Victor Stinner31bf2d52015-04-01 21:57:09 +02002527 ctx.addrlen = &addrlen;
2528 ctx.addrbuf = &addrbuf;
2529 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002531 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002532
Victor Stinnerdaf45552013-08-28 00:53:59 +02002533#ifdef MS_WINDOWS
2534 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2535 PyErr_SetFromWindowsErr(0);
2536 SOCKETCLOSE(newfd);
2537 goto finally;
2538 }
2539#else
2540
2541#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2542 if (!accept4_works)
2543#endif
2544 {
2545 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2546 SOCKETCLOSE(newfd);
2547 goto finally;
2548 }
2549 }
2550#endif
2551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 sock = PyLong_FromSocket_t(newfd);
2553 if (sock == NULL) {
2554 SOCKETCLOSE(newfd);
2555 goto finally;
2556 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2559 addrlen, s->sock_proto);
2560 if (addr == NULL)
2561 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002564
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 Py_XDECREF(sock);
2567 Py_XDECREF(addr);
2568 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002569}
2570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002571PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002572"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002573\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002574Wait for an incoming connection. Return a new socket file descriptor\n\
2575representing the connection, and the address of the client.\n\
2576For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577
Guido van Rossum11ba0942002-06-13 15:07:44 +00002578/* s.setblocking(flag) method. Argument:
2579 False -- non-blocking mode; same as settimeout(0)
2580 True -- blocking mode; same as settimeout(None)
2581*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002582
Guido van Rossum73624e91994-10-10 17:59:00 +00002583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002584sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002585{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002586 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 block = PyLong_AsLong(arg);
2589 if (block == -1 && PyErr_Occurred())
2590 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002591
Victor Stinner9001d802015-04-06 23:06:01 +02002592 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002593 if (internal_setblocking(s, block) == -1) {
2594 return NULL;
2595 }
2596 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002597}
Guido van Rossume4485b01994-09-07 14:32:49 +00002598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002600"setblocking(flag)\n\
2601\n\
2602Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002603setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002604setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002605
Yury Selivanovf11b4602018-01-28 17:27:38 -05002606/* s.getblocking() method.
2607 Returns True if socket is in blocking mode,
2608 False if it is in non-blocking mode.
2609*/
2610static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302611sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002612{
2613 if (s->sock_timeout) {
2614 Py_RETURN_TRUE;
2615 }
2616 else {
2617 Py_RETURN_FALSE;
2618 }
2619}
2620
2621PyDoc_STRVAR(getblocking_doc,
2622"getblocking()\n\
2623\n\
2624Returns True if socket is in blocking mode, or False if it\n\
2625is in non-blocking mode.");
2626
Victor Stinner71694d52015-03-28 01:18:54 +01002627static int
2628socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2629{
2630#ifdef MS_WINDOWS
2631 struct timeval tv;
2632#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002633#ifndef HAVE_POLL
2634 _PyTime_t ms;
2635#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002636 int overflow = 0;
2637
2638 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002639 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002640 return 0;
2641 }
2642
Victor Stinner869e1772015-03-30 03:49:14 +02002643 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002644 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002645 return -1;
2646
2647 if (*timeout < 0) {
2648 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2649 return -1;
2650 }
2651
2652#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002653 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002654#endif
2655#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002656 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002657 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002658#endif
2659 if (overflow) {
2660 PyErr_SetString(PyExc_OverflowError,
2661 "timeout doesn't fit into C timeval");
2662 return -1;
2663 }
2664
2665 return 0;
2666}
2667
Guido van Rossum11ba0942002-06-13 15:07:44 +00002668/* s.settimeout(timeout) method. Argument:
2669 None -- no timeout, blocking mode; same as setblocking(True)
2670 0.0 -- non-blocking mode; same as setblocking(False)
2671 > 0 -- timeout mode; operations time out after timeout seconds
2672 < 0 -- illegal; raises an exception
2673*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002675sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002676{
Victor Stinner71694d52015-03-28 01:18:54 +01002677 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002678
Victor Stinner71694d52015-03-28 01:18:54 +01002679 if (socket_parse_timeout(&timeout, arg) < 0)
2680 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002683
2684 int block = timeout < 0;
2685 /* Blocking mode for a Python socket object means that operations
2686 like :meth:`recv` or :meth:`sendall` will block the execution of
2687 the current thread until they are complete or aborted with a
2688 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2689 the underlying FD is in a blocking mode. When timeout is a positive
2690 number, the FD is in a non-blocking mode, and socket ops are
2691 implemented with a `select()` call.
2692
2693 When timeout is 0.0, the FD is in a non-blocking mode.
2694
2695 This table summarizes all states in which the socket object and
2696 its underlying FD can be:
2697
2698 ==================== ===================== ==============
2699 `gettimeout()` `getblocking()` FD
2700 ==================== ===================== ==============
2701 ``None`` ``True`` blocking
2702 ``0.0`` ``False`` non-blocking
2703 ``> 0`` ``True`` non-blocking
2704 */
2705
2706 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002707 return NULL;
2708 }
2709 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002710}
2711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002712PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002713"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002715Set a timeout on socket operations. 'timeout' can be a float,\n\
2716giving in seconds, or None. Setting a timeout of None disables\n\
2717the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002718Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002720/* s.gettimeout() method.
2721 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302723sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002724{
Victor Stinner71694d52015-03-28 01:18:54 +01002725 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002726 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 }
Victor Stinner71694d52015-03-28 01:18:54 +01002728 else {
2729 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2730 return PyFloat_FromDouble(seconds);
2731 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002732}
2733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002734PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002735"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002736\n\
oldkaa0735f2018-02-02 16:52:55 +08002737Returns the timeout in seconds (float) associated with socket\n\
2738operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002739operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002740
Guido van Rossumaee08791992-09-08 09:05:33 +00002741/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002742 With an integer third argument, sets an integer optval with optlen=4.
2743 With None as third argument and an integer fourth argument, set
2744 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002745 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002746 use optional built-in module 'struct' to encode the string.
2747*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002748
Guido van Rossum73624e91994-10-10 17:59:00 +00002749static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002750sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 int level;
2753 int optname;
2754 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002755 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002757 unsigned int optlen;
2758 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002759
caaveryeffc12f2017-09-06 18:18:10 -04002760#ifdef AF_VSOCK
2761 if (s->sock_family == AF_VSOCK) {
2762 uint64_t vflag; // Must be set width of 64 bits
2763 /* setsockopt(level, opt, flag) */
2764 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2765 &level, &optname, &vflag)) {
2766 // level should always be set to AF_VSOCK
2767 res = setsockopt(s->sock_fd, level, optname,
2768 (void*)&vflag, sizeof vflag);
2769 goto done;
2770 }
2771 return NULL;
2772 }
2773#endif
2774
Christian Heimesdffa3942016-09-05 23:54:41 +02002775 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 if (PyArg_ParseTuple(args, "iii:setsockopt",
2777 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002778 res = setsockopt(s->sock_fd, level, optname,
2779 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002780 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002782
2783 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002784 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002785 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2786 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2787 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002788 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002789 NULL, (socklen_t)optlen);
2790 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002792
2793 PyErr_Clear();
2794 /* setsockopt(level, opt, buffer) */
2795 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2796 &level, &optname, &optval))
2797 return NULL;
2798
2799#ifdef MS_WINDOWS
2800 if (optval.len > INT_MAX) {
2801 PyBuffer_Release(&optval);
2802 PyErr_Format(PyExc_OverflowError,
2803 "socket option is larger than %i bytes",
2804 INT_MAX);
2805 return NULL;
2806 }
2807 res = setsockopt(s->sock_fd, level, optname,
2808 optval.buf, (int)optval.len);
2809#else
2810 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2811#endif
2812 PyBuffer_Release(&optval);
2813
2814done:
Victor Stinnercc739322016-03-23 21:35:29 +01002815 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002817 }
2818
2819 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002820}
2821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002822PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002823"setsockopt(level, option, value: int)\n\
2824setsockopt(level, option, value: buffer)\n\
2825setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002826\n\
2827Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002828The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002829None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002830
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002831
Guido van Rossumaee08791992-09-08 09:05:33 +00002832/* s.getsockopt() method.
2833 With two arguments, retrieves an integer option.
2834 With a third integer argument, retrieves a string buffer of that size;
2835 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002836
Guido van Rossum73624e91994-10-10 17:59:00 +00002837static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002838sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 int level;
2841 int optname;
2842 int res;
2843 PyObject *buf;
2844 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002845 int flag = 0;
2846 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2849 &level, &optname, &buflen))
2850 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002853#ifdef AF_VSOCK
2854 if (s->sock_family == AF_VSOCK) {
2855 uint64_t vflag = 0; // Must be set width of 64 bits
2856 flagsize = sizeof vflag;
2857 res = getsockopt(s->sock_fd, level, optname,
2858 (void *)&vflag, &flagsize);
2859 if (res < 0)
2860 return s->errorhandler();
2861 return PyLong_FromUnsignedLong(vflag);
2862 }
2863#endif
2864 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 res = getsockopt(s->sock_fd, level, optname,
2866 (void *)&flag, &flagsize);
2867 if (res < 0)
2868 return s->errorhandler();
2869 return PyLong_FromLong(flag);
2870 }
caaveryeffc12f2017-09-06 18:18:10 -04002871#ifdef AF_VSOCK
2872 if (s->sock_family == AF_VSOCK) {
2873 PyErr_SetString(PyExc_OSError,
2874 "getsockopt string buffer not allowed");
2875 return NULL;
2876 }
2877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002879 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 "getsockopt buflen out of range");
2881 return NULL;
2882 }
2883 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2884 if (buf == NULL)
2885 return NULL;
2886 res = getsockopt(s->sock_fd, level, optname,
2887 (void *)PyBytes_AS_STRING(buf), &buflen);
2888 if (res < 0) {
2889 Py_DECREF(buf);
2890 return s->errorhandler();
2891 }
2892 _PyBytes_Resize(&buf, buflen);
2893 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002894}
2895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002896PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002897"getsockopt(level, option[, buffersize]) -> value\n\
2898\n\
2899Get a socket option. See the Unix manual for level and option.\n\
2900If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002903
Fred Drake728819a2000-07-01 03:40:12 +00002904/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002905
Guido van Rossum73624e91994-10-10 17:59:00 +00002906static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002907sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 sock_addr_t addrbuf;
2910 int addrlen;
2911 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2914 return NULL;
2915 Py_BEGIN_ALLOW_THREADS
2916 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2917 Py_END_ALLOW_THREADS
2918 if (res < 0)
2919 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002920 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002921}
2922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002923PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002924"bind(address)\n\
2925\n\
2926Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002927pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002928sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002929
Guido van Rossum30a685f1991-06-27 15:51:29 +00002930
2931/* s.close() method.
2932 Set the file descriptor to -1 so operations tried subsequently
2933 will surely fail. */
2934
Guido van Rossum73624e91994-10-10 17:59:00 +00002935static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302936sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002939 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002940
Victor Stinner19a8e842016-03-21 16:36:48 +01002941 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002942 if (fd != INVALID_SOCKET) {
2943 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002944
2945 /* We do not want to retry upon EINTR: see
2946 http://lwn.net/Articles/576478/ and
2947 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2948 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002950 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002952 /* bpo-30319: The peer can already have closed the connection.
2953 Python ignores ECONNRESET on close(). */
2954 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002955 return s->errorhandler();
2956 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002958 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002959}
2960
Christian Heimesd0e31b92018-01-27 09:54:13 +01002961PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002962"close()\n\
2963\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002966static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302967sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002968{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002969 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002970 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002971 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002972}
2973
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002974PyDoc_STRVAR(detach_doc,
2975"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002976\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002977Close the socket object without closing the underlying file descriptor.\n\
2978The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002979can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002980
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002981static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002982sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002983{
Victor Stinner81c41db2015-04-02 11:50:57 +02002984 int err;
2985 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002986
Victor Stinner81c41db2015-04-02 11:50:57 +02002987 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2988 /* getsockopt() failed */
2989 return 0;
2990 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002991
Victor Stinner81c41db2015-04-02 11:50:57 +02002992 if (err == EISCONN)
2993 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002994 if (err != 0) {
2995 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2996 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002997 return 0;
2998 }
2999 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003000}
3001
3002static int
3003internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3004 int raise)
3005{
3006 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003007
3008 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003010 Py_END_ALLOW_THREADS
3011
Victor Stinner70a46f62015-03-31 22:03:59 +02003012 if (!res) {
3013 /* connect() succeeded, the socket is connected */
3014 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003016
Victor Stinner81c41db2015-04-02 11:50:57 +02003017 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003018
Victor Stinner81c41db2015-04-02 11:50:57 +02003019 /* save error, PyErr_CheckSignals() can replace it */
3020 err = GET_SOCK_ERROR;
3021 if (CHECK_ERRNO(EINTR)) {
3022 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003023 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003024
3025 /* Issue #23618: when connect() fails with EINTR, the connection is
3026 running asynchronously.
3027
3028 If the socket is blocking or has a timeout, wait until the
3029 connection completes, fails or timed out using select(), and then
3030 get the connection status using getsockopt(SO_ERROR).
3031
3032 If the socket is non-blocking, raise InterruptedError. The caller is
3033 responsible to wait until the connection completes, fails or timed
3034 out (it's the case in asyncio for example). */
3035 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3036 }
3037 else {
3038 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3039 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003040 }
3041
Victor Stinner81c41db2015-04-02 11:50:57 +02003042 if (!wait_connect) {
3043 if (raise) {
3044 /* restore error, maybe replaced by PyErr_CheckSignals() */
3045 SET_SOCK_ERROR(err);
3046 s->errorhandler();
3047 return -1;
3048 }
3049 else
3050 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003051 }
3052
Victor Stinner81c41db2015-04-02 11:50:57 +02003053 if (raise) {
3054 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003055 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3056 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003057 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003058 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003059 else {
3060 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003061 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3062 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003063 return err;
3064 }
3065 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003066}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003067
Fred Drake728819a2000-07-01 03:40:12 +00003068/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003069
Guido van Rossum73624e91994-10-10 17:59:00 +00003070static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003071sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 sock_addr_t addrbuf;
3074 int addrlen;
3075 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3078 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003079
Victor Stinner81c41db2015-04-02 11:50:57 +02003080 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003081 if (res < 0)
3082 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003083
Victor Stinneree699e92015-03-31 21:28:42 +02003084 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003085}
3086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003087PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088"connect(address)\n\
3089\n\
3090Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003091is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003092
Guido van Rossum30a685f1991-06-27 15:51:29 +00003093
Fred Drake728819a2000-07-01 03:40:12 +00003094/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003095
3096static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003097sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 sock_addr_t addrbuf;
3100 int addrlen;
3101 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3104 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003105
Victor Stinner81c41db2015-04-02 11:50:57 +02003106 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003107 if (res < 0)
3108 return NULL;
3109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003111}
3112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003113PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003114"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003115\n\
3116This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003117instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003118
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003119
Guido van Rossumed233a51992-06-23 09:07:03 +00003120/* s.fileno() method */
3121
Guido van Rossum73624e91994-10-10 17:59:00 +00003122static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303123sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003126}
3127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003128PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003129"fileno() -> integer\n\
3130\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003131Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003132
Guido van Rossumed233a51992-06-23 09:07:03 +00003133
Guido van Rossumc89705d1992-11-26 08:54:07 +00003134/* s.getsockname() method */
3135
Guido van Rossum73624e91994-10-10 17:59:00 +00003136static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303137sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 sock_addr_t addrbuf;
3140 int res;
3141 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 if (!getsockaddrlen(s, &addrlen))
3144 return NULL;
3145 memset(&addrbuf, 0, addrlen);
3146 Py_BEGIN_ALLOW_THREADS
3147 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3148 Py_END_ALLOW_THREADS
3149 if (res < 0)
3150 return s->errorhandler();
3151 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3152 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003153}
3154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003155PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003156"getsockname() -> address info\n\
3157\n\
3158Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003159info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003160
Guido van Rossumc89705d1992-11-26 08:54:07 +00003161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003163/* s.getpeername() method */
3164
Guido van Rossum73624e91994-10-10 17:59:00 +00003165static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303166sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 sock_addr_t addrbuf;
3169 int res;
3170 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 if (!getsockaddrlen(s, &addrlen))
3173 return NULL;
3174 memset(&addrbuf, 0, addrlen);
3175 Py_BEGIN_ALLOW_THREADS
3176 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3177 Py_END_ALLOW_THREADS
3178 if (res < 0)
3179 return s->errorhandler();
3180 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3181 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003182}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003184PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003185"getpeername() -> address info\n\
3186\n\
3187Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003188info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003189
Guido van Rossumb6775db1994-08-01 11:34:53 +00003190#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003191
3192
Guido van Rossum30a685f1991-06-27 15:51:29 +00003193/* s.listen(n) method */
3194
Guido van Rossum73624e91994-10-10 17:59:00 +00003195static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003196sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003197{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003198 /* We try to choose a default backlog high enough to avoid connection drops
3199 * for common workloads, yet not too high to limit resource usage. */
3200 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003202
Charles-François Natali644b8f52014-05-22 19:45:39 +01003203 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003207 /* To avoid problems on systems that don't allow a negative backlog
3208 * (which doesn't make sense anyway) we force a minimum value of 0. */
3209 if (backlog < 0)
3210 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 res = listen(s->sock_fd, backlog);
3212 Py_END_ALLOW_THREADS
3213 if (res < 0)
3214 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003215 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003216}
3217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003218PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003219"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003220\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003221Enable a server to accept connections. If backlog is specified, it must be\n\
3222at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003223unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003224connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003225
Victor Stinner31bf2d52015-04-01 21:57:09 +02003226struct sock_recv {
3227 char *cbuf;
3228 Py_ssize_t len;
3229 int flags;
3230 Py_ssize_t result;
3231};
3232
3233static int
3234sock_recv_impl(PySocketSockObject *s, void *data)
3235{
3236 struct sock_recv *ctx = data;
3237
3238#ifdef MS_WINDOWS
3239 if (ctx->len > INT_MAX)
3240 ctx->len = INT_MAX;
3241 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3242#else
3243 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3244#endif
3245 return (ctx->result >= 0);
3246}
3247
Guido van Rossum82a5c661998-07-07 20:45:43 +00003248
Thomas Wouters477c8d52006-05-27 19:21:47 +00003249/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003250 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003251 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003252 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003253 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003254 * also possible that we return a number of bytes smaller than the request
3255 * bytes.
3256 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003257
Antoine Pitrou19467d22010-08-17 19:33:30 +00003258static Py_ssize_t
3259sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003260{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003261 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 if (!IS_SELECTABLE(s)) {
3264 select_error();
3265 return -1;
3266 }
3267 if (len == 0) {
3268 /* If 0 bytes were requested, do nothing. */
3269 return 0;
3270 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003271
Victor Stinner31bf2d52015-04-01 21:57:09 +02003272 ctx.cbuf = cbuf;
3273 ctx.len = len;
3274 ctx.flags = flags;
3275 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003277
3278 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003279}
3280
Guido van Rossum48a680c2001-03-02 06:34:14 +00003281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003282/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283
Guido van Rossum73624e91994-10-10 17:59:00 +00003284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003285sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003286{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003287 Py_ssize_t recvlen, outlen;
3288 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Antoine Pitrou19467d22010-08-17 19:33:30 +00003291 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (recvlen < 0) {
3295 PyErr_SetString(PyExc_ValueError,
3296 "negative buffersize in recv");
3297 return NULL;
3298 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 /* Allocate a new string. */
3301 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3302 if (buf == NULL)
3303 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 /* Call the guts */
3306 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3307 if (outlen < 0) {
3308 /* An error occurred, release the string and return an
3309 error. */
3310 Py_DECREF(buf);
3311 return NULL;
3312 }
3313 if (outlen != recvlen) {
3314 /* We did not read as many bytes as we anticipated, resize the
3315 string if possible and be successful. */
3316 _PyBytes_Resize(&buf, outlen);
3317 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003320}
3321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003322PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003323"recv(buffersize[, flags]) -> data\n\
3324\n\
3325Receive up to buffersize bytes from the socket. For the optional flags\n\
3326argument, see the Unix manual. When no data is available, block until\n\
3327at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003328the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003329
Guido van Rossum30a685f1991-06-27 15:51:29 +00003330
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003331/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003332
Thomas Wouters477c8d52006-05-27 19:21:47 +00003333static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003334sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003337
Antoine Pitrou19467d22010-08-17 19:33:30 +00003338 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 Py_buffer pbuf;
3340 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003344 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 &pbuf, &recvlen, &flags))
3346 return NULL;
3347 buf = pbuf.buf;
3348 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (recvlen < 0) {
3351 PyBuffer_Release(&pbuf);
3352 PyErr_SetString(PyExc_ValueError,
3353 "negative buffersize in recv_into");
3354 return NULL;
3355 }
3356 if (recvlen == 0) {
3357 /* If nbytes was not specified, use the buffer's length */
3358 recvlen = buflen;
3359 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 /* Check if the buffer is large enough */
3362 if (buflen < recvlen) {
3363 PyBuffer_Release(&pbuf);
3364 PyErr_SetString(PyExc_ValueError,
3365 "buffer too small for requested bytes");
3366 return NULL;
3367 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 /* Call the guts */
3370 readlen = sock_recv_guts(s, buf, recvlen, flags);
3371 if (readlen < 0) {
3372 /* Return an error. */
3373 PyBuffer_Release(&pbuf);
3374 return NULL;
3375 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 PyBuffer_Release(&pbuf);
3378 /* Return the number of bytes read. Note that we do not do anything
3379 special here in the case that readlen < recvlen. */
3380 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003381}
3382
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003383PyDoc_STRVAR(recv_into_doc,
3384"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003385\n\
oldkaa0735f2018-02-02 16:52:55 +08003386A version of recv() that stores its data into a buffer rather than creating\n\
3387a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003388is not specified (or 0), receive up to the size available in the given buffer.\n\
3389\n\
3390See recv() for documentation about the flags.");
3391
Victor Stinner31bf2d52015-04-01 21:57:09 +02003392struct sock_recvfrom {
3393 char* cbuf;
3394 Py_ssize_t len;
3395 int flags;
3396 socklen_t *addrlen;
3397 sock_addr_t *addrbuf;
3398 Py_ssize_t result;
3399};
3400
3401static int
3402sock_recvfrom_impl(PySocketSockObject *s, void *data)
3403{
3404 struct sock_recvfrom *ctx = data;
3405
3406 memset(ctx->addrbuf, 0, *ctx->addrlen);
3407
3408#ifdef MS_WINDOWS
3409 if (ctx->len > INT_MAX)
3410 ctx->len = INT_MAX;
3411 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3412 SAS2SA(ctx->addrbuf), ctx->addrlen);
3413#else
3414 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3415 SAS2SA(ctx->addrbuf), ctx->addrlen);
3416#endif
3417 return (ctx->result >= 0);
3418}
3419
Thomas Wouters477c8d52006-05-27 19:21:47 +00003420
3421/*
Christian Heimes99170a52007-12-19 02:07:34 +00003422 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3423 * into a char buffer. If you have any inc/def ref to do to the objects that
3424 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003425 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003426 * that it is also possible that we return a number of bytes smaller than the
3427 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003428 *
3429 * 'addr' is a return value for the address object. Note that you must decref
3430 * it yourself.
3431 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003432static Py_ssize_t
3433sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003438 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 if (!getsockaddrlen(s, &addrlen))
3443 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 if (!IS_SELECTABLE(s)) {
3446 select_error();
3447 return -1;
3448 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003449
Victor Stinner31bf2d52015-04-01 21:57:09 +02003450 ctx.cbuf = cbuf;
3451 ctx.len = len;
3452 ctx.flags = flags;
3453 ctx.addrbuf = &addrbuf;
3454 ctx.addrlen = &addrlen;
3455 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003457
Victor Stinner31bf2d52015-04-01 21:57:09 +02003458 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3459 s->sock_proto);
3460 if (*addr == NULL)
3461 return -1;
3462
3463 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003464}
3465
3466/* s.recvfrom(nbytes [,flags]) method */
3467
3468static PyObject *
3469sock_recvfrom(PySocketSockObject *s, PyObject *args)
3470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 PyObject *buf = NULL;
3472 PyObject *addr = NULL;
3473 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003474 int flags = 0;
3475 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003476
Antoine Pitrou19467d22010-08-17 19:33:30 +00003477 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 if (recvlen < 0) {
3481 PyErr_SetString(PyExc_ValueError,
3482 "negative buffersize in recvfrom");
3483 return NULL;
3484 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3487 if (buf == NULL)
3488 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3491 recvlen, flags, &addr);
3492 if (outlen < 0) {
3493 goto finally;
3494 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 if (outlen != recvlen) {
3497 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003498 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003500 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 goto finally;
3502 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003505
3506finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 Py_XDECREF(buf);
3508 Py_XDECREF(addr);
3509 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003510}
3511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003512PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003513"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3514\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003515Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003516
Thomas Wouters477c8d52006-05-27 19:21:47 +00003517
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003518/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003519
3520static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003521sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003524
Antoine Pitrou19467d22010-08-17 19:33:30 +00003525 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 Py_buffer pbuf;
3527 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003528 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003531
Antoine Pitrou19467d22010-08-17 19:33:30 +00003532 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 kwlist, &pbuf,
3534 &recvlen, &flags))
3535 return NULL;
3536 buf = pbuf.buf;
3537 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 if (recvlen < 0) {
3540 PyBuffer_Release(&pbuf);
3541 PyErr_SetString(PyExc_ValueError,
3542 "negative buffersize in recvfrom_into");
3543 return NULL;
3544 }
3545 if (recvlen == 0) {
3546 /* If nbytes was not specified, use the buffer's length */
3547 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003548 } else if (recvlen > buflen) {
3549 PyBuffer_Release(&pbuf);
3550 PyErr_SetString(PyExc_ValueError,
3551 "nbytes is greater than the length of the buffer");
3552 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3556 if (readlen < 0) {
3557 PyBuffer_Release(&pbuf);
3558 /* Return an error */
3559 Py_XDECREF(addr);
3560 return NULL;
3561 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 PyBuffer_Release(&pbuf);
3564 /* Return the number of bytes read and the address. Note that we do
3565 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003566 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003567}
3568
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003569PyDoc_STRVAR(recvfrom_into_doc,
3570"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003571\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003572Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003573
Victor Stinner35bee932015-04-02 12:28:07 +02003574/* The sendmsg() and recvmsg[_into]() methods require a working
3575 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3576#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003577struct sock_recvmsg {
3578 struct msghdr *msg;
3579 int flags;
3580 ssize_t result;
3581};
3582
3583static int
3584sock_recvmsg_impl(PySocketSockObject *s, void *data)
3585{
3586 struct sock_recvmsg *ctx = data;
3587
3588 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3589 return (ctx->result >= 0);
3590}
3591
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003592/*
3593 * Call recvmsg() with the supplied iovec structures, flags, and
3594 * ancillary data buffer size (controllen). Returns the tuple return
3595 * value for recvmsg() or recvmsg_into(), with the first item provided
3596 * by the supplied makeval() function. makeval() will be called with
3597 * the length read and makeval_data as arguments, and must return a
3598 * new reference (which will be decrefed if there is a subsequent
3599 * error). On error, closes any file descriptors received via
3600 * SCM_RIGHTS.
3601 */
3602static PyObject *
3603sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3604 int flags, Py_ssize_t controllen,
3605 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3606{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003607 sock_addr_t addrbuf;
3608 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003609 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003610 PyObject *cmsg_list = NULL, *retval = NULL;
3611 void *controlbuf = NULL;
3612 struct cmsghdr *cmsgh;
3613 size_t cmsgdatalen = 0;
3614 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003615 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003616
3617 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3618 ignored" when the socket is connected (Linux fills them in
3619 anyway for AF_UNIX sockets at least). Normally msg_namelen
3620 seems to be set to 0 if there's no address, but try to
3621 initialize msg_name to something that won't be mistaken for a
3622 real address if that doesn't happen. */
3623 if (!getsockaddrlen(s, &addrbuflen))
3624 return NULL;
3625 memset(&addrbuf, 0, addrbuflen);
3626 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3627
3628 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3629 PyErr_SetString(PyExc_ValueError,
3630 "invalid ancillary data buffer length");
3631 return NULL;
3632 }
3633 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3634 return PyErr_NoMemory();
3635
3636 /* Make the system call. */
3637 if (!IS_SELECTABLE(s)) {
3638 select_error();
3639 goto finally;
3640 }
3641
Victor Stinner31bf2d52015-04-01 21:57:09 +02003642 msg.msg_name = SAS2SA(&addrbuf);
3643 msg.msg_namelen = addrbuflen;
3644 msg.msg_iov = iov;
3645 msg.msg_iovlen = iovlen;
3646 msg.msg_control = controlbuf;
3647 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003648
Victor Stinner31bf2d52015-04-01 21:57:09 +02003649 ctx.msg = &msg;
3650 ctx.flags = flags;
3651 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003652 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003653
3654 /* Make list of (level, type, data) tuples from control messages. */
3655 if ((cmsg_list = PyList_New(0)) == NULL)
3656 goto err_closefds;
3657 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3658 implementations didn't do so. */
3659 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3660 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3661 PyObject *bytes, *tuple;
3662 int tmp;
3663
3664 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3665 if (cmsg_status != 0) {
3666 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3667 "received malformed or improperly-truncated "
3668 "ancillary data", 1) == -1)
3669 goto err_closefds;
3670 }
3671 if (cmsg_status < 0)
3672 break;
3673 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003674 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003675 goto err_closefds;
3676 }
3677
3678 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3679 cmsgdatalen);
3680 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3681 (int)cmsgh->cmsg_type, bytes);
3682 if (tuple == NULL)
3683 goto err_closefds;
3684 tmp = PyList_Append(cmsg_list, tuple);
3685 Py_DECREF(tuple);
3686 if (tmp != 0)
3687 goto err_closefds;
3688
3689 if (cmsg_status != 0)
3690 break;
3691 }
3692
3693 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003694 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003695 cmsg_list,
3696 (int)msg.msg_flags,
3697 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3698 ((msg.msg_namelen > addrbuflen) ?
3699 addrbuflen : msg.msg_namelen),
3700 s->sock_proto));
3701 if (retval == NULL)
3702 goto err_closefds;
3703
3704finally:
3705 Py_XDECREF(cmsg_list);
3706 PyMem_Free(controlbuf);
3707 return retval;
3708
3709err_closefds:
3710#ifdef SCM_RIGHTS
3711 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3712 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3713 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3714 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3715 if (cmsg_status < 0)
3716 break;
3717 if (cmsgh->cmsg_level == SOL_SOCKET &&
3718 cmsgh->cmsg_type == SCM_RIGHTS) {
3719 size_t numfds;
3720 int *fdp;
3721
3722 numfds = cmsgdatalen / sizeof(int);
3723 fdp = (int *)CMSG_DATA(cmsgh);
3724 while (numfds-- > 0)
3725 close(*fdp++);
3726 }
3727 if (cmsg_status != 0)
3728 break;
3729 }
3730#endif /* SCM_RIGHTS */
3731 goto finally;
3732}
3733
3734
3735static PyObject *
3736makeval_recvmsg(ssize_t received, void *data)
3737{
3738 PyObject **buf = data;
3739
3740 if (received < PyBytes_GET_SIZE(*buf))
3741 _PyBytes_Resize(buf, received);
3742 Py_XINCREF(*buf);
3743 return *buf;
3744}
3745
3746/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3747
3748static PyObject *
3749sock_recvmsg(PySocketSockObject *s, PyObject *args)
3750{
3751 Py_ssize_t bufsize, ancbufsize = 0;
3752 int flags = 0;
3753 struct iovec iov;
3754 PyObject *buf = NULL, *retval = NULL;
3755
3756 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3757 return NULL;
3758
3759 if (bufsize < 0) {
3760 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3761 return NULL;
3762 }
3763 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3764 return NULL;
3765 iov.iov_base = PyBytes_AS_STRING(buf);
3766 iov.iov_len = bufsize;
3767
3768 /* Note that we're passing a pointer to *our pointer* to the bytes
3769 object here (&buf); makeval_recvmsg() may incref the object, or
3770 deallocate it and set our pointer to NULL. */
3771 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3772 &makeval_recvmsg, &buf);
3773 Py_XDECREF(buf);
3774 return retval;
3775}
3776
3777PyDoc_STRVAR(recvmsg_doc,
3778"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3779\n\
3780Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3781socket. The ancbufsize argument sets the size in bytes of the\n\
3782internal buffer used to receive the ancillary data; it defaults to 0,\n\
3783meaning that no ancillary data will be received. Appropriate buffer\n\
3784sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3785CMSG_LEN(), and items which do not fit into the buffer might be\n\
3786truncated or discarded. The flags argument defaults to 0 and has the\n\
3787same meaning as for recv().\n\
3788\n\
3789The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3790The data item is a bytes object holding the non-ancillary data\n\
3791received. The ancdata item is a list of zero or more tuples\n\
3792(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3793(control messages) received: cmsg_level and cmsg_type are integers\n\
3794specifying the protocol level and protocol-specific type respectively,\n\
3795and cmsg_data is a bytes object holding the associated data. The\n\
3796msg_flags item is the bitwise OR of various flags indicating\n\
3797conditions on the received message; see your system documentation for\n\
3798details. If the receiving socket is unconnected, address is the\n\
3799address of the sending socket, if available; otherwise, its value is\n\
3800unspecified.\n\
3801\n\
3802If recvmsg() raises an exception after the system call returns, it\n\
3803will first attempt to close any file descriptors received via the\n\
3804SCM_RIGHTS mechanism.");
3805
3806
3807static PyObject *
3808makeval_recvmsg_into(ssize_t received, void *data)
3809{
3810 return PyLong_FromSsize_t(received);
3811}
3812
3813/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3814
3815static PyObject *
3816sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3817{
3818 Py_ssize_t ancbufsize = 0;
3819 int flags = 0;
3820 struct iovec *iovs = NULL;
3821 Py_ssize_t i, nitems, nbufs = 0;
3822 Py_buffer *bufs = NULL;
3823 PyObject *buffers_arg, *fast, *retval = NULL;
3824
3825 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3826 &buffers_arg, &ancbufsize, &flags))
3827 return NULL;
3828
3829 if ((fast = PySequence_Fast(buffers_arg,
3830 "recvmsg_into() argument 1 must be an "
3831 "iterable")) == NULL)
3832 return NULL;
3833 nitems = PySequence_Fast_GET_SIZE(fast);
3834 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003835 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003836 goto finally;
3837 }
3838
3839 /* Fill in an iovec for each item, and save the Py_buffer
3840 structs to release afterwards. */
3841 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3842 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3843 PyErr_NoMemory();
3844 goto finally;
3845 }
3846 for (; nbufs < nitems; nbufs++) {
3847 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3848 "w*;recvmsg_into() argument 1 must be an iterable "
3849 "of single-segment read-write buffers",
3850 &bufs[nbufs]))
3851 goto finally;
3852 iovs[nbufs].iov_base = bufs[nbufs].buf;
3853 iovs[nbufs].iov_len = bufs[nbufs].len;
3854 }
3855
3856 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3857 &makeval_recvmsg_into, NULL);
3858finally:
3859 for (i = 0; i < nbufs; i++)
3860 PyBuffer_Release(&bufs[i]);
3861 PyMem_Free(bufs);
3862 PyMem_Free(iovs);
3863 Py_DECREF(fast);
3864 return retval;
3865}
3866
3867PyDoc_STRVAR(recvmsg_into_doc,
3868"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3869\n\
3870Receive normal data and ancillary data from the socket, scattering the\n\
3871non-ancillary data into a series of buffers. The buffers argument\n\
3872must be an iterable of objects that export writable buffers\n\
3873(e.g. bytearray objects); these will be filled with successive chunks\n\
3874of the non-ancillary data until it has all been written or there are\n\
3875no more buffers. The ancbufsize argument sets the size in bytes of\n\
3876the internal buffer used to receive the ancillary data; it defaults to\n\
38770, meaning that no ancillary data will be received. Appropriate\n\
3878buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3879or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3880truncated or discarded. The flags argument defaults to 0 and has the\n\
3881same meaning as for recv().\n\
3882\n\
3883The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3884The nbytes item is the total number of bytes of non-ancillary data\n\
3885written into the buffers. The ancdata item is a list of zero or more\n\
3886tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3887data (control messages) received: cmsg_level and cmsg_type are\n\
3888integers specifying the protocol level and protocol-specific type\n\
3889respectively, and cmsg_data is a bytes object holding the associated\n\
3890data. The msg_flags item is the bitwise OR of various flags\n\
3891indicating conditions on the received message; see your system\n\
3892documentation for details. If the receiving socket is unconnected,\n\
3893address is the address of the sending socket, if available; otherwise,\n\
3894its value is unspecified.\n\
3895\n\
3896If recvmsg_into() raises an exception after the system call returns,\n\
3897it will first attempt to close any file descriptors received via the\n\
3898SCM_RIGHTS mechanism.");
3899#endif /* CMSG_LEN */
3900
3901
Victor Stinner31bf2d52015-04-01 21:57:09 +02003902struct sock_send {
3903 char *buf;
3904 Py_ssize_t len;
3905 int flags;
3906 Py_ssize_t result;
3907};
3908
3909static int
3910sock_send_impl(PySocketSockObject *s, void *data)
3911{
3912 struct sock_send *ctx = data;
3913
3914#ifdef MS_WINDOWS
3915 if (ctx->len > INT_MAX)
3916 ctx->len = INT_MAX;
3917 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3918#else
3919 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3920#endif
3921 return (ctx->result >= 0);
3922}
3923
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003924/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003925
Guido van Rossum73624e91994-10-10 17:59:00 +00003926static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003927sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003928{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003929 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003931 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3934 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 if (!IS_SELECTABLE(s)) {
3937 PyBuffer_Release(&pbuf);
3938 return select_error();
3939 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003940 ctx.buf = pbuf.buf;
3941 ctx.len = pbuf.len;
3942 ctx.flags = flags;
3943 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003944 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 return NULL;
3946 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003947 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003948
3949 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003950}
3951
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003952PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003953"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003954\n\
3955Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003956argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003957sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003958
3959
3960/* s.sendall(data [,flags]) method */
3961
3962static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003963sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003966 Py_ssize_t len, n;
3967 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003969 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003970 int has_timeout = (s->sock_timeout > 0);
3971 _PyTime_t interval = s->sock_timeout;
3972 _PyTime_t deadline = 0;
3973 int deadline_initialized = 0;
3974 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3977 return NULL;
3978 buf = pbuf.buf;
3979 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003981 if (!IS_SELECTABLE(s)) {
3982 PyBuffer_Release(&pbuf);
3983 return select_error();
3984 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003987 if (has_timeout) {
3988 if (deadline_initialized) {
3989 /* recompute the timeout */
3990 interval = deadline - _PyTime_GetMonotonicClock();
3991 }
3992 else {
3993 deadline_initialized = 1;
3994 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3995 }
3996
3997 if (interval <= 0) {
3998 PyErr_SetString(socket_timeout, "timed out");
3999 goto done;
4000 }
4001 }
4002
Victor Stinner02f32ab2015-04-01 22:53:26 +02004003 ctx.buf = buf;
4004 ctx.len = len;
4005 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004006 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4007 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004008 n = ctx.result;
4009 assert(n >= 0);
4010
4011 buf += n;
4012 len -= n;
4013
4014 /* We must run our signal handlers before looping again.
4015 send() can return a successful partial write when it is
4016 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004017 if (PyErr_CheckSignals())
4018 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004019 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004021
Victor Stinner8912d142015-04-06 23:16:34 +02004022 Py_INCREF(Py_None);
4023 res = Py_None;
4024
4025done:
4026 PyBuffer_Release(&pbuf);
4027 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004028}
4029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004030PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004031"sendall(data[, flags])\n\
4032\n\
4033Send a data string to the socket. For the optional flags\n\
4034argument, see the Unix manual. This calls send() repeatedly\n\
4035until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004036to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004037
Guido van Rossum30a685f1991-06-27 15:51:29 +00004038
Victor Stinner31bf2d52015-04-01 21:57:09 +02004039struct sock_sendto {
4040 char *buf;
4041 Py_ssize_t len;
4042 int flags;
4043 int addrlen;
4044 sock_addr_t *addrbuf;
4045 Py_ssize_t result;
4046};
4047
4048static int
4049sock_sendto_impl(PySocketSockObject *s, void *data)
4050{
4051 struct sock_sendto *ctx = data;
4052
4053#ifdef MS_WINDOWS
4054 if (ctx->len > INT_MAX)
4055 ctx->len = INT_MAX;
4056 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4057 SAS2SA(ctx->addrbuf), ctx->addrlen);
4058#else
4059 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4060 SAS2SA(ctx->addrbuf), ctx->addrlen);
4061#endif
4062 return (ctx->result >= 0);
4063}
4064
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004065/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004066
Guido van Rossum73624e91994-10-10 17:59:00 +00004067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004068sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 Py_buffer pbuf;
4071 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004072 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004074 int addrlen, flags;
4075 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004077 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004078 arglen = PyTuple_Size(args);
4079 switch (arglen) {
4080 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004081 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4082 return NULL;
4083 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004084 break;
4085 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004086 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4087 &pbuf, &flags, &addro)) {
4088 return NULL;
4089 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004090 break;
4091 default:
4092 PyErr_Format(PyExc_TypeError,
4093 "sendto() takes 2 or 3 arguments (%d given)",
4094 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004095 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 if (!IS_SELECTABLE(s)) {
4099 PyBuffer_Release(&pbuf);
4100 return select_error();
4101 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4104 PyBuffer_Release(&pbuf);
4105 return NULL;
4106 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004107
Victor Stinner31bf2d52015-04-01 21:57:09 +02004108 ctx.buf = pbuf.buf;
4109 ctx.len = pbuf.len;
4110 ctx.flags = flags;
4111 ctx.addrlen = addrlen;
4112 ctx.addrbuf = &addrbuf;
4113 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004114 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 return NULL;
4116 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004117 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004118
4119 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004120}
4121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004122PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004123"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004124\n\
4125Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004126For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004127
Guido van Rossum30a685f1991-06-27 15:51:29 +00004128
Victor Stinner35bee932015-04-02 12:28:07 +02004129/* The sendmsg() and recvmsg[_into]() methods require a working
4130 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4131#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004132struct sock_sendmsg {
4133 struct msghdr *msg;
4134 int flags;
4135 ssize_t result;
4136};
4137
4138static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004139sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4140 struct msghdr *msg,
4141 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4142 Py_ssize_t ndataparts, ndatabufs = 0;
4143 int result = -1;
4144 struct iovec *iovs = NULL;
4145 PyObject *data_fast = NULL;
4146 Py_buffer *databufs = NULL;
4147
4148 /* Fill in an iovec for each message part, and save the Py_buffer
4149 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004150 data_fast = PySequence_Fast(data_arg,
4151 "sendmsg() argument 1 must be an "
4152 "iterable");
4153 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004154 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004155 }
4156
Christian Heimesdffa3942016-09-05 23:54:41 +02004157 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4158 if (ndataparts > INT_MAX) {
4159 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4160 goto finally;
4161 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004162
Christian Heimesdffa3942016-09-05 23:54:41 +02004163 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004164 if (ndataparts > 0) {
4165 iovs = PyMem_New(struct iovec, ndataparts);
4166 if (iovs == NULL) {
4167 PyErr_NoMemory();
4168 goto finally;
4169 }
4170 msg->msg_iov = iovs;
4171
4172 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004173 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004174 PyErr_NoMemory();
4175 goto finally;
4176 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004177 }
4178 for (; ndatabufs < ndataparts; ndatabufs++) {
4179 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4180 "y*;sendmsg() argument 1 must be an iterable of "
4181 "bytes-like objects",
4182 &databufs[ndatabufs]))
4183 goto finally;
4184 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4185 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4186 }
4187 result = 0;
4188 finally:
4189 *databufsout = databufs;
4190 *ndatabufsout = ndatabufs;
4191 Py_XDECREF(data_fast);
4192 return result;
4193}
4194
4195static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004196sock_sendmsg_impl(PySocketSockObject *s, void *data)
4197{
4198 struct sock_sendmsg *ctx = data;
4199
4200 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4201 return (ctx->result >= 0);
4202}
4203
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004204/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4205
4206static PyObject *
4207sock_sendmsg(PySocketSockObject *s, PyObject *args)
4208{
Christian Heimesdffa3942016-09-05 23:54:41 +02004209 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004211 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004212 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004213 struct cmsginfo {
4214 int level;
4215 int type;
4216 Py_buffer data;
4217 } *cmsgs = NULL;
4218 void *controlbuf = NULL;
4219 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004220 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004221 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004223 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004224
4225 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004226 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004227 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004228 }
4229
4230 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004231
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232 /* Parse destination address. */
4233 if (addr_arg != NULL && addr_arg != Py_None) {
4234 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4235 goto finally;
4236 msg.msg_name = &addrbuf;
4237 msg.msg_namelen = addrlen;
4238 }
4239
4240 /* Fill in an iovec for each message part, and save the Py_buffer
4241 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004242 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004243 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004244 }
4245
4246 if (cmsg_arg == NULL)
4247 ncmsgs = 0;
4248 else {
4249 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4250 "sendmsg() argument 2 must be an "
4251 "iterable")) == NULL)
4252 goto finally;
4253 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4254 }
4255
4256#ifndef CMSG_SPACE
4257 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004258 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259 "sending multiple control messages is not supported "
4260 "on this system");
4261 goto finally;
4262 }
4263#endif
4264 /* Save level, type and Py_buffer for each control message,
4265 and calculate total size. */
4266 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4267 PyErr_NoMemory();
4268 goto finally;
4269 }
4270 controllen = controllen_last = 0;
4271 while (ncmsgbufs < ncmsgs) {
4272 size_t bufsize, space;
4273
4274 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4275 "(iiy*):[sendmsg() ancillary data items]",
4276 &cmsgs[ncmsgbufs].level,
4277 &cmsgs[ncmsgbufs].type,
4278 &cmsgs[ncmsgbufs].data))
4279 goto finally;
4280 bufsize = cmsgs[ncmsgbufs++].data.len;
4281
4282#ifdef CMSG_SPACE
4283 if (!get_CMSG_SPACE(bufsize, &space)) {
4284#else
4285 if (!get_CMSG_LEN(bufsize, &space)) {
4286#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004287 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004288 goto finally;
4289 }
4290 controllen += space;
4291 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004292 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004293 goto finally;
4294 }
4295 controllen_last = controllen;
4296 }
4297
4298 /* Construct ancillary data block from control message info. */
4299 if (ncmsgbufs > 0) {
4300 struct cmsghdr *cmsgh = NULL;
4301
Victor Stinner52d61e42016-09-12 11:41:58 +02004302 controlbuf = PyMem_Malloc(controllen);
4303 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004304 PyErr_NoMemory();
4305 goto finally;
4306 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004307 msg.msg_control = controlbuf;
4308
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004309 msg.msg_controllen = controllen;
4310
4311 /* Need to zero out the buffer as a workaround for glibc's
4312 CMSG_NXTHDR() implementation. After getting the pointer to
4313 the next header, it checks its (uninitialized) cmsg_len
4314 member to see if the "message" fits in the buffer, and
4315 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004316 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004317 memset(controlbuf, 0, controllen);
4318
4319 for (i = 0; i < ncmsgbufs; i++) {
4320 size_t msg_len, data_len = cmsgs[i].data.len;
4321 int enough_space = 0;
4322
4323 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4324 if (cmsgh == NULL) {
4325 PyErr_Format(PyExc_RuntimeError,
4326 "unexpected NULL result from %s()",
4327 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4328 goto finally;
4329 }
4330 if (!get_CMSG_LEN(data_len, &msg_len)) {
4331 PyErr_SetString(PyExc_RuntimeError,
4332 "item size out of range for CMSG_LEN()");
4333 goto finally;
4334 }
4335 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4336 size_t space;
4337
4338 cmsgh->cmsg_len = msg_len;
4339 if (get_cmsg_data_space(&msg, cmsgh, &space))
4340 enough_space = (space >= data_len);
4341 }
4342 if (!enough_space) {
4343 PyErr_SetString(PyExc_RuntimeError,
4344 "ancillary data does not fit in calculated "
4345 "space");
4346 goto finally;
4347 }
4348 cmsgh->cmsg_level = cmsgs[i].level;
4349 cmsgh->cmsg_type = cmsgs[i].type;
4350 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4351 }
4352 }
4353
4354 /* Make the system call. */
4355 if (!IS_SELECTABLE(s)) {
4356 select_error();
4357 goto finally;
4358 }
4359
Victor Stinner31bf2d52015-04-01 21:57:09 +02004360 ctx.msg = &msg;
4361 ctx.flags = flags;
4362 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004364
4365 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366
4367finally:
4368 PyMem_Free(controlbuf);
4369 for (i = 0; i < ncmsgbufs; i++)
4370 PyBuffer_Release(&cmsgs[i].data);
4371 PyMem_Free(cmsgs);
4372 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004373 PyMem_Free(msg.msg_iov);
4374 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004375 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004376 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004377 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004378 return retval;
4379}
4380
4381PyDoc_STRVAR(sendmsg_doc,
4382"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4383\n\
4384Send normal and ancillary data to the socket, gathering the\n\
4385non-ancillary data from a series of buffers and concatenating it into\n\
4386a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004387data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004388The ancdata argument specifies the ancillary data (control messages)\n\
4389as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4390cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4391protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004392is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004393argument defaults to 0 and has the same meaning as for send(). If\n\
4394address is supplied and not None, it sets a destination address for\n\
4395the message. The return value is the number of bytes of non-ancillary\n\
4396data sent.");
4397#endif /* CMSG_LEN */
4398
Christian Heimesdffa3942016-09-05 23:54:41 +02004399#ifdef HAVE_SOCKADDR_ALG
4400static PyObject*
4401sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4402{
4403 PyObject *retval = NULL;
4404
4405 Py_ssize_t i, ndatabufs = 0;
4406 Py_buffer *databufs = NULL;
4407 PyObject *data_arg = NULL;
4408
4409 Py_buffer iv = {NULL, NULL};
4410
4411 PyObject *opobj = NULL;
4412 int op = -1;
4413
4414 PyObject *assoclenobj = NULL;
4415 int assoclen = -1;
4416
4417 unsigned int *uiptr;
4418 int flags = 0;
4419
4420 struct msghdr msg;
4421 struct cmsghdr *header = NULL;
4422 struct af_alg_iv *alg_iv = NULL;
4423 struct sock_sendmsg ctx;
4424 Py_ssize_t controllen;
4425 void *controlbuf = NULL;
4426 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4427
4428 if (self->sock_family != AF_ALG) {
4429 PyErr_SetString(PyExc_OSError,
4430 "algset is only supported for AF_ALG");
4431 return NULL;
4432 }
4433
4434 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4435 "|O$O!y*O!i:sendmsg_afalg", keywords,
4436 &data_arg,
4437 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004438 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004439 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004440 }
4441
4442 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004443
4444 /* op is a required, keyword-only argument >= 0 */
4445 if (opobj != NULL) {
4446 op = _PyLong_AsInt(opobj);
4447 }
4448 if (op < 0) {
4449 /* override exception from _PyLong_AsInt() */
4450 PyErr_SetString(PyExc_TypeError,
4451 "Invalid or missing argument 'op'");
4452 goto finally;
4453 }
4454 /* assoclen is optional but must be >= 0 */
4455 if (assoclenobj != NULL) {
4456 assoclen = _PyLong_AsInt(assoclenobj);
4457 if (assoclen == -1 && PyErr_Occurred()) {
4458 goto finally;
4459 }
4460 if (assoclen < 0) {
4461 PyErr_SetString(PyExc_TypeError,
4462 "assoclen must be positive");
4463 goto finally;
4464 }
4465 }
4466
4467 controllen = CMSG_SPACE(4);
4468 if (iv.buf != NULL) {
4469 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4470 }
4471 if (assoclen >= 0) {
4472 controllen += CMSG_SPACE(4);
4473 }
4474
4475 controlbuf = PyMem_Malloc(controllen);
4476 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004477 PyErr_NoMemory();
4478 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004479 }
4480 memset(controlbuf, 0, controllen);
4481
Christian Heimesdffa3942016-09-05 23:54:41 +02004482 msg.msg_controllen = controllen;
4483 msg.msg_control = controlbuf;
4484
4485 /* Fill in an iovec for each message part, and save the Py_buffer
4486 structs to release afterwards. */
4487 if (data_arg != NULL) {
4488 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4489 goto finally;
4490 }
4491 }
4492
4493 /* set operation to encrypt or decrypt */
4494 header = CMSG_FIRSTHDR(&msg);
4495 if (header == NULL) {
4496 PyErr_SetString(PyExc_RuntimeError,
4497 "unexpected NULL result from CMSG_FIRSTHDR");
4498 goto finally;
4499 }
4500 header->cmsg_level = SOL_ALG;
4501 header->cmsg_type = ALG_SET_OP;
4502 header->cmsg_len = CMSG_LEN(4);
4503 uiptr = (void*)CMSG_DATA(header);
4504 *uiptr = (unsigned int)op;
4505
4506 /* set initialization vector */
4507 if (iv.buf != NULL) {
4508 header = CMSG_NXTHDR(&msg, header);
4509 if (header == NULL) {
4510 PyErr_SetString(PyExc_RuntimeError,
4511 "unexpected NULL result from CMSG_NXTHDR(iv)");
4512 goto finally;
4513 }
4514 header->cmsg_level = SOL_ALG;
4515 header->cmsg_type = ALG_SET_IV;
4516 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4517 alg_iv = (void*)CMSG_DATA(header);
4518 alg_iv->ivlen = iv.len;
4519 memcpy(alg_iv->iv, iv.buf, iv.len);
4520 }
4521
4522 /* set length of associated data for AEAD */
4523 if (assoclen >= 0) {
4524 header = CMSG_NXTHDR(&msg, header);
4525 if (header == NULL) {
4526 PyErr_SetString(PyExc_RuntimeError,
4527 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4528 goto finally;
4529 }
4530 header->cmsg_level = SOL_ALG;
4531 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4532 header->cmsg_len = CMSG_LEN(4);
4533 uiptr = (void*)CMSG_DATA(header);
4534 *uiptr = (unsigned int)assoclen;
4535 }
4536
4537 ctx.msg = &msg;
4538 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004539 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004540 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004541 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004542
4543 retval = PyLong_FromSsize_t(ctx.result);
4544
4545 finally:
4546 PyMem_Free(controlbuf);
4547 if (iv.buf != NULL) {
4548 PyBuffer_Release(&iv);
4549 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004550 PyMem_Free(msg.msg_iov);
4551 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004552 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004553 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004554 PyMem_Free(databufs);
4555 return retval;
4556}
4557
4558PyDoc_STRVAR(sendmsg_afalg_doc,
4559"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4560\n\
4561Set operation mode, IV and length of associated data for an AF_ALG\n\
4562operation socket.");
4563#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004564
Guido van Rossum30a685f1991-06-27 15:51:29 +00004565/* s.shutdown(how) method */
4566
Guido van Rossum73624e91994-10-10 17:59:00 +00004567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004568sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 int how;
4571 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004572
Serhiy Storchaka78980432013-01-15 01:12:17 +02004573 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 if (how == -1 && PyErr_Occurred())
4575 return NULL;
4576 Py_BEGIN_ALLOW_THREADS
4577 res = shutdown(s->sock_fd, how);
4578 Py_END_ALLOW_THREADS
4579 if (res < 0)
4580 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004581 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004582}
4583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004584PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004585"shutdown(flag)\n\
4586\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004587Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4588of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004589
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004590#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004591static PyObject*
4592sock_ioctl(PySocketSockObject *s, PyObject *arg)
4593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 unsigned long cmd = SIO_RCVALL;
4595 PyObject *argO;
4596 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4599 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 switch (cmd) {
4602 case SIO_RCVALL: {
4603 unsigned int option = RCVALL_ON;
4604 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4605 return NULL;
4606 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4607 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4608 return set_error();
4609 }
4610 return PyLong_FromUnsignedLong(recv); }
4611 case SIO_KEEPALIVE_VALS: {
4612 struct tcp_keepalive ka;
4613 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4614 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4615 return NULL;
4616 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4617 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4618 return set_error();
4619 }
4620 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004621#if defined(SIO_LOOPBACK_FAST_PATH)
4622 case SIO_LOOPBACK_FAST_PATH: {
4623 unsigned int option;
4624 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4625 return NULL;
4626 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4627 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4628 return set_error();
4629 }
4630 return PyLong_FromUnsignedLong(recv); }
4631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 default:
4633 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4634 return NULL;
4635 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004636}
4637PyDoc_STRVAR(sock_ioctl_doc,
4638"ioctl(cmd, option) -> long\n\
4639\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004640Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4641SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004642SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4643SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004644#endif
4645
4646#if defined(MS_WINDOWS)
4647static PyObject*
4648sock_share(PySocketSockObject *s, PyObject *arg)
4649{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004650 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004651 DWORD processId;
4652 int result;
4653
4654 if (!PyArg_ParseTuple(arg, "I", &processId))
4655 return NULL;
4656
4657 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004658 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004659 Py_END_ALLOW_THREADS
4660 if (result == SOCKET_ERROR)
4661 return set_error();
4662 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4663}
4664PyDoc_STRVAR(sock_share_doc,
4665"share(process_id) -> bytes\n\
4666\n\
4667Share the socket with another process. The target process id\n\
4668must be provided and the resulting bytes object passed to the target\n\
4669process. There the shared socket can be instantiated by calling\n\
4670socket.fromshare().");
4671
Christian Heimesfaf2f632008-01-06 16:59:19 +00004672
4673#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004674
4675/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004676
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004677static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4679 accept_doc},
4680 {"bind", (PyCFunction)sock_bind, METH_O,
4681 bind_doc},
4682 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004683 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 {"connect", (PyCFunction)sock_connect, METH_O,
4685 connect_doc},
4686 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4687 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004688 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4689 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4691 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004692#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 {"getpeername", (PyCFunction)sock_getpeername,
4694 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 {"getsockname", (PyCFunction)sock_getsockname,
4697 METH_NOARGS, getsockname_doc},
4698 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4699 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004700#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4702 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004703#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004704#if defined(MS_WINDOWS)
4705 {"share", (PyCFunction)sock_share, METH_VARARGS,
4706 sock_share_doc},
4707#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004708 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 listen_doc},
4710 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4711 recv_doc},
4712 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4713 recv_into_doc},
4714 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4715 recvfrom_doc},
4716 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4717 recvfrom_into_doc},
4718 {"send", (PyCFunction)sock_send, METH_VARARGS,
4719 send_doc},
4720 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4721 sendall_doc},
4722 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4723 sendto_doc},
4724 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4725 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004726 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4727 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4729 settimeout_doc},
4730 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4731 gettimeout_doc},
4732 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4733 setsockopt_doc},
4734 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4735 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004736#ifdef CMSG_LEN
4737 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4738 recvmsg_doc},
4739 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4740 recvmsg_into_doc,},
4741 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4742 sendmsg_doc},
4743#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004744#ifdef HAVE_SOCKADDR_ALG
4745 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4746 sendmsg_afalg_doc},
4747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004749};
4750
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004751/* SockObject members */
4752static PyMemberDef sock_memberlist[] = {
4753 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4754 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4755 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004756 {0},
4757};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004758
Victor Stinner71694d52015-03-28 01:18:54 +01004759static PyGetSetDef sock_getsetlist[] = {
4760 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4761 {NULL} /* sentinel */
4762};
4763
Guido van Rossum73624e91994-10-10 17:59:00 +00004764/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004765 First close the file description. */
4766
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004767static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004768sock_finalize(PySocketSockObject *s)
4769{
4770 SOCKET_T fd;
4771 PyObject *error_type, *error_value, *error_traceback;
4772
4773 /* Save the current exception, if any. */
4774 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4775
Victor Stinnerd3afb622016-07-22 17:47:09 +02004776 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004777 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4778 /* Spurious errors can appear at shutdown */
4779 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4780 PyErr_WriteUnraisable((PyObject *)s);
4781 }
4782 }
4783
4784 /* Only close the socket *after* logging the ResourceWarning warning
4785 to allow the logger to call socket methods like
4786 socket.getsockname(). If the socket is closed before, socket
4787 methods fails with the EBADF error. */
4788 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004789 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004790
4791 /* We do not want to retry upon EINTR: see sock_close() */
4792 Py_BEGIN_ALLOW_THREADS
4793 (void) SOCKETCLOSE(fd);
4794 Py_END_ALLOW_THREADS
4795 }
4796
4797 /* Restore the saved exception. */
4798 PyErr_Restore(error_type, error_value, error_traceback);
4799}
4800
4801static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004802sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004803{
Victor Stinner19a8e842016-03-21 16:36:48 +01004804 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4805 return;
4806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004808}
4809
Guido van Rossum30a685f1991-06-27 15:51:29 +00004810
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004811static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004812sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004813{
Victor Stinnere254e532014-07-26 14:36:55 +02004814 long sock_fd;
4815 /* On Windows, this test is needed because SOCKET_T is unsigned */
4816 if (s->sock_fd == INVALID_SOCKET) {
4817 sock_fd = -1;
4818 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004819#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004820 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 /* this can occur on Win64, and actually there is a special
4822 ugly printf formatter for decimal pointer length integer
4823 printing, only bother if necessary*/
4824 PyErr_SetString(PyExc_OverflowError,
4825 "no printf formatter to display "
4826 "the socket descriptor in decimal");
4827 return NULL;
4828 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004829#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004830 else
4831 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 return PyUnicode_FromFormat(
4833 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004834 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 s->sock_type,
4836 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004837}
4838
4839
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004840/* Create a new, uninitialized socket object. */
4841
4842static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004843sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 new = type->tp_alloc(type, 0);
4848 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004849 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004850 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 ((PySocketSockObject *)new)->errorhandler = &set_error;
4852 }
4853 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004854}
4855
4856
4857/* Initialize a new socket object. */
4858
Victor Stinnerdaf45552013-08-28 00:53:59 +02004859#ifdef SOCK_CLOEXEC
4860/* socket() and socketpair() fail with EINVAL on Linux kernel older
4861 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4862static int sock_cloexec_works = -1;
4863#endif
4864
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004865/*ARGSUSED*/
4866static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004867sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 PySocketSockObject *s = (PySocketSockObject *)self;
4870 PyObject *fdobj = NULL;
4871 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004872 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004874#ifndef MS_WINDOWS
4875#ifdef SOCK_CLOEXEC
4876 int *atomic_flag_works = &sock_cloexec_works;
4877#else
4878 int *atomic_flag_works = NULL;
4879#endif
4880#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4883 "|iiiO:socket", keywords,
4884 &family, &type, &proto, &fdobj))
4885 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004888#ifdef MS_WINDOWS
4889 /* recreate a socket that was duplicated */
4890 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004891 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004892 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4893 PyErr_Format(PyExc_ValueError,
4894 "socket descriptor string has wrong size, "
4895 "should be %zu bytes.", sizeof(info));
4896 return -1;
4897 }
4898 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4899 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004900 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004901 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4902 Py_END_ALLOW_THREADS
4903 if (fd == INVALID_SOCKET) {
4904 set_error();
4905 return -1;
4906 }
4907 family = info.iAddressFamily;
4908 type = info.iSocketType;
4909 proto = info.iProtocol;
4910 }
4911 else
4912#endif
4913 {
4914 fd = PyLong_AsSocket_t(fdobj);
4915 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4916 return -1;
4917 if (fd == INVALID_SOCKET) {
4918 PyErr_SetString(PyExc_ValueError,
4919 "can't use invalid socket value");
4920 return -1;
4921 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004922
4923 if (family == -1) {
4924 sock_addr_t addrbuf;
4925 socklen_t addrlen = sizeof(sock_addr_t);
4926
4927 memset(&addrbuf, 0, addrlen);
4928 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4929 family = SAS2SA(&addrbuf)->sa_family;
4930 } else {
4931#ifdef MS_WINDOWS
4932 PyErr_SetFromWindowsErrWithFilename(0, "family");
4933#else
4934 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4935#endif
4936 return -1;
4937 }
4938 }
4939#ifdef SO_TYPE
4940 if (type == -1) {
4941 int tmp;
4942 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02004943 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4944 (void *)&tmp, &slen) == 0)
4945 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004946 type = tmp;
4947 } else {
4948#ifdef MS_WINDOWS
4949 PyErr_SetFromWindowsErrWithFilename(0, "type");
4950#else
4951 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4952#endif
4953 return -1;
4954 }
4955 }
4956#else
4957 type = SOCK_STREAM;
4958#endif
4959#ifdef SO_PROTOCOL
4960 if (proto == -1) {
4961 int tmp;
4962 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02004963 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4964 (void *)&tmp, &slen) == 0)
4965 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004966 proto = tmp;
4967 } else {
4968#ifdef MS_WINDOWS
4969 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4970#else
4971 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4972#endif
4973 return -1;
4974 }
4975 }
4976#else
4977 proto = 0;
4978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 }
4980 }
4981 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004982 /* No fd, default to AF_INET and SOCK_STREAM */
4983 if (family == -1) {
4984 family = AF_INET;
4985 }
4986 if (type == -1) {
4987 type = SOCK_STREAM;
4988 }
4989 if (proto == -1) {
4990 proto = 0;
4991 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004992#ifdef MS_WINDOWS
4993 /* Windows implementation */
4994#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4995#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4996#endif
4997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004999 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005000 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005001 NULL, 0,
5002 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5003 if (fd == INVALID_SOCKET) {
5004 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5005 support_wsa_no_inherit = 0;
5006 fd = socket(family, type, proto);
5007 }
5008 }
5009 else {
5010 fd = socket(family, type, proto);
5011 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 if (fd == INVALID_SOCKET) {
5015 set_error();
5016 return -1;
5017 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005018
5019 if (!support_wsa_no_inherit) {
5020 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5021 closesocket(fd);
5022 PyErr_SetFromWindowsErr(0);
5023 return -1;
5024 }
5025 }
5026#else
5027 /* UNIX */
5028 Py_BEGIN_ALLOW_THREADS
5029#ifdef SOCK_CLOEXEC
5030 if (sock_cloexec_works != 0) {
5031 fd = socket(family, type | SOCK_CLOEXEC, proto);
5032 if (sock_cloexec_works == -1) {
5033 if (fd >= 0) {
5034 sock_cloexec_works = 1;
5035 }
5036 else if (errno == EINVAL) {
5037 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5038 sock_cloexec_works = 0;
5039 fd = socket(family, type, proto);
5040 }
5041 }
5042 }
5043 else
5044#endif
5045 {
5046 fd = socket(family, type, proto);
5047 }
5048 Py_END_ALLOW_THREADS
5049
5050 if (fd == INVALID_SOCKET) {
5051 set_error();
5052 return -1;
5053 }
5054
5055 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5056 SOCKETCLOSE(fd);
5057 return -1;
5058 }
5059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005061 if (init_sockobject(s, fd, family, type, proto) == -1) {
5062 SOCKETCLOSE(fd);
5063 return -1;
5064 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005067
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005068}
5069
5070
Guido van Rossumb6775db1994-08-01 11:34:53 +00005071/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005072
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005073static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5075 "_socket.socket", /* tp_name */
5076 sizeof(PySocketSockObject), /* tp_basicsize */
5077 0, /* tp_itemsize */
5078 (destructor)sock_dealloc, /* tp_dealloc */
5079 0, /* tp_print */
5080 0, /* tp_getattr */
5081 0, /* tp_setattr */
5082 0, /* tp_reserved */
5083 (reprfunc)sock_repr, /* tp_repr */
5084 0, /* tp_as_number */
5085 0, /* tp_as_sequence */
5086 0, /* tp_as_mapping */
5087 0, /* tp_hash */
5088 0, /* tp_call */
5089 0, /* tp_str */
5090 PyObject_GenericGetAttr, /* tp_getattro */
5091 0, /* tp_setattro */
5092 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005093 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5094 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 sock_doc, /* tp_doc */
5096 0, /* tp_traverse */
5097 0, /* tp_clear */
5098 0, /* tp_richcompare */
5099 0, /* tp_weaklistoffset */
5100 0, /* tp_iter */
5101 0, /* tp_iternext */
5102 sock_methods, /* tp_methods */
5103 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005104 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 0, /* tp_base */
5106 0, /* tp_dict */
5107 0, /* tp_descr_get */
5108 0, /* tp_descr_set */
5109 0, /* tp_dictoffset */
5110 sock_initobj, /* tp_init */
5111 PyType_GenericAlloc, /* tp_alloc */
5112 sock_new, /* tp_new */
5113 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005114 0, /* tp_is_gc */
5115 0, /* tp_bases */
5116 0, /* tp_mro */
5117 0, /* tp_cache */
5118 0, /* tp_subclasses */
5119 0, /* tp_weaklist */
5120 0, /* tp_del */
5121 0, /* tp_version_tag */
5122 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005123};
5124
Guido van Rossum30a685f1991-06-27 15:51:29 +00005125
Guido van Rossum81194471991-07-27 21:42:02 +00005126/* Python interface to gethostname(). */
5127
5128/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005129static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005130socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005131{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005132#ifdef MS_WINDOWS
5133 /* Don't use winsock's gethostname, as this returns the ANSI
5134 version of the hostname, whereas we need a Unicode string.
5135 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005136 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005137 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005138 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005139 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005140
5141 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005142 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005143
5144 if (GetLastError() != ERROR_MORE_DATA)
5145 return PyErr_SetFromWindowsErr(0);
5146
5147 if (size == 0)
5148 return PyUnicode_New(0, 0);
5149
5150 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5151 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005152 name = PyMem_New(wchar_t, size);
5153 if (!name) {
5154 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005155 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005156 }
Victor Stinner74168972011-11-17 01:11:36 +01005157 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5158 name,
5159 &size))
5160 {
5161 PyMem_Free(name);
5162 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005163 }
Victor Stinner74168972011-11-17 01:11:36 +01005164
5165 result = PyUnicode_FromWideChar(name, size);
5166 PyMem_Free(name);
5167 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005168#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 char buf[1024];
5170 int res;
5171 Py_BEGIN_ALLOW_THREADS
5172 res = gethostname(buf, (int) sizeof buf - 1);
5173 Py_END_ALLOW_THREADS
5174 if (res < 0)
5175 return set_error();
5176 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005177 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005178#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005179}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005181PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005182"gethostname() -> string\n\
5183\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005184Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005185
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005186#ifdef HAVE_SETHOSTNAME
5187PyDoc_STRVAR(sethostname_doc,
5188"sethostname(name)\n\n\
5189Sets the hostname to name.");
5190
5191static PyObject *
5192socket_sethostname(PyObject *self, PyObject *args)
5193{
5194 PyObject *hnobj;
5195 Py_buffer buf;
5196 int res, flag = 0;
5197
Christian Heimesd2774c72013-06-19 02:06:29 +02005198#ifdef _AIX
5199/* issue #18259, not declared in any useful header file */
5200extern int sethostname(const char *, size_t);
5201#endif
5202
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005203 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5204 PyErr_Clear();
5205 if (!PyArg_ParseTuple(args, "O&:sethostname",
5206 PyUnicode_FSConverter, &hnobj))
5207 return NULL;
5208 flag = 1;
5209 }
5210 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5211 if (!res) {
5212 res = sethostname(buf.buf, buf.len);
5213 PyBuffer_Release(&buf);
5214 }
5215 if (flag)
5216 Py_DECREF(hnobj);
5217 if (res)
5218 return set_error();
5219 Py_RETURN_NONE;
5220}
5221#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005222
Guido van Rossum30a685f1991-06-27 15:51:29 +00005223/* Python interface to gethostbyname(name). */
5224
5225/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005226static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005227socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005230 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005231 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005232
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005233 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 return NULL;
Коренберг Марк7766b962018-02-13 00:47:42 +05005235 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005236 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005237 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005238finally:
5239 PyMem_Free(name);
5240 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005241}
5242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005243PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005244"gethostbyname(host) -> address\n\
5245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005246Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005247
5248
Victor Stinner72400302016-01-28 15:41:01 +01005249static PyObject*
5250sock_decode_hostname(const char *name)
5251{
5252#ifdef MS_WINDOWS
5253 /* Issue #26227: gethostbyaddr() returns a string encoded
5254 * to the ANSI code page */
5255 return PyUnicode_DecodeFSDefault(name);
5256#else
5257 /* Decode from UTF-8 */
5258 return PyUnicode_FromString(name);
5259#endif
5260}
5261
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005262/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5263
5264static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005265gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 char **pch;
5268 PyObject *rtn_tuple = (PyObject *)NULL;
5269 PyObject *name_list = (PyObject *)NULL;
5270 PyObject *addr_list = (PyObject *)NULL;
5271 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005272 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 if (h == NULL) {
5275 /* Let's get real error message to return */
5276 set_herror(h_errno);
5277 return NULL;
5278 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 if (h->h_addrtype != af) {
5281 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005282 errno = EAFNOSUPPORT;
5283 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 return NULL;
5285 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 case AF_INET:
5290 if (alen < sizeof(struct sockaddr_in))
5291 return NULL;
5292 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005293
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005294#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 case AF_INET6:
5296 if (alen < sizeof(struct sockaddr_in6))
5297 return NULL;
5298 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005299#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 if ((name_list = PyList_New(0)) == NULL)
5304 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 if ((addr_list = PyList_New(0)) == NULL)
5307 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 /* SF #1511317: h_aliases can be NULL */
5310 if (h->h_aliases) {
5311 for (pch = h->h_aliases; *pch != NULL; pch++) {
5312 int status;
5313 tmp = PyUnicode_FromString(*pch);
5314 if (tmp == NULL)
5315 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 status = PyList_Append(name_list, tmp);
5318 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 if (status)
5321 goto err;
5322 }
5323 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5326 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 case AF_INET:
5331 {
5332 struct sockaddr_in sin;
5333 memset(&sin, 0, sizeof(sin));
5334 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005335#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005339 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 if (pch == h->h_addr_list && alen >= sizeof(sin))
5342 memcpy((char *) addr, &sin, sizeof(sin));
5343 break;
5344 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005345
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005346#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 case AF_INET6:
5348 {
5349 struct sockaddr_in6 sin6;
5350 memset(&sin6, 0, sizeof(sin6));
5351 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005356 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5359 memcpy((char *) addr, &sin6, sizeof(sin6));
5360 break;
5361 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005362#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005365 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 "unsupported address family");
5367 return NULL;
5368 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 if (tmp == NULL)
5371 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 status = PyList_Append(addr_list, tmp);
5374 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 if (status)
5377 goto err;
5378 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005379
Victor Stinner72400302016-01-28 15:41:01 +01005380 name = sock_decode_hostname(h->h_name);
5381 if (name == NULL)
5382 goto err;
5383 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005384
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005385 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 Py_XDECREF(name_list);
5387 Py_XDECREF(addr_list);
5388 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005389}
5390
5391
5392/* Python interface to gethostbyname_ex(name). */
5393
5394/*ARGSUSED*/
5395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005396socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 char *name;
5399 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005400 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005402 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005403#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005405#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005407#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 char buf[16384];
5409 int buf_len = (sizeof buf) - 1;
5410 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005411#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005412#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005414#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005415#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005417 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005419 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005420 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005422#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005423#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005424 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005426#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005428#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 memset((void *) &data, '\0', sizeof(data));
5430 result = gethostbyname_r(name, &hp_allocated, &data);
5431 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005432#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005433#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005434#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005436#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005437 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005439#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 Py_END_ALLOW_THREADS
5441 /* Some C libraries would require addr.__ss_family instead of
5442 addr.ss_family.
5443 Therefore, we cast the sockaddr_storage into sockaddr to
5444 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005445 sa = SAS2SA(&addr);
5446 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005448#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005450#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005451finally:
5452 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005454}
5455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005456PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005457"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5458\n\
5459Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005460for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005461
5462
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005463/* Python interface to gethostbyaddr(IP). */
5464
5465/*ARGSUSED*/
5466static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005467socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005468{
Charles-François Natali8b759652011-12-23 16:44:51 +01005469 sock_addr_t addr;
5470 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 char *ip_num;
5472 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005473 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005474#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005476#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005478#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 /* glibcs up to 2.10 assume that the buf argument to
5480 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5481 does not ensure. The attribute below instructs the compiler
5482 to maintain this alignment. */
5483 char buf[16384] Py_ALIGNED(8);
5484 int buf_len = (sizeof buf) - 1;
5485 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005486#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005487#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005489#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005490#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005491 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 int al;
5493 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005494
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005495 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 return NULL;
5497 af = AF_UNSPEC;
5498 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005499 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 af = sa->sa_family;
5501 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005502 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 switch (af) {
5504 case AF_INET:
5505 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5506 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5507 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005508#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 case AF_INET6:
5510 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5511 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5512 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005515 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005516 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 }
5518 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005519#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005520#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005521 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 &hp_allocated, buf, buf_len,
5523 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005524#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 h = gethostbyaddr_r(ap, al, af,
5526 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005527#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 memset((void *) &data, '\0', sizeof(data));
5529 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5530 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005531#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005532#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005533#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005535#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005536 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005538#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005540 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005541#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005543#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005544finally:
5545 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005547}
5548
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005549PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005550"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5551\n\
5552Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005553for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005554
Guido van Rossum30a685f1991-06-27 15:51:29 +00005555
5556/* Python interface to getservbyname(name).
5557 This only returns the port number, since the other info is already
5558 known or not useful (like the list of aliases). */
5559
5560/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005562socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005563{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005564 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 struct servent *sp;
5566 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5567 return NULL;
5568 Py_BEGIN_ALLOW_THREADS
5569 sp = getservbyname(name, proto);
5570 Py_END_ALLOW_THREADS
5571 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005572 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 return NULL;
5574 }
5575 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005576}
5577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005578PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005579"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005580\n\
5581Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005582The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5583otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005584
Guido van Rossum30a685f1991-06-27 15:51:29 +00005585
Barry Warsaw11b91a02004-06-28 00:50:43 +00005586/* Python interface to getservbyport(port).
5587 This only returns the service name, since the other info is already
5588 known or not useful (like the list of aliases). */
5589
5590/*ARGSUSED*/
5591static PyObject *
5592socket_getservbyport(PyObject *self, PyObject *args)
5593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005595 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 struct servent *sp;
5597 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5598 return NULL;
5599 if (port < 0 || port > 0xffff) {
5600 PyErr_SetString(
5601 PyExc_OverflowError,
5602 "getservbyport: port must be 0-65535.");
5603 return NULL;
5604 }
5605 Py_BEGIN_ALLOW_THREADS
5606 sp = getservbyport(htons((short)port), proto);
5607 Py_END_ALLOW_THREADS
5608 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005609 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 return NULL;
5611 }
5612 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005613}
5614
5615PyDoc_STRVAR(getservbyport_doc,
5616"getservbyport(port[, protocolname]) -> string\n\
5617\n\
5618Return the service name from a port number and protocol name.\n\
5619The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5620otherwise any protocol will match.");
5621
Guido van Rossum3901d851996-12-19 16:35:04 +00005622/* Python interface to getprotobyname(name).
5623 This only returns the protocol number, since the other info is
5624 already known or not useful (like the list of aliases). */
5625
5626/*ARGSUSED*/
5627static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005628socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005629{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005630 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 struct protoent *sp;
5632 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5633 return NULL;
5634 Py_BEGIN_ALLOW_THREADS
5635 sp = getprotobyname(name);
5636 Py_END_ALLOW_THREADS
5637 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005638 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 return NULL;
5640 }
5641 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005642}
5643
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005644PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005645"getprotobyname(name) -> integer\n\
5646\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005647Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005648
Christian Heimesd0e31b92018-01-27 09:54:13 +01005649static PyObject *
5650socket_close(PyObject *self, PyObject *fdobj)
5651{
5652 SOCKET_T fd;
5653 int res;
5654
5655 fd = PyLong_AsSocket_t(fdobj);
5656 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5657 return NULL;
5658 Py_BEGIN_ALLOW_THREADS
5659 res = SOCKETCLOSE(fd);
5660 Py_END_ALLOW_THREADS
5661 /* bpo-30319: The peer can already have closed the connection.
5662 Python ignores ECONNRESET on close(). */
5663 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5664 return set_error();
5665 }
5666 Py_RETURN_NONE;
5667}
5668
5669PyDoc_STRVAR(close_doc,
5670"close(integer) -> None\n\
5671\n\
5672Close an integer socket file descriptor. This is like os.close(), but for\n\
5673sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005674
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005675#ifndef NO_DUP
5676/* dup() function for socket fds */
5677
5678static PyObject *
5679socket_dup(PyObject *self, PyObject *fdobj)
5680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 SOCKET_T fd, newfd;
5682 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005683#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005684 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005685#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 fd = PyLong_AsSocket_t(fdobj);
5688 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5689 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005690
Victor Stinnerdaf45552013-08-28 00:53:59 +02005691#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005692 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005693 return set_error();
5694
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005695 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005696 FROM_PROTOCOL_INFO,
5697 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 if (newfd == INVALID_SOCKET)
5699 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005700
Victor Stinnerdaf45552013-08-28 00:53:59 +02005701 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5702 closesocket(newfd);
5703 PyErr_SetFromWindowsErr(0);
5704 return NULL;
5705 }
5706#else
5707 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5708 newfd = _Py_dup(fd);
5709 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005710 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005711#endif
5712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 newfdobj = PyLong_FromSocket_t(newfd);
5714 if (newfdobj == NULL)
5715 SOCKETCLOSE(newfd);
5716 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005717}
5718
5719PyDoc_STRVAR(dup_doc,
5720"dup(integer) -> integer\n\
5721\n\
5722Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5723sockets; on some platforms os.dup() won't work for socket file descriptors.");
5724#endif
5725
5726
Dave Cole331708b2004-08-09 04:51:41 +00005727#ifdef HAVE_SOCKETPAIR
5728/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005729 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005730 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005731
5732/*ARGSUSED*/
5733static PyObject *
5734socket_socketpair(PyObject *self, PyObject *args)
5735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 PySocketSockObject *s0 = NULL, *s1 = NULL;
5737 SOCKET_T sv[2];
5738 int family, type = SOCK_STREAM, proto = 0;
5739 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005740#ifdef SOCK_CLOEXEC
5741 int *atomic_flag_works = &sock_cloexec_works;
5742#else
5743 int *atomic_flag_works = NULL;
5744#endif
5745 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005746
5747#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005749#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5753 &family, &type, &proto))
5754 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005757 Py_BEGIN_ALLOW_THREADS
5758#ifdef SOCK_CLOEXEC
5759 if (sock_cloexec_works != 0) {
5760 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5761 if (sock_cloexec_works == -1) {
5762 if (ret >= 0) {
5763 sock_cloexec_works = 1;
5764 }
5765 else if (errno == EINVAL) {
5766 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5767 sock_cloexec_works = 0;
5768 ret = socketpair(family, type, proto, sv);
5769 }
5770 }
5771 }
5772 else
5773#endif
5774 {
5775 ret = socketpair(family, type, proto, sv);
5776 }
5777 Py_END_ALLOW_THREADS
5778
5779 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005781
5782 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5783 goto finally;
5784 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5785 goto finally;
5786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 s0 = new_sockobject(sv[0], family, type, proto);
5788 if (s0 == NULL)
5789 goto finally;
5790 s1 = new_sockobject(sv[1], family, type, proto);
5791 if (s1 == NULL)
5792 goto finally;
5793 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005794
5795finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 if (res == NULL) {
5797 if (s0 == NULL)
5798 SOCKETCLOSE(sv[0]);
5799 if (s1 == NULL)
5800 SOCKETCLOSE(sv[1]);
5801 }
5802 Py_XDECREF(s0);
5803 Py_XDECREF(s1);
5804 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005805}
5806
5807PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005808"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005809\n\
5810Create a pair of socket objects from the sockets returned by the platform\n\
5811socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005812The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005813AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005814
5815#endif /* HAVE_SOCKETPAIR */
5816
5817
Guido van Rossum006bf911996-06-12 04:04:55 +00005818static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005819socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005820{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005821 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005822
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005823 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 return NULL;
5825 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005826 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005828 "ntohs: can't convert negative Python int to C "
5829 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 return NULL;
5831 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005832 if (x > 0xffff) {
5833 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5834 "ntohs: Python int too large to convert to C "
5835 "16-bit unsigned integer (The silent truncation "
5836 "is deprecated)",
5837 1)) {
5838 return NULL;
5839 }
5840 }
5841 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005842}
5843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005844PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005845"ntohs(integer) -> integer\n\
5846\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005847Convert a 16-bit unsigned integer from network to host byte order.\n\
5848Note that in case the received integer does not fit in 16-bit unsigned\n\
5849integer, but does fit in a positive C int, it is silently truncated to\n\
585016-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005851However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005852exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005853
5854
Guido van Rossum006bf911996-06-12 04:04:55 +00005855static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005856socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 if (PyLong_Check(arg)) {
5861 x = PyLong_AsUnsignedLong(arg);
5862 if (x == (unsigned long) -1 && PyErr_Occurred())
5863 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005864#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 {
5866 unsigned long y;
5867 /* only want the trailing 32 bits */
5868 y = x & 0xFFFFFFFFUL;
5869 if (y ^ x)
5870 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005871 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 x = y;
5873 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 }
5876 else
5877 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005878 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005881}
5882
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005883PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005884"ntohl(integer) -> integer\n\
5885\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005886Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005887
5888
Guido van Rossum006bf911996-06-12 04:04:55 +00005889static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005890socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005891{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005892 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005893
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005894 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 return NULL;
5896 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005897 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005899 "htons: can't convert negative Python int to C "
5900 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 return NULL;
5902 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005903 if (x > 0xffff) {
5904 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5905 "htons: Python int too large to convert to C "
5906 "16-bit unsigned integer (The silent truncation "
5907 "is deprecated)",
5908 1)) {
5909 return NULL;
5910 }
5911 }
5912 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005913}
5914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005915PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005916"htons(integer) -> integer\n\
5917\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005918Convert a 16-bit unsigned integer from host to network byte order.\n\
5919Note that in case the received integer does not fit in 16-bit unsigned\n\
5920integer, but does fit in a positive C int, it is silently truncated to\n\
592116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005922However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005923exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005924
5925
Guido van Rossum006bf911996-06-12 04:04:55 +00005926static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005927socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 if (PyLong_Check(arg)) {
5932 x = PyLong_AsUnsignedLong(arg);
5933 if (x == (unsigned long) -1 && PyErr_Occurred())
5934 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005935#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 {
5937 unsigned long y;
5938 /* only want the trailing 32 bits */
5939 y = x & 0xFFFFFFFFUL;
5940 if (y ^ x)
5941 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005942 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 x = y;
5944 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 }
5947 else
5948 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005949 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 Py_TYPE(arg)->tp_name);
5951 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005952}
5953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005954PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005955"htonl(integer) -> integer\n\
5956\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005957Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005958
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005959/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005961PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005962"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005963\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005964Convert 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 +00005965binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005966
5967static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005968socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005969{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005970#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005972#endif
5973
5974#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005975#if (SIZEOF_INT != 4)
5976#error "Not sure if in_addr_t exists and int is not 32-bits."
5977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 /* Have to use inet_addr() instead */
5979 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005980#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005981 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5984 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005985
Tim Peters1df9fdd2003-02-13 03:13:40 +00005986
5987#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005988
5989#ifdef USE_INET_ATON_WEAKLINK
5990 if (inet_aton != NULL) {
5991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 if (inet_aton(ip_addr, &buf))
5993 return PyBytes_FromStringAndSize((char *)(&buf),
5994 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005995
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005996 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 "illegal IP address string passed to inet_aton");
5998 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005999
Thomas Wouters477c8d52006-05-27 19:21:47 +00006000#ifdef USE_INET_ATON_WEAKLINK
6001 } else {
6002#endif
6003
6004#endif
6005
6006#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 /* special-case this address as inet_addr might return INADDR_NONE
6009 * for this */
6010 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006011 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006013
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006014 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006018 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 "illegal IP address string passed to inet_aton");
6020 return NULL;
6021 }
6022 }
6023 return PyBytes_FromStringAndSize((char *) &packed_addr,
6024 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006025
6026#ifdef USE_INET_ATON_WEAKLINK
6027 }
6028#endif
6029
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006030#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006031}
6032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006033PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006034"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006035\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006036Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006037
6038static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006039socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006040{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006041 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006043
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006044 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 return NULL;
6046 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006047
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006048 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006049 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006051 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 return NULL;
6053 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006054
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006055 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6056 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006057
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006058 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006060}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006061
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006062#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006063
6064PyDoc_STRVAR(inet_pton_doc,
6065"inet_pton(af, ip) -> packed IP address string\n\
6066\n\
6067Convert an IP address from string format to a packed string suitable\n\
6068for use with low-level network functions.");
6069
6070static PyObject *
6071socket_inet_pton(PyObject *self, PyObject *args)
6072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006074 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006076#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006077 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006078#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6082 return NULL;
6083 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006084
Martin v. Löwis04697e82004-06-02 12:35:29 +00006085#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006087 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 "can't use AF_INET6, IPv6 is disabled");
6089 return NULL;
6090 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006091#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 retval = inet_pton(af, ip, packed);
6094 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006095 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 return NULL;
6097 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006098 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 "illegal IP address string passed to inet_pton");
6100 return NULL;
6101 } else if (af == AF_INET) {
6102 return PyBytes_FromStringAndSize(packed,
6103 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006104#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 } else if (af == AF_INET6) {
6106 return PyBytes_FromStringAndSize(packed,
6107 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006110 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 return NULL;
6112 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006113}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006114
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006115PyDoc_STRVAR(inet_ntop_doc,
6116"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6117\n\
6118Convert a packed IP address of the given family to string format.");
6119
6120static PyObject *
6121socket_inet_ntop(PyObject *self, PyObject *args)
6122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006124 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006126#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006127 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006128#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006129 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006130#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006131
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006132 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 return NULL;
6134 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006137 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 PyErr_SetString(PyExc_ValueError,
6139 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006140 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 return NULL;
6142 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006143#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006145 if (packed_ip.len != sizeof(struct in6_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#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 } else {
6153 PyErr_Format(PyExc_ValueError,
6154 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006155 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 return NULL;
6157 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006158
Коренберг Марк7766b962018-02-13 00:47:42 +05006159 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006160 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6161 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006163 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 return NULL;
6165 } else {
6166 return PyUnicode_FromString(retval);
6167 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006168}
6169
6170#endif /* HAVE_INET_PTON */
6171
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006172/* Python interface to getaddrinfo(host, port). */
6173
6174/*ARGSUSED*/
6175static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006176socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006177{
Victor Stinner77af1722011-05-26 14:05:59 +02006178 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006179 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 struct addrinfo hints, *res;
6181 struct addrinfo *res0 = NULL;
6182 PyObject *hobj = NULL;
6183 PyObject *pobj = (PyObject *)NULL;
6184 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006185 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 int family, socktype, protocol, flags;
6187 int error;
6188 PyObject *all = (PyObject *)NULL;
6189 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006190
Georg Brandl6083a4b2013-10-14 06:51:46 +02006191 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006193 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006194 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 &protocol, &flags)) {
6196 return NULL;
6197 }
6198 if (hobj == Py_None) {
6199 hptr = NULL;
6200 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006201 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 if (!idna)
6203 return NULL;
6204 assert(PyBytes_Check(idna));
6205 hptr = PyBytes_AS_STRING(idna);
6206 } else if (PyBytes_Check(hobj)) {
6207 hptr = PyBytes_AsString(hobj);
6208 } else {
6209 PyErr_SetString(PyExc_TypeError,
6210 "getaddrinfo() argument 1 must be string or None");
6211 return NULL;
6212 }
6213 if (PyLong_CheckExact(pobj)) {
6214 long value = PyLong_AsLong(pobj);
6215 if (value == -1 && PyErr_Occurred())
6216 goto err;
6217 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6218 pptr = pbuf;
6219 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006220 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006221 if (pptr == NULL)
6222 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006224 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 } else if (pobj == Py_None) {
6226 pptr = (char *)NULL;
6227 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006228 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 goto err;
6230 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006231#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006232 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006233 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006234 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6235 * This workaround avoids a segfault in libsystem.
6236 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006237 pptr = "00";
6238 }
6239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 memset(&hints, 0, sizeof(hints));
6241 hints.ai_family = family;
6242 hints.ai_socktype = socktype;
6243 hints.ai_protocol = protocol;
6244 hints.ai_flags = flags;
6245 Py_BEGIN_ALLOW_THREADS
6246 ACQUIRE_GETADDRINFO_LOCK
6247 error = getaddrinfo(hptr, pptr, &hints, &res0);
6248 Py_END_ALLOW_THREADS
6249 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6250 if (error) {
6251 set_gaierror(error);
6252 goto err;
6253 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006254
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006255 all = PyList_New(0);
6256 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 goto err;
6258 for (res = res0; res; res = res->ai_next) {
6259 PyObject *single;
6260 PyObject *addr =
6261 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6262 if (addr == NULL)
6263 goto err;
6264 single = Py_BuildValue("iiisO", res->ai_family,
6265 res->ai_socktype, res->ai_protocol,
6266 res->ai_canonname ? res->ai_canonname : "",
6267 addr);
6268 Py_DECREF(addr);
6269 if (single == NULL)
6270 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 if (PyList_Append(all, single))
6273 goto err;
6274 Py_XDECREF(single);
6275 }
6276 Py_XDECREF(idna);
6277 if (res0)
6278 freeaddrinfo(res0);
6279 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006280 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 Py_XDECREF(all);
6282 Py_XDECREF(idna);
6283 if (res0)
6284 freeaddrinfo(res0);
6285 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006286}
6287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006288PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006289"getaddrinfo(host, port [, family, type, proto, flags])\n\
6290 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006291\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006292Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006293
6294/* Python interface to getnameinfo(sa, flags). */
6295
6296/*ARGSUSED*/
6297static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006298socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 PyObject *sa = (PyObject *)NULL;
6301 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006302 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006303 int port;
6304 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6306 struct addrinfo hints, *res = NULL;
6307 int error;
6308 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006309 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 flags = flowinfo = scope_id = 0;
6312 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6313 return NULL;
6314 if (!PyTuple_Check(sa)) {
6315 PyErr_SetString(PyExc_TypeError,
6316 "getnameinfo() argument 1 must be a tuple");
6317 return NULL;
6318 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006319 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006321 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006323 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006324 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006325 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006326 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006327 return NULL;
6328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6330 memset(&hints, 0, sizeof(hints));
6331 hints.ai_family = AF_UNSPEC;
6332 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006333 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 Py_BEGIN_ALLOW_THREADS
6335 ACQUIRE_GETADDRINFO_LOCK
6336 error = getaddrinfo(hostp, pbuf, &hints, &res);
6337 Py_END_ALLOW_THREADS
6338 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6339 if (error) {
6340 set_gaierror(error);
6341 goto fail;
6342 }
6343 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006344 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 "sockaddr resolved to multiple addresses");
6346 goto fail;
6347 }
6348 switch (res->ai_family) {
6349 case AF_INET:
6350 {
6351 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006352 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353 "IPv4 sockaddr must be 2 tuple");
6354 goto fail;
6355 }
6356 break;
6357 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006358#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 case AF_INET6:
6360 {
6361 struct sockaddr_in6 *sin6;
6362 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006363 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 sin6->sin6_scope_id = scope_id;
6365 break;
6366 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006369 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6371 if (error) {
6372 set_gaierror(error);
6373 goto fail;
6374 }
Victor Stinner72400302016-01-28 15:41:01 +01006375
6376 name = sock_decode_hostname(hbuf);
6377 if (name == NULL)
6378 goto fail;
6379 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006380
6381fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 if (res)
6383 freeaddrinfo(res);
6384 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006385}
6386
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006387PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006388"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006389\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006390Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006391
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006392
6393/* Python API to getting and setting the default timeout value. */
6394
6395static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306396socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006397{
Victor Stinner71694d52015-03-28 01:18:54 +01006398 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006399 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 }
Victor Stinner71694d52015-03-28 01:18:54 +01006401 else {
6402 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6403 return PyFloat_FromDouble(seconds);
6404 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006405}
6406
6407PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006408"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006409\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006410Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006411A value of None indicates that new socket objects have no timeout.\n\
6412When the socket module is first imported, the default is None.");
6413
6414static PyObject *
6415socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6416{
Victor Stinner71694d52015-03-28 01:18:54 +01006417 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006418
Victor Stinner71694d52015-03-28 01:18:54 +01006419 if (socket_parse_timeout(&timeout, arg) < 0)
6420 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006423
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006424 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006425}
6426
6427PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006428"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006429\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006430Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006431A value of None indicates that new socket objects have no timeout.\n\
6432When the socket module is first imported, the default is None.");
6433
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006434#ifdef HAVE_IF_NAMEINDEX
6435/* Python API for getting interface indices and names */
6436
6437static PyObject *
6438socket_if_nameindex(PyObject *self, PyObject *arg)
6439{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006440 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006441 int i;
6442 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006443
Charles-François Natali60713592011-05-20 16:55:06 +02006444 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006445 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006446 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006447 return NULL;
6448 }
6449
6450 list = PyList_New(0);
6451 if (list == NULL) {
6452 if_freenameindex(ni);
6453 return NULL;
6454 }
6455
Charles-François Natali60713592011-05-20 16:55:06 +02006456 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6457 PyObject *ni_tuple = Py_BuildValue("IO&",
6458 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006459
6460 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6461 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006462 Py_DECREF(list);
6463 if_freenameindex(ni);
6464 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006465 }
6466 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006467 }
6468
6469 if_freenameindex(ni);
6470 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006471}
6472
6473PyDoc_STRVAR(if_nameindex_doc,
6474"if_nameindex()\n\
6475\n\
6476Returns a list of network interface information (index, name) tuples.");
6477
Charles-François Natali60713592011-05-20 16:55:06 +02006478static PyObject *
6479socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006480{
Charles-François Natali60713592011-05-20 16:55:06 +02006481 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006482 unsigned long index;
6483
Charles-François Natali60713592011-05-20 16:55:06 +02006484 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6485 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006486 return NULL;
6487
Charles-François Natali60713592011-05-20 16:55:06 +02006488 index = if_nametoindex(PyBytes_AS_STRING(oname));
6489 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006490 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006491 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006492 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006493 return NULL;
6494 }
6495
6496 return PyLong_FromUnsignedLong(index);
6497}
6498
6499PyDoc_STRVAR(if_nametoindex_doc,
6500"if_nametoindex(if_name)\n\
6501\n\
6502Returns the interface index corresponding to the interface name if_name.");
6503
Charles-François Natali60713592011-05-20 16:55:06 +02006504static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006505socket_if_indextoname(PyObject *self, PyObject *arg)
6506{
Charles-François Natali60713592011-05-20 16:55:06 +02006507 unsigned long index;
6508 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006509
Charles-François Natali60713592011-05-20 16:55:06 +02006510 index = PyLong_AsUnsignedLong(arg);
6511 if (index == (unsigned long) -1)
6512 return NULL;
6513
6514 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006515 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006516 return NULL;
6517 }
6518
Charles-François Natali60713592011-05-20 16:55:06 +02006519 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006520}
6521
6522PyDoc_STRVAR(if_indextoname_doc,
6523"if_indextoname(if_index)\n\
6524\n\
6525Returns the interface name corresponding to the interface index if_index.");
6526
6527#endif /* HAVE_IF_NAMEINDEX */
6528
6529
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006530#ifdef CMSG_LEN
6531/* Python interface to CMSG_LEN(length). */
6532
6533static PyObject *
6534socket_CMSG_LEN(PyObject *self, PyObject *args)
6535{
6536 Py_ssize_t length;
6537 size_t result;
6538
6539 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6540 return NULL;
6541 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6542 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6543 return NULL;
6544 }
6545 return PyLong_FromSize_t(result);
6546}
6547
6548PyDoc_STRVAR(CMSG_LEN_doc,
6549"CMSG_LEN(length) -> control message length\n\
6550\n\
6551Return the total length, without trailing padding, of an ancillary\n\
6552data item with associated data of the given length. This value can\n\
6553often be used as the buffer size for recvmsg() to receive a single\n\
6554item of ancillary data, but RFC 3542 requires portable applications to\n\
6555use CMSG_SPACE() and thus include space for padding, even when the\n\
6556item will be the last in the buffer. Raises OverflowError if length\n\
6557is outside the permissible range of values.");
6558
6559
6560#ifdef CMSG_SPACE
6561/* Python interface to CMSG_SPACE(length). */
6562
6563static PyObject *
6564socket_CMSG_SPACE(PyObject *self, PyObject *args)
6565{
6566 Py_ssize_t length;
6567 size_t result;
6568
6569 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6570 return NULL;
6571 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6572 PyErr_SetString(PyExc_OverflowError,
6573 "CMSG_SPACE() argument out of range");
6574 return NULL;
6575 }
6576 return PyLong_FromSize_t(result);
6577}
6578
6579PyDoc_STRVAR(CMSG_SPACE_doc,
6580"CMSG_SPACE(length) -> buffer size\n\
6581\n\
6582Return the buffer size needed for recvmsg() to receive an ancillary\n\
6583data item with associated data of the given length, along with any\n\
6584trailing padding. The buffer space needed to receive multiple items\n\
6585is the sum of the CMSG_SPACE() values for their associated data\n\
6586lengths. Raises OverflowError if length is outside the permissible\n\
6587range of values.");
6588#endif /* CMSG_SPACE */
6589#endif /* CMSG_LEN */
6590
6591
Guido van Rossum30a685f1991-06-27 15:51:29 +00006592/* List of functions exported by this module. */
6593
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006594static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 {"gethostbyname", socket_gethostbyname,
6596 METH_VARARGS, gethostbyname_doc},
6597 {"gethostbyname_ex", socket_gethostbyname_ex,
6598 METH_VARARGS, ghbn_ex_doc},
6599 {"gethostbyaddr", socket_gethostbyaddr,
6600 METH_VARARGS, gethostbyaddr_doc},
6601 {"gethostname", socket_gethostname,
6602 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006603#ifdef HAVE_SETHOSTNAME
6604 {"sethostname", socket_sethostname,
6605 METH_VARARGS, sethostname_doc},
6606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 {"getservbyname", socket_getservbyname,
6608 METH_VARARGS, getservbyname_doc},
6609 {"getservbyport", socket_getservbyport,
6610 METH_VARARGS, getservbyport_doc},
6611 {"getprotobyname", socket_getprotobyname,
6612 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006613 {"close", socket_close,
6614 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006615#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 {"dup", socket_dup,
6617 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006618#endif
Dave Cole331708b2004-08-09 04:51:41 +00006619#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 {"socketpair", socket_socketpair,
6621 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 {"ntohs", socket_ntohs,
6624 METH_VARARGS, ntohs_doc},
6625 {"ntohl", socket_ntohl,
6626 METH_O, ntohl_doc},
6627 {"htons", socket_htons,
6628 METH_VARARGS, htons_doc},
6629 {"htonl", socket_htonl,
6630 METH_O, htonl_doc},
6631 {"inet_aton", socket_inet_aton,
6632 METH_VARARGS, inet_aton_doc},
6633 {"inet_ntoa", socket_inet_ntoa,
6634 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006635#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636 {"inet_pton", socket_inet_pton,
6637 METH_VARARGS, inet_pton_doc},
6638 {"inet_ntop", socket_inet_ntop,
6639 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006640#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006641 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6642 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 {"getnameinfo", socket_getnameinfo,
6644 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306645 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 METH_NOARGS, getdefaulttimeout_doc},
6647 {"setdefaulttimeout", socket_setdefaulttimeout,
6648 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006649#ifdef HAVE_IF_NAMEINDEX
6650 {"if_nameindex", socket_if_nameindex,
6651 METH_NOARGS, if_nameindex_doc},
6652 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006653 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006654 {"if_indextoname", socket_if_indextoname,
6655 METH_O, if_indextoname_doc},
6656#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006657#ifdef CMSG_LEN
6658 {"CMSG_LEN", socket_CMSG_LEN,
6659 METH_VARARGS, CMSG_LEN_doc},
6660#ifdef CMSG_SPACE
6661 {"CMSG_SPACE", socket_CMSG_SPACE,
6662 METH_VARARGS, CMSG_SPACE_doc},
6663#endif
6664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006666};
6667
Guido van Rossum30a685f1991-06-27 15:51:29 +00006668
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006669#ifdef MS_WINDOWS
6670#define OS_INIT_DEFINED
6671
6672/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006673
6674static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006675os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006678}
6679
6680static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006681os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683 WSADATA WSAData;
6684 int ret;
6685 ret = WSAStartup(0x0101, &WSAData);
6686 switch (ret) {
6687 case 0: /* No error */
6688 Py_AtExit(os_cleanup);
6689 return 1; /* Success */
6690 case WSASYSNOTREADY:
6691 PyErr_SetString(PyExc_ImportError,
6692 "WSAStartup failed: network not ready");
6693 break;
6694 case WSAVERNOTSUPPORTED:
6695 case WSAEINVAL:
6696 PyErr_SetString(
6697 PyExc_ImportError,
6698 "WSAStartup failed: requested version not supported");
6699 break;
6700 default:
6701 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6702 break;
6703 }
6704 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006705}
6706
Guido van Rossum8d665e61996-06-26 18:22:49 +00006707#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006708
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006709
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006710
6711#ifndef OS_INIT_DEFINED
6712static int
6713os_init(void)
6714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006716}
6717#endif
6718
6719
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006720/* C API table - always add new things to the end for binary
6721 compatibility. */
6722static
6723PySocketModule_APIObject PySocketModuleAPI =
6724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006726 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006728};
6729
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006730
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006731/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006732
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006733 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006734 "socket.py" which implements some additional functionality.
6735 The import of "_socket" may fail with an ImportError exception if
6736 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006737 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006738 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006739*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006741PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006742"Implementation module for socket operations.\n\
6743\n\
6744See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006745
Martin v. Löwis1a214512008-06-11 05:26:20 +00006746static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 PyModuleDef_HEAD_INIT,
6748 PySocket_MODULE_NAME,
6749 socket_doc,
6750 -1,
6751 socket_methods,
6752 NULL,
6753 NULL,
6754 NULL,
6755 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006756};
6757
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006758PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006759PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763 if (!os_init())
6764 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006765
Victor Stinnerdaf45552013-08-28 00:53:59 +02006766#ifdef MS_WINDOWS
6767 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006768 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006769 }
6770#endif
6771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772 Py_TYPE(&sock_type) = &PyType_Type;
6773 m = PyModule_Create(&socketmodule);
6774 if (m == NULL)
6775 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006776
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006777 Py_INCREF(PyExc_OSError);
6778 PySocketModuleAPI.error = PyExc_OSError;
6779 Py_INCREF(PyExc_OSError);
6780 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006782 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783 if (socket_herror == NULL)
6784 return NULL;
6785 Py_INCREF(socket_herror);
6786 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006787 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788 NULL);
6789 if (socket_gaierror == NULL)
6790 return NULL;
6791 Py_INCREF(socket_gaierror);
6792 PyModule_AddObject(m, "gaierror", socket_gaierror);
6793 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006794 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 if (socket_timeout == NULL)
6796 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006797 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798 Py_INCREF(socket_timeout);
6799 PyModule_AddObject(m, "timeout", socket_timeout);
6800 Py_INCREF((PyObject *)&sock_type);
6801 if (PyModule_AddObject(m, "SocketType",
6802 (PyObject *)&sock_type) != 0)
6803 return NULL;
6804 Py_INCREF((PyObject *)&sock_type);
6805 if (PyModule_AddObject(m, "socket",
6806 (PyObject *)&sock_type) != 0)
6807 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006808
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006809#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006811#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006812 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 Py_INCREF(has_ipv6);
6815 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817 /* Export C API */
6818 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6819 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6820 ) != 0)
6821 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006824#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006826#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006828#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006830#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006831#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006834#endif
6835#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006837#endif
6838#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006839 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006841#endif
6842#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006845#endif
6846#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006849#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006850#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006851 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006853#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006854#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006857#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006858#ifdef HAVE_SOCKADDR_ALG
6859 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6860#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006861#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#endif
6865#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006867#endif
6868#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006871#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006872#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006875#endif
6876#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006879#endif
6880#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006883#endif
6884#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006887#endif
6888#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, AF_NETLINK);
6891 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006892#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006894#endif
6895#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006897#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6899 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006900#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006902#endif
6903#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006905#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006906#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006908#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006909#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006911#endif
6912#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006914#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006916#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006918#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006919#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006921#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006922#ifdef NETLINK_CRYPTO
6923 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6924#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006925#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006926
6927#ifdef AF_VSOCK
6928 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6929 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6930 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6931 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6932 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6933 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6934 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6935 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6936 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6937#endif
6938
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006939#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006942#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006943#ifdef AF_LINK
6944 PyModule_AddIntMacro(m, AF_LINK);
6945#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006946#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006948 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006949#endif
6950#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006953#endif
6954#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006957#endif
6958#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006961#endif
6962#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006965#endif
6966#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006969#endif
6970#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006973#endif
6974#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006977#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006978
Hye-Shik Chang81268602004-02-02 06:05:24 +00006979#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6981 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6982 PyModule_AddIntMacro(m, BTPROTO_HCI);
6983 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006984#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006986#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006987#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006988#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006990#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6992 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006993#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006995 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6996 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006997#endif
6998
Charles-François Natali47413c12011-10-06 19:47:44 +02006999#ifdef AF_CAN
7000 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007002#endif
7003#ifdef PF_CAN
7004 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007006#endif
7007
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007008/* Reliable Datagram Sockets */
7009#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007011#endif
7012#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007014#endif
7015
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007016/* Kernel event messages */
7017#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007019#endif
7020#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007022#endif
7023
Antoine Pitroub156a462010-10-27 20:13:57 +00007024#ifdef AF_PACKET
7025 PyModule_AddIntMacro(m, AF_PACKET);
7026#endif
7027#ifdef PF_PACKET
7028 PyModule_AddIntMacro(m, PF_PACKET);
7029#endif
7030#ifdef PACKET_HOST
7031 PyModule_AddIntMacro(m, PACKET_HOST);
7032#endif
7033#ifdef PACKET_BROADCAST
7034 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7035#endif
7036#ifdef PACKET_MULTICAST
7037 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7038#endif
7039#ifdef PACKET_OTHERHOST
7040 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7041#endif
7042#ifdef PACKET_OUTGOING
7043 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7044#endif
7045#ifdef PACKET_LOOPBACK
7046 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7047#endif
7048#ifdef PACKET_FASTROUTE
7049 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007050#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007051
Christian Heimes043d6f62008-01-07 17:19:16 +00007052#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7057 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7058 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007059
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7061 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7062 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, SOL_TIPC);
7066 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7067 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7068 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7069 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007070
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7072 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7073 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7074 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007076 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7078 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007079#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007082#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7084 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7085 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7086 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7087 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7088 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007089#endif
7090
Christian Heimesdffa3942016-09-05 23:54:41 +02007091#ifdef HAVE_SOCKADDR_ALG
7092 /* Socket options */
7093 PyModule_AddIntMacro(m, ALG_SET_KEY);
7094 PyModule_AddIntMacro(m, ALG_SET_IV);
7095 PyModule_AddIntMacro(m, ALG_SET_OP);
7096 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7097 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7098 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7099
7100 /* Operations */
7101 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7102 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7103 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7104 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7105#endif
7106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOCK_STREAM);
7109 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007110/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007111#ifdef SOCK_RAW
7112 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007114#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007116#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007118#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007119#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007121#endif
7122#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007124#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007134#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007135#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007137#endif
7138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007156#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007157#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007160#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007188#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007189#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007191#endif
7192#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007194#endif
7195#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007197#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007198#ifdef SO_PASSSEC
7199 PyModule_AddIntMacro(m, SO_PASSSEC);
7200#endif
7201#ifdef SO_PEERSEC
7202 PyModule_AddIntMacro(m, SO_PEERSEC);
7203#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007204#ifdef SO_BINDTODEVICE
7205 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7206#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007207#ifdef SO_PRIORITY
7208 PyModule_AddIntMacro(m, SO_PRIORITY);
7209#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007210#ifdef SO_MARK
7211 PyModule_AddIntMacro(m, SO_MARK);
7212#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007213#ifdef SO_DOMAIN
7214 PyModule_AddIntMacro(m, SO_DOMAIN);
7215#endif
7216#ifdef SO_PROTOCOL
7217 PyModule_AddIntMacro(m, SO_PROTOCOL);
7218#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220 /* Maximum number of connections for "listen" */
7221#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
7226
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007227 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007228#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007230#endif
7231#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007233#endif
7234#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007236#endif
7237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238 /* Flags for send, recv */
7239#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007268#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007269#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007271#endif
7272#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007274#endif
7275#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007277#endif
7278#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007280#endif
7281#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007283#endif
7284#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007286#endif
7287#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007289#endif
7290#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#endif
7293#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007295#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007296#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007298#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300 /* Protocol level and numbers, usable for [gs]etsockopt */
7301#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007306#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007326#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007333#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007334#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007336#endif
7337#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7339 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007340#endif
7341#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7343 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7344 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007345
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7347 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7348 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007349#ifdef CAN_ISOTP
7350 PyModule_AddIntMacro(m, CAN_ISOTP);
7351#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007352#endif
7353#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7355 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7356 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7357 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007358#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007359#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7360 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7361#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007362#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007364 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7365 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7366 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7367 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7368 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7369 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7370 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7371 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7372 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7373 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7374 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7375 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7376#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007377#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007379#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007380#ifdef HAVE_SOCKADDR_ALG
7381 PyModule_AddIntMacro(m, SOL_ALG);
7382#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007383#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007385#endif
7386#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007388#endif
7389#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007391#endif
7392#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007394#endif
7395#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007397#endif
7398#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007403#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007411#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007431#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007435 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007442#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007448#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007451#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007454#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007457#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007463#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007501#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007502#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007507#endif
7508/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007511#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007516#endif
7517
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007518#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007520#endif
7521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522 /* Some port configuration */
7523#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007525#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007530#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007532#endif
7533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007534 /* Some reserved IP v.4 addresses */
7535#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007537#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007542#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007543 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007547#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007552#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007553 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef INADDR_ALLHOSTS_GROUP
7556 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7557 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007558#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007559 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007563#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007566#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007570#endif
7571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007572 /* IPv4 [gs]etsockopt options */
7573#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007620#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007621#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007623#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7626#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007629#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007632#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007641#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007645#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007649#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007651#endif
7652#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007654#endif
7655#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007657#endif
7658#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007660#endif
7661#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007663#endif
7664#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007666#endif
7667#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007669#endif
7670#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007672#endif
7673#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007675#endif
7676#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007678#endif
7679#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007681#endif
7682#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007684#endif
7685#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007687#endif
7688#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007690#endif
7691#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007693#endif
7694#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007696#endif
7697#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007699#endif
7700#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007702#endif
7703#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007705#endif
7706#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007708#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007710 /* TCP options */
7711#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007732#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007738#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007741#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007746#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007747#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007749#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007750#ifdef TCP_CONGESTION
7751 PyModule_AddIntMacro(m, TCP_CONGESTION);
7752#endif
7753#ifdef TCP_USER_TIMEOUT
7754 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7755#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007756#ifdef TCP_NOTSENT_LOWAT
7757 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7758#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007760 /* IPX options */
7761#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007763#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007764
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007765/* Reliable Datagram Sockets */
7766#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007768#endif
7769#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007771#endif
7772#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007774#endif
7775#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007777#endif
7778#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007780#endif
7781#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007783#endif
7784#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007786#endif
7787#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007789#endif
7790#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007792#endif
7793#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007795#endif
7796#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007798#endif
7799#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007801#endif
7802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007803 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007804#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007806#endif
7807#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007809#endif
7810#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007812#endif
7813#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007815#endif
7816#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007818#endif
7819#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007821#endif
7822#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007824#endif
7825#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007827#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007828#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007830#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007831#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007833#endif
7834#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007836#endif
7837#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007839#endif
7840#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007842#endif
7843#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007845#endif
7846#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007848#endif
7849#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007851#endif
7852#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007854#endif
7855#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007857#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007858#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007860#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007861#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007863#endif
7864#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007866#endif
7867#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007869#endif
7870#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007872#endif
7873#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007875#endif
7876#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007878#endif
7879#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007881#endif
7882#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007884#endif
7885#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007887#endif
7888#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007890#endif
7891#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007893#endif
7894#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007896#endif
7897#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007899#endif
7900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007901 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007902#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007903 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007904#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007905 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007906#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007907 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007908#endif
7909#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007911#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007912 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007913#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007914 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007915#endif
7916#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007917 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007918#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007919 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007920#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007922#endif
7923
Christian Heimesfaf2f632008-01-06 16:59:19 +00007924#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007925 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007926 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7927#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007928 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007929#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007930 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007931 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7932#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007933 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007934#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007935 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007936 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007937 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007938 PyObject *tmp;
7939 tmp = PyLong_FromUnsignedLong(codes[i]);
7940 if (tmp == NULL)
7941 return NULL;
7942 PyModule_AddObject(m, names[i], tmp);
7943 }
7944 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007945 PyModule_AddIntMacro(m, RCVALL_OFF);
7946 PyModule_AddIntMacro(m, RCVALL_ON);
7947 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007948#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007950#endif
7951#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007953#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007954#endif /* _MSTCPIP_ */
7955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007956 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007957#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007958 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007959#endif
animalize19e7d482018-02-27 02:10:36 +08007960
7961#ifdef MS_WINDOWS
7962 /* remove some flags on older version Windows during run-time */
7963 remove_unusable_flags(m);
7964#endif
7965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007967}