blob: 8c3c2faddb9d215720054641a92a8b7ab5ecc12f [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Bjorn Anderssonbb816512018-09-26 06:47:52 -070010 portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are
11 supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Bjorn Anderssonbb816512018-09-26 06:47:52 -070058- an AF_QIPCRTR socket address is a (node, port) tuple where the
59 node and port are non-negative integers.
Christian Heimes043d6f62008-01-07 17:19:16 +000060- an AF_TIPC socket address is expressed as
61 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000063 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000065 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if addr_type is TIPC_ADDR_NAME:
67 v1 is the server type
68 v2 is the port identifier
69 v3 is ignored
70 if addr_type is TIPC_ADDR_NAMESEQ:
71 v1 is the server type
72 v2 is the lower port number
73 v3 is the upper port number
74 if addr_type is TIPC_ADDR_ID:
75 v1 is the node
76 v2 is the ref
77 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000078
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000082- names starting with sock_ are socket object methods
83- names starting with socket_ are module-level functions
84- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Thomas Wouters477c8d52006-05-27 19:21:47 +000088#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110089#include <AvailabilityMacros.h>
90/* for getaddrinfo thread safety test on old versions of OS X */
91#ifndef MAC_OS_X_VERSION_10_5
92#define MAC_OS_X_VERSION_10_5 1050
93#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 /*
95 * inet_aton is not available on OSX 10.3, yet we want to use a binary
96 * that was build on 10.4 or later to work on that release, weak linking
97 * comes to the rescue.
98 */
99# pragma weak inet_aton
100#endif
101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000103#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104
Gregory P. Smithb474e672018-12-30 17:05:36 -0800105#ifdef _Py_MEMORY_SANITIZER
106# include <sanitizer/msan_interface.h>
107#endif
108
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000110PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100111"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
112socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114Open a socket of the given type. The family argument specifies the\n\
115address family; it defaults to AF_INET. The type argument specifies\n\
116whether this is a stream (SOCK_STREAM, this is the default)\n\
117or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
118specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200119The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000120\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100121When a fileno is passed in, family, type and proto are auto-detected,\n\
122unless they are explicitly set.\n\
123\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124A socket object represents one endpoint of a network connection.\n\
125\n\
126Methods of socket objects (keyword arguments not allowed):\n\
127\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000128_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000129bind(addr) -- bind the socket to a local address\n\
130close() -- close the socket\n\
131connect(addr) -- connect the socket to a remote address\n\
132connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200133dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000134fileno() -- return underlying file descriptor\n\
135getpeername() -- return remote address [*]\n\
136getsockname() -- return local address\n\
137getsockopt(level, optname[, buflen]) -- get socket options\n\
138gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100139listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000141recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000142recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000143recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000144 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145sendall(data[, flags]) -- send all data\n\
146send(data[, flags]) -- send data, may not send all of it\n\
147sendto(data[, flags], addr) -- send data to a given address\n\
148setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500149getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200150setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000151settimeout(None | float) -- set or clear the timeout\n\
152shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700153if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700154if_nametoindex(name) -- return the corresponding interface index\n\
155if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000156\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000157 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000158
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000159/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000160 I hope some day someone can clean this up please... */
161
Guido van Rossum9376b741999-09-15 22:01:40 +0000162/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
163 script doesn't get this right, so we hardcode some platform checks below.
164 On the other hand, not all Linux versions agree, so there the settings
165 computed by the configure script are needed! */
166
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700167#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000168# undef HAVE_GETHOSTBYNAME_R_3_ARG
169# undef HAVE_GETHOSTBYNAME_R_5_ARG
170# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000171#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000172
Victor Stinner710d27e2011-08-23 10:57:32 +0200173#if defined(__OpenBSD__)
174# include <sys/uio.h>
175#endif
176
Stefan Krah1f9eb872016-05-22 17:35:34 +0200177#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000179#endif
180
Guido van Rossume7de2061999-03-24 17:24:33 +0000181#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000182# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# define HAVE_GETHOSTBYNAME_R_3_ARG
184# elif defined(__sun) || defined(__sgi)
185# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700186# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000187/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000188# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
189# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# else
191# undef HAVE_GETHOSTBYNAME_R
192# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000193#endif
194
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200195#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000196# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000197#endif
198
Ned Deilye1d4e582016-02-23 22:05:29 +1100199/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000200#ifdef HAVE_SYS_PARAM_H
201#include <sys/param.h>
202#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000203/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100204 (this includes the getaddrinfo emulation) protect access with a lock.
205
206 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
207 a mix of code including an unsafe implementation from an old BSD's
208 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
209 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100210 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100211
Ned Deilye1d4e582016-02-23 22:05:29 +1100212 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
213 http://www.openbsd.org/plus54.html
214
215 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
216
217http://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 +1100218 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200219#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100220 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000221 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100222 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
223 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100224 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000225#define USE_GETADDRINFO_LOCK
226#endif
227
228#ifdef USE_GETADDRINFO_LOCK
229#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
230#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
231#else
232#define ACQUIRE_GETADDRINFO_LOCK
233#define RELEASE_GETADDRINFO_LOCK
234#endif
235
236#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000238#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000239
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000240
Serhiy Storchakad3187152017-11-09 18:00:38 +0200241#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100242# include <sys/ioctl.h>
243#endif
244
245
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000247/* make sure that the reentrant (gethostbyaddr_r etc)
248 functions are declared correctly if compiling with
249 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000253#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000256#undef _XOPEN_SOURCE
257#include <sys/socket.h>
258#include <sys/types.h>
259#include <netinet/in.h>
260#ifdef _SS_ALIGNSIZE
261#define HAVE_GETADDRINFO 1
262#define HAVE_GETNAMEINFO 1
263#endif
264
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000265#define HAVE_INET_PTON
266#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000267#endif
268
Benjamin Peterson06930632017-09-04 16:36:05 -0700269/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100270#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000271#define INET_ADDRSTRLEN 16
272#endif
273
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000276#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700279#ifdef HAVE_SYS_SOCKET_H
280#include <sys/socket.h>
281#endif
282
283#ifdef HAVE_NET_IF_H
284#include <net/if.h>
285#endif
286
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000287/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000289#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Addressing includes */
292
Guido van Rossum6f489d91996-06-28 20:15:15 +0000293#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294
295/* Non-MS WINDOWS includes */
296# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000297# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000298
Guido van Rossum9376b741999-09-15 22:01:40 +0000299/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000304#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000305
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000306/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000307# ifdef HAVE_FCNTL_H
308# include <fcntl.h>
309# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000310
Steve Dower65e4cb12014-11-22 12:54:57 -0800311/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200312#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800313
animalize19e7d482018-02-27 02:10:36 +0800314/* remove some flags on older version Windows during run-time.
315 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
316typedef struct {
317 DWORD build_number; /* available starting with this Win10 BuildNumber */
318 const char flag_name[20];
319} FlagRuntimeInfo;
320
321/* IMPORTANT: make sure the list ordered by descending build_number */
322static FlagRuntimeInfo win_runtime_flags[] = {
323 /* available starting with Windows 10 1709 */
324 {16299, "TCP_KEEPIDLE"},
325 {16299, "TCP_KEEPINTVL"},
326 /* available starting with Windows 10 1703 */
327 {15063, "TCP_KEEPCNT"},
328 /* available starting with Windows 10 1607 */
329 {14393, "TCP_FASTOPEN"}
330};
331
332static void
333remove_unusable_flags(PyObject *m)
334{
335 PyObject *dict;
336 OSVERSIONINFOEX info;
337 DWORDLONG dwlConditionMask;
338
339 dict = PyModule_GetDict(m);
340 if (dict == NULL) {
341 return;
342 }
343
344 /* set to Windows 10, except BuildNumber. */
345 memset(&info, 0, sizeof(info));
346 info.dwOSVersionInfoSize = sizeof(info);
347 info.dwMajorVersion = 10;
348 info.dwMinorVersion = 0;
349
350 /* set Condition Mask */
351 dwlConditionMask = 0;
352 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
353 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
354 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
355
356 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
357 info.dwBuildNumber = win_runtime_flags[i].build_number;
358 /* greater than or equal to the specified version?
359 Compatibility Mode will not cheat VerifyVersionInfo(...) */
360 if (VerifyVersionInfo(
361 &info,
362 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
363 dwlConditionMask)) {
364 break;
365 }
366 else {
367 if (PyDict_GetItemString(
368 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200369 win_runtime_flags[i].flag_name) != NULL)
370 {
371 if (PyDict_DelItemString(
372 dict,
373 win_runtime_flags[i].flag_name))
374 {
375 PyErr_Clear();
376 }
animalize19e7d482018-02-27 02:10:36 +0800377 }
378 }
379 }
380}
381
Jeremy Hylton22308652001-02-02 03:23:09 +0000382#endif
383
Skip Montanaro7befb992004-02-10 16:50:21 +0000384#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000385
Neal Norwitz39d22e52002-11-02 19:55:21 +0000386#ifndef O_NONBLOCK
387# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000388#endif
389
Trent Micka708d6e2004-09-07 17:48:26 +0000390/* include Python's addrinfo.h unless it causes trouble */
391#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
392 /* Do not include addinfo.h on some newer IRIX versions.
393 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
394 * for example, but not by 6.5.10.
395 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000397 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
398 * EAI_* constants are defined in (the already included) ws2tcpip.h.
399 */
400#else
401# include "addrinfo.h"
402#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000403
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000404#ifdef __APPLE__
405/* On OS X, getaddrinfo returns no error indication of lookup
406 failure, so we must use the emulation instead of the libinfo
407 implementation. Unfortunately, performing an autoconf test
408 for this bug would require DNS access for the machine performing
409 the configuration, which is not acceptable. Therefore, we
410 determine the bug just by checking for __APPLE__. If this bug
411 gets ever fixed, perhaps checking for sys/version.h would be
412 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000413#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600414/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000415 Find to check for Jaguar is that it has getnameinfo(), which
416 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000418#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000419
420#ifdef HAVE_INET_ATON
421#define USE_INET_ATON_WEAKLINK
422#endif
423
Jack Jansen84262fb2002-07-02 14:40:42 +0000424#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000425
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000426/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000427#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000428/* avoid clashes with the C library definition of the symbol. */
429#define getaddrinfo fake_getaddrinfo
430#define gai_strerror fake_gai_strerror
431#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000432#include "getaddrinfo.c"
433#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000434#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000435#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000436#include "getnameinfo.c"
437#endif
438
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000439#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000440#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000441#endif
442
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000443#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000444#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000445#define EAFNOSUPPORT WSAEAFNOSUPPORT
446#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000447#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000448
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000449#ifndef SOCKETCLOSE
450#define SOCKETCLOSE close
451#endif
452
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000453#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000454#define USE_BLUETOOTH 1
455#if defined(__FreeBSD__)
456#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
457#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000458#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000459#define SOL_HCI SOL_HCI_RAW
460#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000461#define sockaddr_l2 sockaddr_l2cap
462#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000464#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
465#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000466#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000467#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000468#define sockaddr_l2 sockaddr_bt
469#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000470#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000472#define SOL_HCI BTPROTO_HCI
473#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000474#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
475#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000476#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000477#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000478#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000479#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
480#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000481#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000482#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
483#endif
484#endif
485
Charles-François Natali8b759652011-12-23 16:44:51 +0100486/* Convert "sock_addr_t *" to "struct sockaddr *". */
487#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488
Martin v. Löwise9416172003-05-03 10:12:45 +0000489/*
490 * Constants for getnameinfo()
491 */
492#if !defined(NI_MAXHOST)
493#define NI_MAXHOST 1025
494#endif
495#if !defined(NI_MAXSERV)
496#define NI_MAXSERV 32
497#endif
498
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000499#ifndef INVALID_SOCKET /* MS defines this */
500#define INVALID_SOCKET (-1)
501#endif
502
Charles-François Natali0cc86852013-09-13 19:53:08 +0200503#ifndef INADDR_NONE
504#define INADDR_NONE (-1)
505#endif
506
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000507/* XXX There's a problem here: *static* functions are not supposed to have
508 a Py prefix (or use CapitalizedWords). Later... */
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510/* Global variable holding the exception type for errors detected
511 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512static PyObject *socket_herror;
513static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000514static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515
Tim Peters643a7fc2002-02-17 04:13:21 +0000516/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000517 The sock_type variable contains pointers to various functions,
518 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000519 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000520static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000521
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000522#if defined(HAVE_POLL_H)
523#include <poll.h>
524#elif defined(HAVE_SYS_POLL_H)
525#include <sys/poll.h>
526#endif
527
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000528/* Largest value to try to store in a socklen_t (used when handling
529 ancillary data). POSIX requires socklen_t to hold at least
530 (2**31)-1 and recommends against storing larger values, but
531 socklen_t was originally int in the BSD interface, so to be on the
532 safe side we use the smaller of (2**31)-1 and INT_MAX. */
533#if INT_MAX > 0x7fffffff
534#define SOCKLEN_T_LIMIT 0x7fffffff
535#else
536#define SOCKLEN_T_LIMIT INT_MAX
537#endif
538
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200539#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000540/* Instead of select(), we'll use poll() since poll() works on any fd. */
541#define IS_SELECTABLE(s) 1
542/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000543#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200544/* If there's no timeout left, we don't have to call select, so it's a safe,
545 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100546#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000547#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000548
549static PyObject*
550select_error(void)
551{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200552 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000554}
555
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000556#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000557#ifndef WSAEAGAIN
558#define WSAEAGAIN WSAEWOULDBLOCK
559#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000560#define CHECK_ERRNO(expected) \
561 (WSAGetLastError() == WSA ## expected)
562#else
563#define CHECK_ERRNO(expected) \
564 (errno == expected)
565#endif
566
Victor Stinnerdaf45552013-08-28 00:53:59 +0200567#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200568# define GET_SOCK_ERROR WSAGetLastError()
569# define SET_SOCK_ERROR(err) WSASetLastError(err)
570# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
571# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
572#else
573# define GET_SOCK_ERROR errno
574# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
575# define SOCK_TIMEOUT_ERR EWOULDBLOCK
576# define SOCK_INPROGRESS_ERR EINPROGRESS
577#endif
578
Erik Janssens874809e2018-09-05 08:29:42 +0200579#ifdef _MSC_VER
580# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
581#else
582# define SUPPRESS_DEPRECATED_CALL
583#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200584
585#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200586/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
587static int support_wsa_no_inherit = -1;
588#endif
589
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590/* Convenience function to raise an error according to errno
591 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592
Guido van Rossum73624e91994-10-10 17:59:00 +0000593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000594set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000596#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 int err_no = WSAGetLastError();
598 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
599 recognizes the error codes used by both GetLastError() and
600 WSAGetLastError */
601 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200602 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000603#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000604
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200605 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606}
607
Guido van Rossum30a685f1991-06-27 15:51:29 +0000608
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000610set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613
614#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (v != NULL) {
620 PyErr_SetObject(socket_herror, v);
621 Py_DECREF(v);
622 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625}
626
627
628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000629set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632
Martin v. Löwis272cb402002-03-01 08:31:07 +0000633#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 /* EAI_SYSTEM is not available on Windows XP. */
635 if (error == EAI_SYSTEM)
636 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000637#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000639#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000641#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 if (v != NULL) {
645 PyErr_SetObject(socket_gaierror, v);
646 Py_DECREF(v);
647 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650}
651
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000652/* Function to perform the setting of socket blocking mode
653 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654static int
655internal_setblocking(PySocketSockObject *s, int block)
656{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400657 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200658#ifdef MS_WINDOWS
659 u_long arg;
660#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100661#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100662 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100663 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000664#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100668#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200670 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400671 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100672#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200674 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400675 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100677 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 else
Victor Stinner9a954832013-12-04 00:41:24 +0100679 new_delay_flag = delay_flag | O_NONBLOCK;
680 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200681 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400682 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100683#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200685 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200686 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400687 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689
690 result = 0;
691
692 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694
Yury Selivanovfa22b292016-10-18 16:03:52 -0400695 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200696#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400697 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200698#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400699 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200700#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400701 }
702
703 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000704}
705
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000706static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200707internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
708 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100711#ifdef HAVE_POLL
712 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200713 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100714#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200715 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200716 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100717#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000718
Victor Stinnerb7df3142015-03-27 22:59:32 +0100719 /* must be called with the GIL held */
720 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100721
Victor Stinner416f2e62015-03-31 13:56:29 +0200722 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200723 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200726 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 /* Prefer poll, if available, since you can poll() any fd
730 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000731#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100732 pollfd.fd = s->sock_fd;
733 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200734 if (connect) {
735 /* On Windows, the socket becomes writable on connection success,
736 but a connection failure is notified as an error. On POSIX, the
737 socket becomes writable on connection success or on connection
738 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200739 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200740 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000741
Victor Stinner71694d52015-03-28 01:18:54 +0100742 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200743 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200744 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000745
Victor Stinner71694d52015-03-28 01:18:54 +0100746 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200747 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100748 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000749#else
Victor Stinnerced11742015-04-09 10:27:25 +0200750 if (interval >= 0) {
751 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
752 tvp = &tv;
753 }
754 else
755 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000756
Victor Stinner71694d52015-03-28 01:18:54 +0100757 FD_ZERO(&fds);
758 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200759 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 if (connect) {
761 /* On Windows, the socket becomes writable on connection success,
762 but a connection failure is notified as an error. On POSIX, the
763 socket becomes writable on connection success or on connection
764 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200765 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200766 }
Victor Stinner71694d52015-03-28 01:18:54 +0100767
768 /* See if the socket is ready */
769 Py_BEGIN_ALLOW_THREADS;
770 if (writing)
771 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200772 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100773 else
774 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200775 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100776 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000777#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 if (n < 0)
780 return -1;
781 if (n == 0)
782 return 1;
783 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000784}
785
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000787
Victor Stinner81c41db2015-04-02 11:50:57 +0200788 On error, raise an exception and return -1 if err is set, or fill err and
789 return -1 otherwise. If a signal was received and the signal handler raised
790 an exception, return -1, and set err to -1 if err is set.
791
792 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100793
Victor Stinner31bf2d52015-04-01 21:57:09 +0200794 If the socket has a timeout, wait until the socket is ready before calling
795 the function: wait until the socket is writable if writing is nonzero, wait
796 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100797
Victor Stinner81c41db2015-04-02 11:50:57 +0200798 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200799 the function, except if the signal handler raised an exception (PEP 475).
800
801 When the function is retried, recompute the timeout using a monotonic clock.
802
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 sock_call_ex() must be called with the GIL held. The socket function is
804 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200806sock_call_ex(PySocketSockObject *s,
807 int writing,
808 int (*sock_func) (PySocketSockObject *s, void *data),
809 void *data,
810 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200811 int *err,
812 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813{
Victor Stinner8912d142015-04-06 23:16:34 +0200814 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200815 _PyTime_t deadline = 0;
816 int deadline_initialized = 0;
817 int res;
818
819 /* sock_call() must be called with the GIL held. */
820 assert(PyGILState_Check());
821
822 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200824 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 /* For connect(), poll even for blocking socket. The connection
826 runs asynchronously. */
827 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200829 _PyTime_t interval;
830
Victor Stinner81c41db2015-04-02 11:50:57 +0200831 if (deadline_initialized) {
832 /* recompute the timeout */
833 interval = deadline - _PyTime_GetMonotonicClock();
834 }
835 else {
836 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200837 deadline = _PyTime_GetMonotonicClock() + timeout;
838 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200839 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840
Victor Stinner10550cd2015-04-03 13:22:27 +0200841 if (interval >= 0)
842 res = internal_select(s, writing, interval, connect);
843 else
844 res = 1;
845 }
846 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200847 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200848 }
849
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200851 if (err)
852 *err = GET_SOCK_ERROR;
853
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854 if (CHECK_ERRNO(EINTR)) {
855 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200856 if (PyErr_CheckSignals()) {
857 if (err)
858 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861
862 /* retry select() */
863 continue;
864 }
865
866 /* select() failed */
867 s->errorhandler();
868 return -1;
869 }
870
871 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200872 if (err)
873 *err = SOCK_TIMEOUT_ERR;
874 else
875 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876 return -1;
877 }
878
879 /* the socket is ready */
880 }
881
Victor Stinner81c41db2015-04-02 11:50:57 +0200882 /* inner loop to retry sock_func() when sock_func() is interrupted
883 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200884 while (1) {
885 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887 Py_END_ALLOW_THREADS
888
889 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200890 /* sock_func() succeeded */
891 if (err)
892 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200893 return 0;
894 }
895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 if (err)
897 *err = GET_SOCK_ERROR;
898
Victor Stinner31bf2d52015-04-01 21:57:09 +0200899 if (!CHECK_ERRNO(EINTR))
900 break;
901
Victor Stinner81c41db2015-04-02 11:50:57 +0200902 /* sock_func() was interrupted by a signal */
903 if (PyErr_CheckSignals()) {
904 if (err)
905 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200906 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200907 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200908
Victor Stinner81c41db2015-04-02 11:50:57 +0200909 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200910 }
911
912 if (s->sock_timeout > 0
913 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200914 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200915
916 For example, select() could indicate a socket is ready for
917 reading, but the data then discarded by the OS because of a
918 wrong checksum.
919
920 Loop on select() to recheck for socket readyness. */
921 continue;
922 }
923
Victor Stinner81c41db2015-04-02 11:50:57 +0200924 /* sock_func() failed */
925 if (!err)
926 s->errorhandler();
927 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000928 return -1;
929 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200930}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000931
Victor Stinner81c41db2015-04-02 11:50:57 +0200932static int
933sock_call(PySocketSockObject *s,
934 int writing,
935 int (*func) (PySocketSockObject *s, void *data),
936 void *data)
937{
Victor Stinner8912d142015-04-06 23:16:34 +0200938 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200939}
940
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000941
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000942/* Initialize a new socket object. */
943
Victor Stinner88ed6402015-04-09 10:23:12 +0200944/* Default timeout for new sockets */
945static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000946
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200947static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000948init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 s->sock_fd = fd;
952 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500955
956 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
957 on some OSes as part of socket.type. We want to reset them here,
958 to make socket.type be set to the same value on all platforms.
959 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
960 not portable.
961 */
962#ifdef SOCK_NONBLOCK
963 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
964#endif
965#ifdef SOCK_CLOEXEC
966 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
967#endif
968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000972#ifdef SOCK_NONBLOCK
973 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100974 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000975 else
976#endif
977 {
978 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200979 if (defaulttimeout >= 0) {
980 if (internal_setblocking(s, 0) == -1) {
981 return -1;
982 }
983 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000984 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200985 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000986}
987
988
Guido van Rossum30a685f1991-06-27 15:51:29 +0000989/* Create a new socket object.
990 This just creates the object and initializes it.
991 If the creation fails, return NULL and set an exception (implicit
992 in NEWOBJ()). */
993
Guido van Rossum73624e91994-10-10 17:59:00 +0000994static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000995new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 PySocketSockObject *s;
998 s = (PySocketSockObject *)
999 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001000 if (s == NULL)
1001 return NULL;
1002 if (init_sockobject(s, fd, family, type, proto) == -1) {
1003 Py_DECREF(s);
1004 return NULL;
1005 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001007}
1008
Guido van Rossum30a685f1991-06-27 15:51:29 +00001009
Guido van Rossum48a680c2001-03-02 06:34:14 +00001010/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001011 thread to be in gethostbyname or getaddrinfo */
1012#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001013static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001014#endif
1015
1016
Guido van Rossum30a685f1991-06-27 15:51:29 +00001017/* Convert a string specifying a host name or one of a few symbolic
1018 names to a numeric IP address. This usually calls gethostbyname()
1019 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001020 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021 an error occurred; then an exception is raised. */
1022
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001024setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 struct addrinfo hints, *res;
1027 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1030 if (name[0] == '\0') {
1031 int siz;
1032 memset(&hints, 0, sizeof(hints));
1033 hints.ai_family = af;
1034 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1035 hints.ai_flags = AI_PASSIVE;
1036 Py_BEGIN_ALLOW_THREADS
1037 ACQUIRE_GETADDRINFO_LOCK
1038 error = getaddrinfo(NULL, "0", &hints, &res);
1039 Py_END_ALLOW_THREADS
1040 /* We assume that those thread-unsafe getaddrinfo() versions
1041 *are* safe regarding their return value, ie. that a
1042 subsequent call to getaddrinfo() does not destroy the
1043 outcome of the first call. */
1044 RELEASE_GETADDRINFO_LOCK
1045 if (error) {
1046 set_gaierror(error);
1047 return -1;
1048 }
1049 switch (res->ai_family) {
1050 case AF_INET:
1051 siz = 4;
1052 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001053#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 case AF_INET6:
1055 siz = 16;
1056 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 default:
1059 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001060 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 "unsupported address family");
1062 return -1;
1063 }
1064 if (res->ai_next) {
1065 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001066 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 "wildcard resolved to multiple address");
1068 return -1;
1069 }
1070 if (res->ai_addrlen < addr_ret_size)
1071 addr_ret_size = res->ai_addrlen;
1072 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1073 freeaddrinfo(res);
1074 return siz;
1075 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001076 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001077 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001078 if (strcmp(name, "255.255.255.255") == 0 ||
1079 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 struct sockaddr_in *sin;
1081 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001082 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 "address family mismatched");
1084 return -1;
1085 }
1086 sin = (struct sockaddr_in *)addr_ret;
1087 memset((void *) sin, '\0', sizeof(*sin));
1088 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001089#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 sin->sin_addr.s_addr = INADDR_BROADCAST;
1093 return sizeof(sin->sin_addr);
1094 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001095
1096 /* avoid a name resolution in case of numeric address */
1097#ifdef HAVE_INET_PTON
1098 /* check for an IPv4 address */
1099 if (af == AF_UNSPEC || af == AF_INET) {
1100 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1101 memset(sin, 0, sizeof(*sin));
1102 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1103 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001104#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001105 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001106#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001107 return 4;
1108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001110#ifdef ENABLE_IPV6
1111 /* check for an IPv6 address - if the address contains a scope ID, we
1112 * fallback to getaddrinfo(), which can handle translation from interface
1113 * name to interface index */
1114 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1115 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1116 memset(sin, 0, sizeof(*sin));
1117 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1118 sin->sin6_family = AF_INET6;
1119#ifdef HAVE_SOCKADDR_SA_LEN
1120 sin->sin6_len = sizeof(*sin);
1121#endif
1122 return 16;
1123 }
1124 }
1125#endif /* ENABLE_IPV6 */
1126#else /* HAVE_INET_PTON */
1127 /* check for an IPv4 address */
1128 if (af == AF_INET || af == AF_UNSPEC) {
1129 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1130 memset(sin, 0, sizeof(*sin));
1131 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1132 sin->sin_family = AF_INET;
1133#ifdef HAVE_SOCKADDR_SA_LEN
1134 sin->sin_len = sizeof(*sin);
1135#endif
1136 return 4;
1137 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001138 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001139#endif /* HAVE_INET_PTON */
1140
1141 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 memset(&hints, 0, sizeof(hints));
1143 hints.ai_family = af;
1144 Py_BEGIN_ALLOW_THREADS
1145 ACQUIRE_GETADDRINFO_LOCK
1146 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001147#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 if (error == EAI_NONAME && af == AF_UNSPEC) {
1149 /* On Tru64 V5.1, numeric-to-addr conversion fails
1150 if no address family is given. Assume IPv4 for now.*/
1151 hints.ai_family = AF_INET;
1152 error = getaddrinfo(name, NULL, &hints, &res);
1153 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 Py_END_ALLOW_THREADS
1156 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1157 if (error) {
1158 set_gaierror(error);
1159 return -1;
1160 }
1161 if (res->ai_addrlen < addr_ret_size)
1162 addr_ret_size = res->ai_addrlen;
1163 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1164 freeaddrinfo(res);
1165 switch (addr_ret->sa_family) {
1166 case AF_INET:
1167 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001168#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_INET6:
1170 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001173 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 return -1;
1175 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001176}
1177
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Коренберг Марк7766b962018-02-13 00:47:42 +05001179/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001182make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001183{
Коренберг Марк7766b962018-02-13 00:47:42 +05001184 char buf[INET_ADDRSTRLEN];
1185 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1186 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 return NULL;
1188 }
1189 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190}
1191
Коренберг Марк7766b962018-02-13 00:47:42 +05001192#ifdef ENABLE_IPV6
1193/* Convert IPv6 sockaddr to a Python str. */
1194
1195static PyObject *
1196make_ipv6_addr(const struct sockaddr_in6 *addr)
1197{
1198 char buf[INET6_ADDRSTRLEN];
1199 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1200 PyErr_SetFromErrno(PyExc_OSError);
1201 return NULL;
1202 }
1203 return PyUnicode_FromString(buf);
1204}
1205#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001207#ifdef USE_BLUETOOTH
1208/* Convert a string representation of a Bluetooth address into a numeric
1209 address. Returns the length (6), or raises an exception and returns -1 if
1210 an error occurred. */
1211
1212static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001213setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 unsigned int b0, b1, b2, b3, b4, b5;
1216 char ch;
1217 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1220 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1221 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1222 bdaddr->b[0] = b0;
1223 bdaddr->b[1] = b1;
1224 bdaddr->b[2] = b2;
1225 bdaddr->b[3] = b3;
1226 bdaddr->b[4] = b4;
1227 bdaddr->b[5] = b5;
1228 return 6;
1229 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001230 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 return -1;
1232 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001233}
1234
1235/* Create a string representation of the Bluetooth address. This is always a
1236 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1237 value (zero padded if necessary). */
1238
1239static PyObject *
1240makebdaddr(bdaddr_t *bdaddr)
1241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1245 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1246 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1247 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001248}
1249#endif
1250
1251
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252/* Create an object representing the given socket address,
1253 suitable for passing it back to bind(), connect() etc.
1254 The family field of the sockaddr structure is inspected
1255 to determine what kind of address it really is. */
1256
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001257/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001258static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001259makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 if (addrlen == 0) {
1262 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001263 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 case AF_INET:
1269 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001270 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1271 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 PyObject *ret = NULL;
1273 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1275 Py_DECREF(addrobj);
1276 }
1277 return ret;
1278 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001279
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001280#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 case AF_UNIX:
1282 {
1283 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001284#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001285 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1286 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1287 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
1289 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001290#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 {
1292 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001293 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 }
1295 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001296#endif /* AF_UNIX */
1297
Martin v. Löwis11017b12006-01-14 18:12:57 +00001298#if defined(AF_NETLINK)
1299 case AF_NETLINK:
1300 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1302 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001303 }
1304#endif /* AF_NETLINK */
1305
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001306#if defined(AF_QIPCRTR)
1307 case AF_QIPCRTR:
1308 {
1309 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1310 return Py_BuildValue("II", a->sq_node, a->sq_port);
1311 }
1312#endif /* AF_QIPCRTR */
1313
caaveryeffc12f2017-09-06 18:18:10 -04001314#if defined(AF_VSOCK)
1315 case AF_VSOCK:
1316 {
1317 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1318 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1319 }
1320#endif /* AF_VSOCK */
1321
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001322#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 case AF_INET6:
1324 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001325 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1326 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 PyObject *ret = NULL;
1328 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001329 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 addrobj,
1331 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001332 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 a->sin6_scope_id);
1334 Py_DECREF(addrobj);
1335 }
1336 return ret;
1337 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001338#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001340#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 case AF_BLUETOOTH:
1342 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case BTPROTO_L2CAP:
1345 {
1346 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1347 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1348 PyObject *ret = NULL;
1349 if (addrobj) {
1350 ret = Py_BuildValue("Oi",
1351 addrobj,
1352 _BT_L2_MEMB(a, psm));
1353 Py_DECREF(addrobj);
1354 }
1355 return ret;
1356 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case BTPROTO_RFCOMM:
1359 {
1360 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1361 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1362 PyObject *ret = NULL;
1363 if (addrobj) {
1364 ret = Py_BuildValue("Oi",
1365 addrobj,
1366 _BT_RC_MEMB(a, channel));
1367 Py_DECREF(addrobj);
1368 }
1369 return ret;
1370 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 case BTPROTO_HCI:
1373 {
1374 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001375#if defined(__NetBSD__) || defined(__DragonFly__)
1376 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001377#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 PyObject *ret = NULL;
1379 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1380 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001381#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001383
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001384#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 case BTPROTO_SCO:
1386 {
1387 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1388 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1389 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001390#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 default:
1393 PyErr_SetString(PyExc_ValueError,
1394 "Unknown Bluetooth protocol");
1395 return NULL;
1396 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001397#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001398
Antoine Pitroub156a462010-10-27 20:13:57 +00001399#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 case AF_PACKET:
1401 {
1402 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001403 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 struct ifreq ifr;
1405 /* need to look up interface name give index */
1406 if (a->sll_ifindex) {
1407 ifr.ifr_ifindex = a->sll_ifindex;
1408 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1409 ifname = ifr.ifr_name;
1410 }
1411 return Py_BuildValue("shbhy#",
1412 ifname,
1413 ntohs(a->sll_protocol),
1414 a->sll_pkttype,
1415 a->sll_hatype,
1416 a->sll_addr,
1417 a->sll_halen);
1418 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001419#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001420
Christian Heimes043d6f62008-01-07 17:19:16 +00001421#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 case AF_TIPC:
1423 {
1424 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1425 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1426 return Py_BuildValue("IIIII",
1427 a->addrtype,
1428 a->addr.nameseq.type,
1429 a->addr.nameseq.lower,
1430 a->addr.nameseq.upper,
1431 a->scope);
1432 } else if (a->addrtype == TIPC_ADDR_NAME) {
1433 return Py_BuildValue("IIIII",
1434 a->addrtype,
1435 a->addr.name.name.type,
1436 a->addr.name.name.instance,
1437 a->addr.name.name.instance,
1438 a->scope);
1439 } else if (a->addrtype == TIPC_ADDR_ID) {
1440 return Py_BuildValue("IIIII",
1441 a->addrtype,
1442 a->addr.id.node,
1443 a->addr.id.ref,
1444 0,
1445 a->scope);
1446 } else {
1447 PyErr_SetString(PyExc_ValueError,
1448 "Invalid address type");
1449 return NULL;
1450 }
1451 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001452#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001453
Serhiy Storchakad3187152017-11-09 18:00:38 +02001454#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001455 case AF_CAN:
1456 {
1457 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001458 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001459 struct ifreq ifr;
1460 /* need to look up interface name given index */
1461 if (a->can_ifindex) {
1462 ifr.ifr_ifindex = a->can_ifindex;
1463 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1464 ifname = ifr.ifr_name;
1465 }
1466
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001467 switch (proto) {
1468#ifdef CAN_ISOTP
1469 case CAN_ISOTP:
1470 {
1471 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1472 ifname,
1473 a->can_addr.tp.rx_id,
1474 a->can_addr.tp.tx_id);
1475 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001476#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001477 default:
1478 {
1479 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1480 ifname);
1481 }
1482 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001483 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001484#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001485
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001486#ifdef PF_SYSTEM
1487 case PF_SYSTEM:
1488 switch(proto) {
1489#ifdef SYSPROTO_CONTROL
1490 case SYSPROTO_CONTROL:
1491 {
1492 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1493 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1494 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001495#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001496 default:
1497 PyErr_SetString(PyExc_ValueError,
1498 "Invalid address type");
1499 return 0;
1500 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001501#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001502
Christian Heimesdffa3942016-09-05 23:54:41 +02001503#ifdef HAVE_SOCKADDR_ALG
1504 case AF_ALG:
1505 {
1506 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1507 return Py_BuildValue("s#s#HH",
1508 a->salg_type,
1509 strnlen((const char*)a->salg_type,
1510 sizeof(a->salg_type)),
1511 a->salg_name,
1512 strnlen((const char*)a->salg_name,
1513 sizeof(a->salg_name)),
1514 a->salg_feat,
1515 a->salg_mask);
1516 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001517#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 default:
1522 /* If we don't know the address family, don't raise an
1523 exception -- return it as an (int, bytes) tuple. */
1524 return Py_BuildValue("iy#",
1525 addr->sa_family,
1526 addr->sa_data,
1527 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530}
1531
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001532/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1533 (in particular, numeric IP addresses). */
1534struct maybe_idna {
1535 PyObject *obj;
1536 char *buf;
1537};
1538
1539static void
1540idna_cleanup(struct maybe_idna *data)
1541{
1542 Py_CLEAR(data->obj);
1543}
1544
1545static int
1546idna_converter(PyObject *obj, struct maybe_idna *data)
1547{
1548 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001549 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001550 if (obj == NULL) {
1551 idna_cleanup(data);
1552 return 1;
1553 }
1554 data->obj = NULL;
1555 len = -1;
1556 if (PyBytes_Check(obj)) {
1557 data->buf = PyBytes_AsString(obj);
1558 len = PyBytes_Size(obj);
1559 }
1560 else if (PyByteArray_Check(obj)) {
1561 data->buf = PyByteArray_AsString(obj);
1562 len = PyByteArray_Size(obj);
1563 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001564 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001565 if (PyUnicode_READY(obj) == -1) {
1566 return 0;
1567 }
1568 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001569 data->buf = PyUnicode_DATA(obj);
1570 len = PyUnicode_GET_LENGTH(obj);
1571 }
1572 else {
1573 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1574 if (!obj2) {
1575 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1576 return 0;
1577 }
1578 assert(PyBytes_Check(obj2));
1579 data->obj = obj2;
1580 data->buf = PyBytes_AS_STRING(obj2);
1581 len = PyBytes_GET_SIZE(obj2);
1582 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001583 }
1584 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001585 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1586 obj->ob_type->tp_name);
1587 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001588 }
1589 if (strlen(data->buf) != len) {
1590 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001591 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001592 return 0;
1593 }
1594 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001595}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001596
1597/* Parse a socket address argument according to the socket object's
1598 address family. Return 1 if the address was in the proper format,
1599 0 of not. The address is returned through addr_ret, its length
1600 through len_ret. */
1601
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001602static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001603getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001604 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001607
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001608#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 case AF_UNIX:
1610 {
1611 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001612 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001613 int retval = 0;
1614
1615 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1616 allow embedded nulls on Linux. */
1617 if (PyUnicode_Check(args)) {
1618 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1619 return 0;
1620 }
1621 else
1622 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001623 if (!PyArg_Parse(args, "y*", &path)) {
1624 Py_DECREF(args);
1625 return retval;
1626 }
1627 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001630#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001631 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001634 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001636 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 }
1638 }
1639 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001640#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 {
1642 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001643 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001644 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001646 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001648 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 }
1650 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001651 memcpy(addr->sun_path, path.buf, path.len);
1652 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001653 retval = 1;
1654 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001655 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001656 Py_DECREF(args);
1657 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001659#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001660
Martin v. Löwis11017b12006-01-14 18:12:57 +00001661#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 case AF_NETLINK:
1663 {
1664 struct sockaddr_nl* addr;
1665 int pid, groups;
1666 addr = (struct sockaddr_nl *)addr_ret;
1667 if (!PyTuple_Check(args)) {
1668 PyErr_Format(
1669 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001670 "%s(): AF_NETLINK address must be tuple, not %.500s",
1671 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 return 0;
1673 }
Oren Milman735171e2018-09-11 19:51:29 +03001674 if (!PyArg_ParseTuple(args,
1675 "II;AF_NETLINK address must be a pair "
1676 "(pid, groups)",
1677 &pid, &groups))
1678 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001680 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 addr->nl_family = AF_NETLINK;
1682 addr->nl_pid = pid;
1683 addr->nl_groups = groups;
1684 *len_ret = sizeof(*addr);
1685 return 1;
1686 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001687#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001688
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001689#if defined(AF_QIPCRTR)
1690 case AF_QIPCRTR:
1691 {
1692 struct sockaddr_qrtr* addr;
1693 unsigned int node, port;
1694 addr = (struct sockaddr_qrtr *)addr_ret;
1695 if (!PyTuple_Check(args)) {
1696 PyErr_Format(
1697 PyExc_TypeError,
1698 "getsockaddrarg: "
1699 "AF_QIPCRTR address must be tuple, not %.500s",
1700 Py_TYPE(args)->tp_name);
1701 return 0;
1702 }
1703 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1704 return 0;
1705 addr->sq_family = AF_QIPCRTR;
1706 addr->sq_node = node;
1707 addr->sq_port = port;
1708 *len_ret = sizeof(*addr);
1709 return 1;
1710 }
1711#endif /* AF_QIPCRTR */
1712
caaveryeffc12f2017-09-06 18:18:10 -04001713#if defined(AF_VSOCK)
1714 case AF_VSOCK:
1715 {
1716 struct sockaddr_vm* addr;
1717 int port, cid;
1718 addr = (struct sockaddr_vm *)addr_ret;
1719 memset(addr, 0, sizeof(struct sockaddr_vm));
1720 if (!PyTuple_Check(args)) {
1721 PyErr_Format(
1722 PyExc_TypeError,
1723 "getsockaddrarg: "
1724 "AF_VSOCK address must be tuple, not %.500s",
1725 Py_TYPE(args)->tp_name);
1726 return 0;
1727 }
1728 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1729 return 0;
1730 addr->svm_family = s->sock_family;
1731 addr->svm_port = port;
1732 addr->svm_cid = cid;
1733 *len_ret = sizeof(*addr);
1734 return 1;
1735 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001736#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001737
1738
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001739#ifdef AF_RDS
1740 case AF_RDS:
1741 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001742#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 case AF_INET:
1745 {
1746 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001747 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 int port, result;
1749 if (!PyTuple_Check(args)) {
1750 PyErr_Format(
1751 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001752 "%s(): AF_INET address must be tuple, not %.500s",
1753 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 return 0;
1755 }
Oren Milman735171e2018-09-11 19:51:29 +03001756 if (!PyArg_ParseTuple(args,
1757 "O&i;AF_INET address must be a pair "
1758 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001759 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001760 {
1761 assert(PyErr_Occurred());
1762 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1763 PyErr_Format(PyExc_OverflowError,
1764 "%s(): port must be 0-65535.", caller);
1765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001769 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001771 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 if (result < 0)
1773 return 0;
1774 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001775 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001777 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 return 0;
1779 }
1780 addr->sin_family = AF_INET;
1781 addr->sin_port = htons((short)port);
1782 *len_ret = sizeof *addr;
1783 return 1;
1784 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001785
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001786#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 case AF_INET6:
1788 {
1789 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001790 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001791 int port, result;
1792 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 flowinfo = scope_id = 0;
1794 if (!PyTuple_Check(args)) {
1795 PyErr_Format(
1796 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001797 "%s(): AF_INET6 address must be tuple, not %.500s",
1798 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 return 0;
1800 }
Oren Milman735171e2018-09-11 19:51:29 +03001801 if (!PyArg_ParseTuple(args,
1802 "O&i|II;AF_INET6 address must be a tuple "
1803 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001804 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001805 &scope_id))
1806 {
1807 assert(PyErr_Occurred());
1808 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1809 PyErr_Format(PyExc_OverflowError,
1810 "%s(): port must be 0-65535.", caller);
1811 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 return 0;
1813 }
1814 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001815 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001817 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 if (result < 0)
1819 return 0;
1820 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001821 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001823 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 return 0;
1825 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001826 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001827 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001828 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001829 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001830 return 0;
1831 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 addr->sin6_family = s->sock_family;
1833 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001834 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 addr->sin6_scope_id = scope_id;
1836 *len_ret = sizeof *addr;
1837 return 1;
1838 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001839#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001840
Hye-Shik Chang81268602004-02-02 06:05:24 +00001841#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 case AF_BLUETOOTH:
1843 {
1844 switch (s->sock_proto) {
1845 case BTPROTO_L2CAP:
1846 {
1847 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001848 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 addr = (struct sockaddr_l2 *)addr_ret;
1851 memset(addr, 0, sizeof(struct sockaddr_l2));
1852 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1853 if (!PyArg_ParseTuple(args, "si", &straddr,
1854 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001855 PyErr_Format(PyExc_OSError,
1856 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return 0;
1858 }
1859 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1860 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 *len_ret = sizeof *addr;
1863 return 1;
1864 }
1865 case BTPROTO_RFCOMM:
1866 {
1867 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001868 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 addr = (struct sockaddr_rc *)addr_ret;
1871 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1872 if (!PyArg_ParseTuple(args, "si", &straddr,
1873 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001874 PyErr_Format(PyExc_OSError,
1875 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 return 0;
1877 }
1878 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1879 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 *len_ret = sizeof *addr;
1882 return 1;
1883 }
1884 case BTPROTO_HCI:
1885 {
1886 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001887#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001888 const char *straddr;
1889 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1890 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001891 PyErr_Format(PyExc_OSError, "%s: "
1892 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001893 return 0;
1894 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001895 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001896 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1897 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001898#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1900 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001901 PyErr_Format(PyExc_OSError,
1902 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return 0;
1904 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001905#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 *len_ret = sizeof *addr;
1907 return 1;
1908 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001909#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 case BTPROTO_SCO:
1911 {
1912 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001913 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 addr = (struct sockaddr_sco *)addr_ret;
1916 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1917 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001918 PyErr_Format(PyExc_OSError,
1919 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 return 0;
1921 }
1922 straddr = PyBytes_AS_STRING(args);
1923 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1924 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 *len_ret = sizeof *addr;
1927 return 1;
1928 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001929#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 default:
Oren Milman735171e2018-09-11 19:51:29 +03001931 PyErr_Format(PyExc_OSError,
1932 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 return 0;
1934 }
1935 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001936#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001937
Antoine Pitroub156a462010-10-27 20:13:57 +00001938#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 case AF_PACKET:
1940 {
1941 struct sockaddr_ll* addr;
1942 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001943 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 int protoNumber;
1945 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001946 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001947 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 if (!PyTuple_Check(args)) {
1950 PyErr_Format(
1951 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001952 "%s(): AF_PACKET address must be tuple, not %.500s",
1953 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 return 0;
1955 }
Oren Milman735171e2018-09-11 19:51:29 +03001956 /* XXX: improve the default error message according to the
1957 documentation of AF_PACKET, which would be added as part
1958 of bpo-25041. */
1959 if (!PyArg_ParseTuple(args,
1960 "si|iiy*;AF_PACKET address must be a tuple of "
1961 "two to five elements",
1962 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001963 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03001964 {
1965 assert(PyErr_Occurred());
1966 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1967 PyErr_Format(PyExc_OverflowError,
1968 "%s(): address argument out of range", caller);
1969 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1973 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1974 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1975 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001976 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 return 0;
1978 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001979 if (haddr.buf && haddr.len > 8) {
1980 PyErr_SetString(PyExc_ValueError,
1981 "Hardware address must be 8 bytes or less");
1982 PyBuffer_Release(&haddr);
1983 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 }
1985 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001986 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04001988 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001989 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 return 0;
1991 }
1992 addr = (struct sockaddr_ll*)addr_ret;
1993 addr->sll_family = AF_PACKET;
1994 addr->sll_protocol = htons((short)protoNumber);
1995 addr->sll_ifindex = ifr.ifr_ifindex;
1996 addr->sll_pkttype = pkttype;
1997 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001998 if (haddr.buf) {
1999 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2000 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002002 else
2003 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002005 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 return 1;
2007 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002008#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002009
Christian Heimes043d6f62008-01-07 17:19:16 +00002010#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 case AF_TIPC:
2012 {
2013 unsigned int atype, v1, v2, v3;
2014 unsigned int scope = TIPC_CLUSTER_SCOPE;
2015 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 if (!PyTuple_Check(args)) {
2018 PyErr_Format(
2019 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002020 "%s(): AF_TIPC address must be tuple, not %.500s",
2021 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 return 0;
2023 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002026 "IIII|I;AF_TIPC address must be a tuple "
2027 "(addr_type, v1, v2, v3[, scope])",
2028 &atype, &v1, &v2, &v3, &scope))
2029 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002031 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 addr = (struct sockaddr_tipc *) addr_ret;
2034 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 addr->family = AF_TIPC;
2037 addr->scope = scope;
2038 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (atype == TIPC_ADDR_NAMESEQ) {
2041 addr->addr.nameseq.type = v1;
2042 addr->addr.nameseq.lower = v2;
2043 addr->addr.nameseq.upper = v3;
2044 } else if (atype == TIPC_ADDR_NAME) {
2045 addr->addr.name.name.type = v1;
2046 addr->addr.name.name.instance = v2;
2047 } else if (atype == TIPC_ADDR_ID) {
2048 addr->addr.id.node = v1;
2049 addr->addr.id.ref = v2;
2050 } else {
2051 /* Shouldn't happen */
2052 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2053 return 0;
2054 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 return 1;
2059 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002060#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002061
Serhiy Storchakad3187152017-11-09 18:00:38 +02002062#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002063 case AF_CAN:
2064 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002065#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002066 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002067 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002068#endif
2069#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002070 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002071#endif
2072#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002073 {
2074 struct sockaddr_can *addr;
2075 PyObject *interfaceName;
2076 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002077 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002078 addr = (struct sockaddr_can *)addr_ret;
2079
Oren Milman735171e2018-09-11 19:51:29 +03002080 if (!PyTuple_Check(args)) {
2081 PyErr_Format(PyExc_TypeError,
2082 "%s(): AF_CAN address must be tuple, not %.500s",
2083 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002084 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002085 }
2086 if (!PyArg_ParseTuple(args,
2087 "O&;AF_CAN address must be a tuple "
2088 "(interface, )",
2089 PyUnicode_FSConverter, &interfaceName))
2090 {
2091 return 0;
2092 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002093
2094 len = PyBytes_GET_SIZE(interfaceName);
2095
2096 if (len == 0) {
2097 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002098 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002099 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2100 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002101 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2102 s->errorhandler();
2103 Py_DECREF(interfaceName);
2104 return 0;
2105 }
2106 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002107 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002108 "AF_CAN interface name too long");
2109 Py_DECREF(interfaceName);
2110 return 0;
2111 }
2112
2113 addr->can_family = AF_CAN;
2114 addr->can_ifindex = ifr.ifr_ifindex;
2115
2116 *len_ret = sizeof(*addr);
2117 Py_DECREF(interfaceName);
2118 return 1;
2119 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002120#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002121
2122#ifdef CAN_ISOTP
2123 case CAN_ISOTP:
2124 {
2125 struct sockaddr_can *addr;
2126 PyObject *interfaceName;
2127 struct ifreq ifr;
2128 Py_ssize_t len;
2129 unsigned long int rx_id, tx_id;
2130
2131 addr = (struct sockaddr_can *)addr_ret;
2132
2133 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2134 &interfaceName,
2135 &rx_id,
2136 &tx_id))
2137 return 0;
2138
2139 len = PyBytes_GET_SIZE(interfaceName);
2140
2141 if (len == 0) {
2142 ifr.ifr_ifindex = 0;
2143 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2144 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2145 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2146 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2147 s->errorhandler();
2148 Py_DECREF(interfaceName);
2149 return 0;
2150 }
2151 } else {
2152 PyErr_SetString(PyExc_OSError,
2153 "AF_CAN interface name too long");
2154 Py_DECREF(interfaceName);
2155 return 0;
2156 }
2157
2158 addr->can_family = AF_CAN;
2159 addr->can_ifindex = ifr.ifr_ifindex;
2160 addr->can_addr.tp.rx_id = rx_id;
2161 addr->can_addr.tp.tx_id = tx_id;
2162
2163 *len_ret = sizeof(*addr);
2164 Py_DECREF(interfaceName);
2165 return 1;
2166 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002167#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002168 default:
Oren Milman735171e2018-09-11 19:51:29 +03002169 PyErr_Format(PyExc_OSError,
2170 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002171 return 0;
2172 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002173#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002174
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002175#ifdef PF_SYSTEM
2176 case PF_SYSTEM:
2177 switch (s->sock_proto) {
2178#ifdef SYSPROTO_CONTROL
2179 case SYSPROTO_CONTROL:
2180 {
2181 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002182
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002183 addr = (struct sockaddr_ctl *)addr_ret;
2184 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002185 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002186
2187 if (PyUnicode_Check(args)) {
2188 struct ctl_info info;
2189 PyObject *ctl_name;
2190
2191 if (!PyArg_Parse(args, "O&",
2192 PyUnicode_FSConverter, &ctl_name)) {
2193 return 0;
2194 }
2195
Victor Stinnerf50e1872015-03-20 11:32:24 +01002196 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002197 PyErr_SetString(PyExc_ValueError,
2198 "provided string is too long");
2199 Py_DECREF(ctl_name);
2200 return 0;
2201 }
2202 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2203 sizeof(info.ctl_name));
2204 Py_DECREF(ctl_name);
2205
2206 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2207 PyErr_SetString(PyExc_OSError,
2208 "cannot find kernel control with provided name");
2209 return 0;
2210 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002211
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002212 addr->sc_id = info.ctl_id;
2213 addr->sc_unit = 0;
2214 } else if (!PyArg_ParseTuple(args, "II",
2215 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002216 PyErr_Format(PyExc_TypeError,
2217 "%s(): PF_SYSTEM address must be a str or "
2218 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002219 return 0;
2220 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002221
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002222 *len_ret = sizeof(*addr);
2223 return 1;
2224 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002225#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002226 default:
Oren Milman735171e2018-09-11 19:51:29 +03002227 PyErr_Format(PyExc_OSError,
2228 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002229 return 0;
2230 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002231#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002232#ifdef HAVE_SOCKADDR_ALG
2233 case AF_ALG:
2234 {
2235 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002236 const char *type;
2237 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002238 sa = (struct sockaddr_alg *)addr_ret;
2239
2240 memset(sa, 0, sizeof(*sa));
2241 sa->salg_family = AF_ALG;
2242
Oren Milman735171e2018-09-11 19:51:29 +03002243 if (!PyTuple_Check(args)) {
2244 PyErr_Format(PyExc_TypeError,
2245 "%s(): AF_ALG address must be tuple, not %.500s",
2246 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002247 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002248 }
2249 if (!PyArg_ParseTuple(args,
2250 "ss|HH;AF_ALG address must be a tuple "
2251 "(type, name[, feat[, mask]])",
2252 &type, &name, &sa->salg_feat, &sa->salg_mask))
2253 {
2254 return 0;
2255 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002256 /* sockaddr_alg has fixed-sized char arrays for type, and name
2257 * both must be NULL terminated.
2258 */
2259 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002260 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2261 return 0;
2262 }
2263 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002264 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002265 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2266 return 0;
2267 }
2268 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2269
2270 *len_ret = sizeof(*sa);
2271 return 1;
2272 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002273#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 default:
Oren Milman735171e2018-09-11 19:51:29 +03002278 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002282}
2283
Guido van Rossum30a685f1991-06-27 15:51:29 +00002284
Guido van Rossum48a680c2001-03-02 06:34:14 +00002285/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002286 Return 1 if the family is known, 0 otherwise. The length is returned
2287 through len_ret. */
2288
2289static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002290getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002293
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002294#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 case AF_UNIX:
2296 {
2297 *len_ret = sizeof (struct sockaddr_un);
2298 return 1;
2299 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002300#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002301
Martin v. Löwis11017b12006-01-14 18:12:57 +00002302#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002303 case AF_NETLINK:
2304 {
2305 *len_ret = sizeof (struct sockaddr_nl);
2306 return 1;
2307 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002308#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002309
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002310#if defined(AF_QIPCRTR)
2311 case AF_QIPCRTR:
2312 {
2313 *len_ret = sizeof (struct sockaddr_qrtr);
2314 return 1;
2315 }
2316#endif /* AF_QIPCRTR */
2317
caaveryeffc12f2017-09-06 18:18:10 -04002318#if defined(AF_VSOCK)
2319 case AF_VSOCK:
2320 {
2321 *len_ret = sizeof (struct sockaddr_vm);
2322 return 1;
2323 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002324#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002325
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002326#ifdef AF_RDS
2327 case AF_RDS:
2328 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002329#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 case AF_INET:
2332 {
2333 *len_ret = sizeof (struct sockaddr_in);
2334 return 1;
2335 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002336
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002337#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 case AF_INET6:
2339 {
2340 *len_ret = sizeof (struct sockaddr_in6);
2341 return 1;
2342 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002343#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002344
Hye-Shik Chang81268602004-02-02 06:05:24 +00002345#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 case AF_BLUETOOTH:
2347 {
2348 switch(s->sock_proto)
2349 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 case BTPROTO_L2CAP:
2352 *len_ret = sizeof (struct sockaddr_l2);
2353 return 1;
2354 case BTPROTO_RFCOMM:
2355 *len_ret = sizeof (struct sockaddr_rc);
2356 return 1;
2357 case BTPROTO_HCI:
2358 *len_ret = sizeof (struct sockaddr_hci);
2359 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002360#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 case BTPROTO_SCO:
2362 *len_ret = sizeof (struct sockaddr_sco);
2363 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002364#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002366 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 "unknown BT protocol");
2368 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 }
2371 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002372#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002373
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002374#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 case AF_PACKET:
2376 {
2377 *len_ret = sizeof (struct sockaddr_ll);
2378 return 1;
2379 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002380#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002381
Christian Heimes043d6f62008-01-07 17:19:16 +00002382#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 case AF_TIPC:
2384 {
2385 *len_ret = sizeof (struct sockaddr_tipc);
2386 return 1;
2387 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002388#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002389
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002390#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002391 case AF_CAN:
2392 {
2393 *len_ret = sizeof (struct sockaddr_can);
2394 return 1;
2395 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002396#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002397
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002398#ifdef PF_SYSTEM
2399 case PF_SYSTEM:
2400 switch(s->sock_proto) {
2401#ifdef SYSPROTO_CONTROL
2402 case SYSPROTO_CONTROL:
2403 *len_ret = sizeof (struct sockaddr_ctl);
2404 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002405#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002406 default:
2407 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2408 "unknown PF_SYSTEM protocol");
2409 return 0;
2410 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002411#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002412#ifdef HAVE_SOCKADDR_ALG
2413 case AF_ALG:
2414 {
2415 *len_ret = sizeof (struct sockaddr_alg);
2416 return 1;
2417 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002418#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002423 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002427}
2428
2429
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002430/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2431 Currently, these methods are only compiled if the RFC 2292/3542
2432 CMSG_LEN() macro is available. Older systems seem to have used
2433 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2434 it may be possible to define CMSG_LEN() that way if it's not
2435 provided. Some architectures might need extra padding after the
2436 cmsghdr, however, and CMSG_LEN() would have to take account of
2437 this. */
2438#ifdef CMSG_LEN
2439/* If length is in range, set *result to CMSG_LEN(length) and return
2440 true; otherwise, return false. */
2441static int
2442get_CMSG_LEN(size_t length, size_t *result)
2443{
2444 size_t tmp;
2445
2446 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2447 return 0;
2448 tmp = CMSG_LEN(length);
2449 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2450 return 0;
2451 *result = tmp;
2452 return 1;
2453}
2454
2455#ifdef CMSG_SPACE
2456/* If length is in range, set *result to CMSG_SPACE(length) and return
2457 true; otherwise, return false. */
2458static int
2459get_CMSG_SPACE(size_t length, size_t *result)
2460{
2461 size_t tmp;
2462
2463 /* Use CMSG_SPACE(1) here in order to take account of the padding
2464 necessary before *and* after the data. */
2465 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2466 return 0;
2467 tmp = CMSG_SPACE(length);
2468 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2469 return 0;
2470 *result = tmp;
2471 return 1;
2472}
2473#endif
2474
2475/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2476 pointer in msg->msg_control with at least "space" bytes after it,
2477 and its cmsg_len member inside the buffer. */
2478static int
2479cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2480{
2481 size_t cmsg_offset;
2482 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2483 sizeof(cmsgh->cmsg_len));
2484
Charles-François Natali466517d2011-08-28 18:23:43 +02002485 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002486 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002487 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002488 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2489 annoying under OS X as it's unsigned there and so it triggers a
2490 tautological comparison warning under Clang when compared against 0.
2491 Since the check is valid on other platforms, silence the warning under
2492 Clang. */
2493 #ifdef __clang__
2494 #pragma clang diagnostic push
2495 #pragma clang diagnostic ignored "-Wtautological-compare"
2496 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002497 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002498 #pragma GCC diagnostic push
2499 #pragma GCC diagnostic ignored "-Wtype-limits"
2500 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002501 if (msg->msg_controllen < 0)
2502 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002503 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002504 #pragma GCC diagnostic pop
2505 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002506 #ifdef __clang__
2507 #pragma clang diagnostic pop
2508 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002509 if (space < cmsg_len_end)
2510 space = cmsg_len_end;
2511 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2512 return (cmsg_offset <= (size_t)-1 - space &&
2513 cmsg_offset + space <= msg->msg_controllen);
2514}
2515
2516/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2517 *space to number of bytes following it in the buffer and return
2518 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2519 msg->msg_controllen are valid. */
2520static int
2521get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2522{
2523 size_t data_offset;
2524 char *data_ptr;
2525
2526 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2527 return 0;
2528 data_offset = data_ptr - (char *)msg->msg_control;
2529 if (data_offset > msg->msg_controllen)
2530 return 0;
2531 *space = msg->msg_controllen - data_offset;
2532 return 1;
2533}
2534
2535/* If cmsgh is invalid or not contained in the buffer pointed to by
2536 msg->msg_control, return -1. If cmsgh is valid and its associated
2537 data is entirely contained in the buffer, set *data_len to the
2538 length of the associated data and return 0. If only part of the
2539 associated data is contained in the buffer but cmsgh is otherwise
2540 valid, set *data_len to the length contained in the buffer and
2541 return 1. */
2542static int
2543get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2544{
2545 size_t space, cmsg_data_len;
2546
2547 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2548 cmsgh->cmsg_len < CMSG_LEN(0))
2549 return -1;
2550 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2551 if (!get_cmsg_data_space(msg, cmsgh, &space))
2552 return -1;
2553 if (space >= cmsg_data_len) {
2554 *data_len = cmsg_data_len;
2555 return 0;
2556 }
2557 *data_len = space;
2558 return 1;
2559}
2560#endif /* CMSG_LEN */
2561
2562
Victor Stinner31bf2d52015-04-01 21:57:09 +02002563struct sock_accept {
2564 socklen_t *addrlen;
2565 sock_addr_t *addrbuf;
2566 SOCKET_T result;
2567};
2568
2569#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2570/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2571static int accept4_works = -1;
2572#endif
2573
2574static int
2575sock_accept_impl(PySocketSockObject *s, void *data)
2576{
2577 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002578 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2579 socklen_t *paddrlen = ctx->addrlen;
2580#ifdef HAVE_SOCKADDR_ALG
2581 /* AF_ALG does not support accept() with addr and raises
2582 * ECONNABORTED instead. */
2583 if (s->sock_family == AF_ALG) {
2584 addr = NULL;
2585 paddrlen = NULL;
2586 *ctx->addrlen = 0;
2587 }
2588#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002589
2590#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2591 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002592 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002593 SOCK_CLOEXEC);
2594 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2595 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2596 accept4_works = (errno != ENOSYS);
2597 }
2598 }
2599 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002600 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002601#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002602 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002603#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002604
2605#ifdef MS_WINDOWS
2606 return (ctx->result != INVALID_SOCKET);
2607#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002608 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002609#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002610}
2611
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002612/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002613
Guido van Rossum73624e91994-10-10 17:59:00 +00002614static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302615sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002618 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 socklen_t addrlen;
2620 PyObject *sock = NULL;
2621 PyObject *addr = NULL;
2622 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002623 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (!getsockaddrlen(s, &addrlen))
2626 return NULL;
2627 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 if (!IS_SELECTABLE(s))
2630 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002631
Victor Stinner31bf2d52015-04-01 21:57:09 +02002632 ctx.addrlen = &addrlen;
2633 ctx.addrbuf = &addrbuf;
2634 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002636 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002637
Victor Stinnerdaf45552013-08-28 00:53:59 +02002638#ifdef MS_WINDOWS
2639 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2640 PyErr_SetFromWindowsErr(0);
2641 SOCKETCLOSE(newfd);
2642 goto finally;
2643 }
2644#else
2645
2646#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2647 if (!accept4_works)
2648#endif
2649 {
2650 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2651 SOCKETCLOSE(newfd);
2652 goto finally;
2653 }
2654 }
2655#endif
2656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 sock = PyLong_FromSocket_t(newfd);
2658 if (sock == NULL) {
2659 SOCKETCLOSE(newfd);
2660 goto finally;
2661 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2664 addrlen, s->sock_proto);
2665 if (addr == NULL)
2666 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002669
Guido van Rossum67f7a382002-06-06 21:08:16 +00002670finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 Py_XDECREF(sock);
2672 Py_XDECREF(addr);
2673 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002674}
2675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002677"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002678\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002679Wait for an incoming connection. Return a new socket file descriptor\n\
2680representing the connection, and the address of the client.\n\
2681For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002682
Guido van Rossum11ba0942002-06-13 15:07:44 +00002683/* s.setblocking(flag) method. Argument:
2684 False -- non-blocking mode; same as settimeout(0)
2685 True -- blocking mode; same as settimeout(None)
2686*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002687
Guido van Rossum73624e91994-10-10 17:59:00 +00002688static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002689sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002690{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002691 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 block = PyLong_AsLong(arg);
2694 if (block == -1 && PyErr_Occurred())
2695 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002696
Victor Stinner9001d802015-04-06 23:06:01 +02002697 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002698 if (internal_setblocking(s, block) == -1) {
2699 return NULL;
2700 }
2701 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002702}
Guido van Rossume4485b01994-09-07 14:32:49 +00002703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002704PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002705"setblocking(flag)\n\
2706\n\
2707Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002708setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002709setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002710
Yury Selivanovf11b4602018-01-28 17:27:38 -05002711/* s.getblocking() method.
2712 Returns True if socket is in blocking mode,
2713 False if it is in non-blocking mode.
2714*/
2715static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302716sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002717{
2718 if (s->sock_timeout) {
2719 Py_RETURN_TRUE;
2720 }
2721 else {
2722 Py_RETURN_FALSE;
2723 }
2724}
2725
2726PyDoc_STRVAR(getblocking_doc,
2727"getblocking()\n\
2728\n\
2729Returns True if socket is in blocking mode, or False if it\n\
2730is in non-blocking mode.");
2731
Victor Stinner71694d52015-03-28 01:18:54 +01002732static int
2733socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2734{
2735#ifdef MS_WINDOWS
2736 struct timeval tv;
2737#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002738#ifndef HAVE_POLL
2739 _PyTime_t ms;
2740#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002741 int overflow = 0;
2742
2743 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002744 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002745 return 0;
2746 }
2747
Victor Stinner869e1772015-03-30 03:49:14 +02002748 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002749 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002750 return -1;
2751
2752 if (*timeout < 0) {
2753 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2754 return -1;
2755 }
2756
2757#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002758 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002759#endif
2760#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002761 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002762 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002763#endif
2764 if (overflow) {
2765 PyErr_SetString(PyExc_OverflowError,
2766 "timeout doesn't fit into C timeval");
2767 return -1;
2768 }
2769
2770 return 0;
2771}
2772
Guido van Rossum11ba0942002-06-13 15:07:44 +00002773/* s.settimeout(timeout) method. Argument:
2774 None -- no timeout, blocking mode; same as setblocking(True)
2775 0.0 -- non-blocking mode; same as setblocking(False)
2776 > 0 -- timeout mode; operations time out after timeout seconds
2777 < 0 -- illegal; raises an exception
2778*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002779static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002780sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781{
Victor Stinner71694d52015-03-28 01:18:54 +01002782 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002783
Victor Stinner71694d52015-03-28 01:18:54 +01002784 if (socket_parse_timeout(&timeout, arg) < 0)
2785 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002788
2789 int block = timeout < 0;
2790 /* Blocking mode for a Python socket object means that operations
2791 like :meth:`recv` or :meth:`sendall` will block the execution of
2792 the current thread until they are complete or aborted with a
2793 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2794 the underlying FD is in a blocking mode. When timeout is a positive
2795 number, the FD is in a non-blocking mode, and socket ops are
2796 implemented with a `select()` call.
2797
2798 When timeout is 0.0, the FD is in a non-blocking mode.
2799
2800 This table summarizes all states in which the socket object and
2801 its underlying FD can be:
2802
2803 ==================== ===================== ==============
2804 `gettimeout()` `getblocking()` FD
2805 ==================== ===================== ==============
2806 ``None`` ``True`` blocking
2807 ``0.0`` ``False`` non-blocking
2808 ``> 0`` ``True`` non-blocking
2809 */
2810
2811 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002812 return NULL;
2813 }
2814 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002815}
2816
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002817PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002818"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002819\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002820Set a timeout on socket operations. 'timeout' can be a float,\n\
2821giving in seconds, or None. Setting a timeout of None disables\n\
2822the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002823Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002824
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002825/* s.gettimeout() method.
2826 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302828sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002829{
Victor Stinner71694d52015-03-28 01:18:54 +01002830 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002831 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 }
Victor Stinner71694d52015-03-28 01:18:54 +01002833 else {
2834 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2835 return PyFloat_FromDouble(seconds);
2836 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837}
2838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002839PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002840"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002841\n\
oldkaa0735f2018-02-02 16:52:55 +08002842Returns the timeout in seconds (float) associated with socket\n\
2843operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002844operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002845
Guido van Rossumaee08791992-09-08 09:05:33 +00002846/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002847 With an integer third argument, sets an integer optval with optlen=4.
2848 With None as third argument and an integer fourth argument, set
2849 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002850 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002851 use optional built-in module 'struct' to encode the string.
2852*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002853
Guido van Rossum73624e91994-10-10 17:59:00 +00002854static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002855sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 int level;
2858 int optname;
2859 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002860 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002862 unsigned int optlen;
2863 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002864
caaveryeffc12f2017-09-06 18:18:10 -04002865#ifdef AF_VSOCK
2866 if (s->sock_family == AF_VSOCK) {
2867 uint64_t vflag; // Must be set width of 64 bits
2868 /* setsockopt(level, opt, flag) */
2869 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2870 &level, &optname, &vflag)) {
2871 // level should always be set to AF_VSOCK
2872 res = setsockopt(s->sock_fd, level, optname,
2873 (void*)&vflag, sizeof vflag);
2874 goto done;
2875 }
2876 return NULL;
2877 }
2878#endif
2879
Christian Heimesdffa3942016-09-05 23:54:41 +02002880 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 if (PyArg_ParseTuple(args, "iii:setsockopt",
2882 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002883 res = setsockopt(s->sock_fd, level, optname,
2884 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002885 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002887
2888 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002889 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002890 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2891 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2892 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002893 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002894 NULL, (socklen_t)optlen);
2895 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002897
2898 PyErr_Clear();
2899 /* setsockopt(level, opt, buffer) */
2900 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2901 &level, &optname, &optval))
2902 return NULL;
2903
2904#ifdef MS_WINDOWS
2905 if (optval.len > INT_MAX) {
2906 PyBuffer_Release(&optval);
2907 PyErr_Format(PyExc_OverflowError,
2908 "socket option is larger than %i bytes",
2909 INT_MAX);
2910 return NULL;
2911 }
2912 res = setsockopt(s->sock_fd, level, optname,
2913 optval.buf, (int)optval.len);
2914#else
2915 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2916#endif
2917 PyBuffer_Release(&optval);
2918
2919done:
Victor Stinnercc739322016-03-23 21:35:29 +01002920 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002922 }
2923
2924 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002925}
2926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002927PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002928"setsockopt(level, option, value: int)\n\
2929setsockopt(level, option, value: buffer)\n\
2930setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002931\n\
2932Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002933The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002934None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002935
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002936
Guido van Rossumaee08791992-09-08 09:05:33 +00002937/* s.getsockopt() method.
2938 With two arguments, retrieves an integer option.
2939 With a third integer argument, retrieves a string buffer of that size;
2940 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002941
Guido van Rossum73624e91994-10-10 17:59:00 +00002942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002943sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 int level;
2946 int optname;
2947 int res;
2948 PyObject *buf;
2949 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002950 int flag = 0;
2951 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2954 &level, &optname, &buflen))
2955 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002958#ifdef AF_VSOCK
2959 if (s->sock_family == AF_VSOCK) {
2960 uint64_t vflag = 0; // Must be set width of 64 bits
2961 flagsize = sizeof vflag;
2962 res = getsockopt(s->sock_fd, level, optname,
2963 (void *)&vflag, &flagsize);
2964 if (res < 0)
2965 return s->errorhandler();
2966 return PyLong_FromUnsignedLong(vflag);
2967 }
2968#endif
2969 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 res = getsockopt(s->sock_fd, level, optname,
2971 (void *)&flag, &flagsize);
2972 if (res < 0)
2973 return s->errorhandler();
2974 return PyLong_FromLong(flag);
2975 }
caaveryeffc12f2017-09-06 18:18:10 -04002976#ifdef AF_VSOCK
2977 if (s->sock_family == AF_VSOCK) {
2978 PyErr_SetString(PyExc_OSError,
2979 "getsockopt string buffer not allowed");
2980 return NULL;
2981 }
2982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002984 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 "getsockopt buflen out of range");
2986 return NULL;
2987 }
2988 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2989 if (buf == NULL)
2990 return NULL;
2991 res = getsockopt(s->sock_fd, level, optname,
2992 (void *)PyBytes_AS_STRING(buf), &buflen);
2993 if (res < 0) {
2994 Py_DECREF(buf);
2995 return s->errorhandler();
2996 }
2997 _PyBytes_Resize(&buf, buflen);
2998 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002999}
3000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003001PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003002"getsockopt(level, option[, buffersize]) -> value\n\
3003\n\
3004Get a socket option. See the Unix manual for level and option.\n\
3005If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003008
Fred Drake728819a2000-07-01 03:40:12 +00003009/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003010
Guido van Rossum73624e91994-10-10 17:59:00 +00003011static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 sock_addr_t addrbuf;
3015 int addrlen;
3016 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003017
Oren Milman735171e2018-09-11 19:51:29 +03003018 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003020 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 Py_BEGIN_ALLOW_THREADS
3022 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3023 Py_END_ALLOW_THREADS
3024 if (res < 0)
3025 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003026 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003027}
3028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003029PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003030"bind(address)\n\
3031\n\
3032Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003033pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003034sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003035
Guido van Rossum30a685f1991-06-27 15:51:29 +00003036
3037/* s.close() method.
3038 Set the file descriptor to -1 so operations tried subsequently
3039 will surely fail. */
3040
Guido van Rossum73624e91994-10-10 17:59:00 +00003041static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303042sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003045 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003046
Victor Stinner19a8e842016-03-21 16:36:48 +01003047 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003048 if (fd != INVALID_SOCKET) {
3049 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003050
3051 /* We do not want to retry upon EINTR: see
3052 http://lwn.net/Articles/576478/ and
3053 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3054 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003056 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003058 /* bpo-30319: The peer can already have closed the connection.
3059 Python ignores ECONNRESET on close(). */
3060 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003061 return s->errorhandler();
3062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003064 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003065}
3066
Christian Heimesd0e31b92018-01-27 09:54:13 +01003067PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003068"close()\n\
3069\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003070Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003071
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003072static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303073sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003074{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003075 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003076 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003077 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003078}
3079
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003080PyDoc_STRVAR(detach_doc,
3081"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003082\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003083Close the socket object without closing the underlying file descriptor.\n\
3084The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003085can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003086
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003087static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003088sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003089{
Victor Stinner81c41db2015-04-02 11:50:57 +02003090 int err;
3091 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003092
Victor Stinner81c41db2015-04-02 11:50:57 +02003093 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3094 /* getsockopt() failed */
3095 return 0;
3096 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003097
Victor Stinner81c41db2015-04-02 11:50:57 +02003098 if (err == EISCONN)
3099 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003100 if (err != 0) {
3101 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3102 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003103 return 0;
3104 }
3105 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003106}
3107
3108static int
3109internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3110 int raise)
3111{
3112 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003113
3114 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003116 Py_END_ALLOW_THREADS
3117
Victor Stinner70a46f62015-03-31 22:03:59 +02003118 if (!res) {
3119 /* connect() succeeded, the socket is connected */
3120 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003122
Victor Stinner81c41db2015-04-02 11:50:57 +02003123 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003124
Victor Stinner81c41db2015-04-02 11:50:57 +02003125 /* save error, PyErr_CheckSignals() can replace it */
3126 err = GET_SOCK_ERROR;
3127 if (CHECK_ERRNO(EINTR)) {
3128 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003129 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003130
3131 /* Issue #23618: when connect() fails with EINTR, the connection is
3132 running asynchronously.
3133
3134 If the socket is blocking or has a timeout, wait until the
3135 connection completes, fails or timed out using select(), and then
3136 get the connection status using getsockopt(SO_ERROR).
3137
3138 If the socket is non-blocking, raise InterruptedError. The caller is
3139 responsible to wait until the connection completes, fails or timed
3140 out (it's the case in asyncio for example). */
3141 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3142 }
3143 else {
3144 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3145 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003146 }
3147
Victor Stinner81c41db2015-04-02 11:50:57 +02003148 if (!wait_connect) {
3149 if (raise) {
3150 /* restore error, maybe replaced by PyErr_CheckSignals() */
3151 SET_SOCK_ERROR(err);
3152 s->errorhandler();
3153 return -1;
3154 }
3155 else
3156 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003157 }
3158
Victor Stinner81c41db2015-04-02 11:50:57 +02003159 if (raise) {
3160 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003161 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3162 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003163 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003164 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003165 else {
3166 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003167 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3168 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003169 return err;
3170 }
3171 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003172}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003173
Fred Drake728819a2000-07-01 03:40:12 +00003174/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003175
Guido van Rossum73624e91994-10-10 17:59:00 +00003176static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003177sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 sock_addr_t addrbuf;
3180 int addrlen;
3181 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003182
Oren Milman735171e2018-09-11 19:51:29 +03003183 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003185 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003186
Victor Stinner81c41db2015-04-02 11:50:57 +02003187 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003188 if (res < 0)
3189 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003190
Victor Stinneree699e92015-03-31 21:28:42 +02003191 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003192}
3193
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003194PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003195"connect(address)\n\
3196\n\
3197Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003198is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003199
Guido van Rossum30a685f1991-06-27 15:51:29 +00003200
Fred Drake728819a2000-07-01 03:40:12 +00003201/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003202
3203static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003204sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 sock_addr_t addrbuf;
3207 int addrlen;
3208 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003209
Oren Milman735171e2018-09-11 19:51:29 +03003210 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003212 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003213
Victor Stinner81c41db2015-04-02 11:50:57 +02003214 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003215 if (res < 0)
3216 return NULL;
3217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003219}
3220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003221PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003222"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003223\n\
3224This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003225instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003226
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003227
Guido van Rossumed233a51992-06-23 09:07:03 +00003228/* s.fileno() method */
3229
Guido van Rossum73624e91994-10-10 17:59:00 +00003230static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303231sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003234}
3235
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003236PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003237"fileno() -> integer\n\
3238\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003239Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003240
Guido van Rossumed233a51992-06-23 09:07:03 +00003241
Guido van Rossumc89705d1992-11-26 08:54:07 +00003242/* s.getsockname() method */
3243
Guido van Rossum73624e91994-10-10 17:59:00 +00003244static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303245sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 sock_addr_t addrbuf;
3248 int res;
3249 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 if (!getsockaddrlen(s, &addrlen))
3252 return NULL;
3253 memset(&addrbuf, 0, addrlen);
3254 Py_BEGIN_ALLOW_THREADS
3255 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3256 Py_END_ALLOW_THREADS
3257 if (res < 0)
3258 return s->errorhandler();
3259 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3260 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003261}
3262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003263PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003264"getsockname() -> address info\n\
3265\n\
3266Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003267info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003268
Guido van Rossumc89705d1992-11-26 08:54:07 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003271/* s.getpeername() method */
3272
Guido van Rossum73624e91994-10-10 17:59:00 +00003273static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303274sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 sock_addr_t addrbuf;
3277 int res;
3278 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 if (!getsockaddrlen(s, &addrlen))
3281 return NULL;
3282 memset(&addrbuf, 0, addrlen);
3283 Py_BEGIN_ALLOW_THREADS
3284 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3285 Py_END_ALLOW_THREADS
3286 if (res < 0)
3287 return s->errorhandler();
3288 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3289 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003290}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293"getpeername() -> address info\n\
3294\n\
3295Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003296info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003297
Guido van Rossumb6775db1994-08-01 11:34:53 +00003298#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003299
3300
Guido van Rossum30a685f1991-06-27 15:51:29 +00003301/* s.listen(n) method */
3302
Guido van Rossum73624e91994-10-10 17:59:00 +00003303static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003304sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003305{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003306 /* We try to choose a default backlog high enough to avoid connection drops
3307 * for common workloads, yet not too high to limit resource usage. */
3308 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003310
Charles-François Natali644b8f52014-05-22 19:45:39 +01003311 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003315 /* To avoid problems on systems that don't allow a negative backlog
3316 * (which doesn't make sense anyway) we force a minimum value of 0. */
3317 if (backlog < 0)
3318 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 res = listen(s->sock_fd, backlog);
3320 Py_END_ALLOW_THREADS
3321 if (res < 0)
3322 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003323 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003324}
3325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003326PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003327"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003329Enable a server to accept connections. If backlog is specified, it must be\n\
3330at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003331unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003332connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003333
Victor Stinner31bf2d52015-04-01 21:57:09 +02003334struct sock_recv {
3335 char *cbuf;
3336 Py_ssize_t len;
3337 int flags;
3338 Py_ssize_t result;
3339};
3340
3341static int
3342sock_recv_impl(PySocketSockObject *s, void *data)
3343{
3344 struct sock_recv *ctx = data;
3345
3346#ifdef MS_WINDOWS
3347 if (ctx->len > INT_MAX)
3348 ctx->len = INT_MAX;
3349 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3350#else
3351 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3352#endif
3353 return (ctx->result >= 0);
3354}
3355
Guido van Rossum82a5c661998-07-07 20:45:43 +00003356
Thomas Wouters477c8d52006-05-27 19:21:47 +00003357/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003358 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003359 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003360 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003361 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003362 * also possible that we return a number of bytes smaller than the request
3363 * bytes.
3364 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003365
Antoine Pitrou19467d22010-08-17 19:33:30 +00003366static Py_ssize_t
3367sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003368{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003369 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 if (!IS_SELECTABLE(s)) {
3372 select_error();
3373 return -1;
3374 }
3375 if (len == 0) {
3376 /* If 0 bytes were requested, do nothing. */
3377 return 0;
3378 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003379
Victor Stinner31bf2d52015-04-01 21:57:09 +02003380 ctx.cbuf = cbuf;
3381 ctx.len = len;
3382 ctx.flags = flags;
3383 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003385
3386 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003387}
3388
Guido van Rossum48a680c2001-03-02 06:34:14 +00003389
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003390/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003391
Guido van Rossum73624e91994-10-10 17:59:00 +00003392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003393sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003394{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003395 Py_ssize_t recvlen, outlen;
3396 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003398
Antoine Pitrou19467d22010-08-17 19:33:30 +00003399 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 if (recvlen < 0) {
3403 PyErr_SetString(PyExc_ValueError,
3404 "negative buffersize in recv");
3405 return NULL;
3406 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 /* Allocate a new string. */
3409 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3410 if (buf == NULL)
3411 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 /* Call the guts */
3414 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3415 if (outlen < 0) {
3416 /* An error occurred, release the string and return an
3417 error. */
3418 Py_DECREF(buf);
3419 return NULL;
3420 }
3421 if (outlen != recvlen) {
3422 /* We did not read as many bytes as we anticipated, resize the
3423 string if possible and be successful. */
3424 _PyBytes_Resize(&buf, outlen);
3425 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003428}
3429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003430PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003431"recv(buffersize[, flags]) -> data\n\
3432\n\
3433Receive up to buffersize bytes from the socket. For the optional flags\n\
3434argument, see the Unix manual. When no data is available, block until\n\
3435at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003436the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437
Guido van Rossum30a685f1991-06-27 15:51:29 +00003438
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003439/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003440
Thomas Wouters477c8d52006-05-27 19:21:47 +00003441static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003442sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003445
Antoine Pitrou19467d22010-08-17 19:33:30 +00003446 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 Py_buffer pbuf;
3448 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003449 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003452 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 &pbuf, &recvlen, &flags))
3454 return NULL;
3455 buf = pbuf.buf;
3456 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 if (recvlen < 0) {
3459 PyBuffer_Release(&pbuf);
3460 PyErr_SetString(PyExc_ValueError,
3461 "negative buffersize in recv_into");
3462 return NULL;
3463 }
3464 if (recvlen == 0) {
3465 /* If nbytes was not specified, use the buffer's length */
3466 recvlen = buflen;
3467 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 /* Check if the buffer is large enough */
3470 if (buflen < recvlen) {
3471 PyBuffer_Release(&pbuf);
3472 PyErr_SetString(PyExc_ValueError,
3473 "buffer too small for requested bytes");
3474 return NULL;
3475 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 /* Call the guts */
3478 readlen = sock_recv_guts(s, buf, recvlen, flags);
3479 if (readlen < 0) {
3480 /* Return an error. */
3481 PyBuffer_Release(&pbuf);
3482 return NULL;
3483 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 PyBuffer_Release(&pbuf);
3486 /* Return the number of bytes read. Note that we do not do anything
3487 special here in the case that readlen < recvlen. */
3488 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003489}
3490
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003491PyDoc_STRVAR(recv_into_doc,
3492"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003493\n\
oldkaa0735f2018-02-02 16:52:55 +08003494A version of recv() that stores its data into a buffer rather than creating\n\
3495a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003496is not specified (or 0), receive up to the size available in the given buffer.\n\
3497\n\
3498See recv() for documentation about the flags.");
3499
Victor Stinner31bf2d52015-04-01 21:57:09 +02003500struct sock_recvfrom {
3501 char* cbuf;
3502 Py_ssize_t len;
3503 int flags;
3504 socklen_t *addrlen;
3505 sock_addr_t *addrbuf;
3506 Py_ssize_t result;
3507};
3508
3509static int
3510sock_recvfrom_impl(PySocketSockObject *s, void *data)
3511{
3512 struct sock_recvfrom *ctx = data;
3513
3514 memset(ctx->addrbuf, 0, *ctx->addrlen);
3515
3516#ifdef MS_WINDOWS
3517 if (ctx->len > INT_MAX)
3518 ctx->len = INT_MAX;
3519 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3520 SAS2SA(ctx->addrbuf), ctx->addrlen);
3521#else
3522 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3523 SAS2SA(ctx->addrbuf), ctx->addrlen);
3524#endif
3525 return (ctx->result >= 0);
3526}
3527
Thomas Wouters477c8d52006-05-27 19:21:47 +00003528
3529/*
Christian Heimes99170a52007-12-19 02:07:34 +00003530 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3531 * into a char buffer. If you have any inc/def ref to do to the objects that
3532 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003533 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003534 * that it is also possible that we return a number of bytes smaller than the
3535 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003536 *
3537 * 'addr' is a return value for the address object. Note that you must decref
3538 * it yourself.
3539 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003540static Py_ssize_t
3541sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003546 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 if (!getsockaddrlen(s, &addrlen))
3551 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 if (!IS_SELECTABLE(s)) {
3554 select_error();
3555 return -1;
3556 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003557
Victor Stinner31bf2d52015-04-01 21:57:09 +02003558 ctx.cbuf = cbuf;
3559 ctx.len = len;
3560 ctx.flags = flags;
3561 ctx.addrbuf = &addrbuf;
3562 ctx.addrlen = &addrlen;
3563 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003565
Victor Stinner31bf2d52015-04-01 21:57:09 +02003566 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3567 s->sock_proto);
3568 if (*addr == NULL)
3569 return -1;
3570
3571 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003572}
3573
3574/* s.recvfrom(nbytes [,flags]) method */
3575
3576static PyObject *
3577sock_recvfrom(PySocketSockObject *s, PyObject *args)
3578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 PyObject *buf = NULL;
3580 PyObject *addr = NULL;
3581 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003582 int flags = 0;
3583 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003584
Antoine Pitrou19467d22010-08-17 19:33:30 +00003585 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 if (recvlen < 0) {
3589 PyErr_SetString(PyExc_ValueError,
3590 "negative buffersize in recvfrom");
3591 return NULL;
3592 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3595 if (buf == NULL)
3596 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3599 recvlen, flags, &addr);
3600 if (outlen < 0) {
3601 goto finally;
3602 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 if (outlen != recvlen) {
3605 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003606 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003608 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 goto finally;
3610 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003612 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003613
3614finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003615 Py_XDECREF(buf);
3616 Py_XDECREF(addr);
3617 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003618}
3619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003620PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003621"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3622\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003623Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003624
Thomas Wouters477c8d52006-05-27 19:21:47 +00003625
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003626/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003627
3628static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003629sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003632
Antoine Pitrou19467d22010-08-17 19:33:30 +00003633 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 Py_buffer pbuf;
3635 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003636 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003639
Antoine Pitrou19467d22010-08-17 19:33:30 +00003640 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003641 kwlist, &pbuf,
3642 &recvlen, &flags))
3643 return NULL;
3644 buf = pbuf.buf;
3645 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 if (recvlen < 0) {
3648 PyBuffer_Release(&pbuf);
3649 PyErr_SetString(PyExc_ValueError,
3650 "negative buffersize in recvfrom_into");
3651 return NULL;
3652 }
3653 if (recvlen == 0) {
3654 /* If nbytes was not specified, use the buffer's length */
3655 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003656 } else if (recvlen > buflen) {
3657 PyBuffer_Release(&pbuf);
3658 PyErr_SetString(PyExc_ValueError,
3659 "nbytes is greater than the length of the buffer");
3660 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3664 if (readlen < 0) {
3665 PyBuffer_Release(&pbuf);
3666 /* Return an error */
3667 Py_XDECREF(addr);
3668 return NULL;
3669 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003671 PyBuffer_Release(&pbuf);
3672 /* Return the number of bytes read and the address. Note that we do
3673 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003674 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003675}
3676
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003677PyDoc_STRVAR(recvfrom_into_doc,
3678"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003679\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003680Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003681
Victor Stinner35bee932015-04-02 12:28:07 +02003682/* The sendmsg() and recvmsg[_into]() methods require a working
3683 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3684#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003685struct sock_recvmsg {
3686 struct msghdr *msg;
3687 int flags;
3688 ssize_t result;
3689};
3690
3691static int
3692sock_recvmsg_impl(PySocketSockObject *s, void *data)
3693{
3694 struct sock_recvmsg *ctx = data;
3695
3696 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3697 return (ctx->result >= 0);
3698}
3699
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700/*
3701 * Call recvmsg() with the supplied iovec structures, flags, and
3702 * ancillary data buffer size (controllen). Returns the tuple return
3703 * value for recvmsg() or recvmsg_into(), with the first item provided
3704 * by the supplied makeval() function. makeval() will be called with
3705 * the length read and makeval_data as arguments, and must return a
3706 * new reference (which will be decrefed if there is a subsequent
3707 * error). On error, closes any file descriptors received via
3708 * SCM_RIGHTS.
3709 */
3710static PyObject *
3711sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3712 int flags, Py_ssize_t controllen,
3713 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3714{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003715 sock_addr_t addrbuf;
3716 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003717 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003718 PyObject *cmsg_list = NULL, *retval = NULL;
3719 void *controlbuf = NULL;
3720 struct cmsghdr *cmsgh;
3721 size_t cmsgdatalen = 0;
3722 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003723 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003724
3725 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3726 ignored" when the socket is connected (Linux fills them in
3727 anyway for AF_UNIX sockets at least). Normally msg_namelen
3728 seems to be set to 0 if there's no address, but try to
3729 initialize msg_name to something that won't be mistaken for a
3730 real address if that doesn't happen. */
3731 if (!getsockaddrlen(s, &addrbuflen))
3732 return NULL;
3733 memset(&addrbuf, 0, addrbuflen);
3734 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3735
3736 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3737 PyErr_SetString(PyExc_ValueError,
3738 "invalid ancillary data buffer length");
3739 return NULL;
3740 }
3741 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3742 return PyErr_NoMemory();
3743
3744 /* Make the system call. */
3745 if (!IS_SELECTABLE(s)) {
3746 select_error();
3747 goto finally;
3748 }
3749
Victor Stinner31bf2d52015-04-01 21:57:09 +02003750 msg.msg_name = SAS2SA(&addrbuf);
3751 msg.msg_namelen = addrbuflen;
3752 msg.msg_iov = iov;
3753 msg.msg_iovlen = iovlen;
3754 msg.msg_control = controlbuf;
3755 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003756
Victor Stinner31bf2d52015-04-01 21:57:09 +02003757 ctx.msg = &msg;
3758 ctx.flags = flags;
3759 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003760 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003761
3762 /* Make list of (level, type, data) tuples from control messages. */
3763 if ((cmsg_list = PyList_New(0)) == NULL)
3764 goto err_closefds;
3765 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3766 implementations didn't do so. */
3767 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3768 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3769 PyObject *bytes, *tuple;
3770 int tmp;
3771
3772 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3773 if (cmsg_status != 0) {
3774 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3775 "received malformed or improperly-truncated "
3776 "ancillary data", 1) == -1)
3777 goto err_closefds;
3778 }
3779 if (cmsg_status < 0)
3780 break;
3781 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003782 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003783 goto err_closefds;
3784 }
3785
3786 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3787 cmsgdatalen);
3788 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3789 (int)cmsgh->cmsg_type, bytes);
3790 if (tuple == NULL)
3791 goto err_closefds;
3792 tmp = PyList_Append(cmsg_list, tuple);
3793 Py_DECREF(tuple);
3794 if (tmp != 0)
3795 goto err_closefds;
3796
3797 if (cmsg_status != 0)
3798 break;
3799 }
3800
3801 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003802 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803 cmsg_list,
3804 (int)msg.msg_flags,
3805 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3806 ((msg.msg_namelen > addrbuflen) ?
3807 addrbuflen : msg.msg_namelen),
3808 s->sock_proto));
3809 if (retval == NULL)
3810 goto err_closefds;
3811
3812finally:
3813 Py_XDECREF(cmsg_list);
3814 PyMem_Free(controlbuf);
3815 return retval;
3816
3817err_closefds:
3818#ifdef SCM_RIGHTS
3819 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3820 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3821 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3822 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3823 if (cmsg_status < 0)
3824 break;
3825 if (cmsgh->cmsg_level == SOL_SOCKET &&
3826 cmsgh->cmsg_type == SCM_RIGHTS) {
3827 size_t numfds;
3828 int *fdp;
3829
3830 numfds = cmsgdatalen / sizeof(int);
3831 fdp = (int *)CMSG_DATA(cmsgh);
3832 while (numfds-- > 0)
3833 close(*fdp++);
3834 }
3835 if (cmsg_status != 0)
3836 break;
3837 }
3838#endif /* SCM_RIGHTS */
3839 goto finally;
3840}
3841
3842
3843static PyObject *
3844makeval_recvmsg(ssize_t received, void *data)
3845{
3846 PyObject **buf = data;
3847
3848 if (received < PyBytes_GET_SIZE(*buf))
3849 _PyBytes_Resize(buf, received);
3850 Py_XINCREF(*buf);
3851 return *buf;
3852}
3853
3854/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3855
3856static PyObject *
3857sock_recvmsg(PySocketSockObject *s, PyObject *args)
3858{
3859 Py_ssize_t bufsize, ancbufsize = 0;
3860 int flags = 0;
3861 struct iovec iov;
3862 PyObject *buf = NULL, *retval = NULL;
3863
3864 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3865 return NULL;
3866
3867 if (bufsize < 0) {
3868 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3869 return NULL;
3870 }
3871 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3872 return NULL;
3873 iov.iov_base = PyBytes_AS_STRING(buf);
3874 iov.iov_len = bufsize;
3875
3876 /* Note that we're passing a pointer to *our pointer* to the bytes
3877 object here (&buf); makeval_recvmsg() may incref the object, or
3878 deallocate it and set our pointer to NULL. */
3879 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3880 &makeval_recvmsg, &buf);
3881 Py_XDECREF(buf);
3882 return retval;
3883}
3884
3885PyDoc_STRVAR(recvmsg_doc,
3886"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3887\n\
3888Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3889socket. The ancbufsize argument sets the size in bytes of the\n\
3890internal buffer used to receive the ancillary data; it defaults to 0,\n\
3891meaning that no ancillary data will be received. Appropriate buffer\n\
3892sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3893CMSG_LEN(), and items which do not fit into the buffer might be\n\
3894truncated or discarded. The flags argument defaults to 0 and has the\n\
3895same meaning as for recv().\n\
3896\n\
3897The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3898The data item is a bytes object holding the non-ancillary data\n\
3899received. The ancdata item is a list of zero or more tuples\n\
3900(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3901(control messages) received: cmsg_level and cmsg_type are integers\n\
3902specifying the protocol level and protocol-specific type respectively,\n\
3903and cmsg_data is a bytes object holding the associated data. The\n\
3904msg_flags item is the bitwise OR of various flags indicating\n\
3905conditions on the received message; see your system documentation for\n\
3906details. If the receiving socket is unconnected, address is the\n\
3907address of the sending socket, if available; otherwise, its value is\n\
3908unspecified.\n\
3909\n\
3910If recvmsg() raises an exception after the system call returns, it\n\
3911will first attempt to close any file descriptors received via the\n\
3912SCM_RIGHTS mechanism.");
3913
3914
3915static PyObject *
3916makeval_recvmsg_into(ssize_t received, void *data)
3917{
3918 return PyLong_FromSsize_t(received);
3919}
3920
3921/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3922
3923static PyObject *
3924sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3925{
3926 Py_ssize_t ancbufsize = 0;
3927 int flags = 0;
3928 struct iovec *iovs = NULL;
3929 Py_ssize_t i, nitems, nbufs = 0;
3930 Py_buffer *bufs = NULL;
3931 PyObject *buffers_arg, *fast, *retval = NULL;
3932
3933 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3934 &buffers_arg, &ancbufsize, &flags))
3935 return NULL;
3936
3937 if ((fast = PySequence_Fast(buffers_arg,
3938 "recvmsg_into() argument 1 must be an "
3939 "iterable")) == NULL)
3940 return NULL;
3941 nitems = PySequence_Fast_GET_SIZE(fast);
3942 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003943 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944 goto finally;
3945 }
3946
3947 /* Fill in an iovec for each item, and save the Py_buffer
3948 structs to release afterwards. */
3949 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3950 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3951 PyErr_NoMemory();
3952 goto finally;
3953 }
3954 for (; nbufs < nitems; nbufs++) {
3955 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3956 "w*;recvmsg_into() argument 1 must be an iterable "
3957 "of single-segment read-write buffers",
3958 &bufs[nbufs]))
3959 goto finally;
3960 iovs[nbufs].iov_base = bufs[nbufs].buf;
3961 iovs[nbufs].iov_len = bufs[nbufs].len;
3962 }
3963
3964 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3965 &makeval_recvmsg_into, NULL);
3966finally:
3967 for (i = 0; i < nbufs; i++)
3968 PyBuffer_Release(&bufs[i]);
3969 PyMem_Free(bufs);
3970 PyMem_Free(iovs);
3971 Py_DECREF(fast);
3972 return retval;
3973}
3974
3975PyDoc_STRVAR(recvmsg_into_doc,
3976"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3977\n\
3978Receive normal data and ancillary data from the socket, scattering the\n\
3979non-ancillary data into a series of buffers. The buffers argument\n\
3980must be an iterable of objects that export writable buffers\n\
3981(e.g. bytearray objects); these will be filled with successive chunks\n\
3982of the non-ancillary data until it has all been written or there are\n\
3983no more buffers. The ancbufsize argument sets the size in bytes of\n\
3984the internal buffer used to receive the ancillary data; it defaults to\n\
39850, meaning that no ancillary data will be received. Appropriate\n\
3986buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3987or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3988truncated or discarded. The flags argument defaults to 0 and has the\n\
3989same meaning as for recv().\n\
3990\n\
3991The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3992The nbytes item is the total number of bytes of non-ancillary data\n\
3993written into the buffers. The ancdata item is a list of zero or more\n\
3994tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3995data (control messages) received: cmsg_level and cmsg_type are\n\
3996integers specifying the protocol level and protocol-specific type\n\
3997respectively, and cmsg_data is a bytes object holding the associated\n\
3998data. The msg_flags item is the bitwise OR of various flags\n\
3999indicating conditions on the received message; see your system\n\
4000documentation for details. If the receiving socket is unconnected,\n\
4001address is the address of the sending socket, if available; otherwise,\n\
4002its value is unspecified.\n\
4003\n\
4004If recvmsg_into() raises an exception after the system call returns,\n\
4005it will first attempt to close any file descriptors received via the\n\
4006SCM_RIGHTS mechanism.");
4007#endif /* CMSG_LEN */
4008
4009
Victor Stinner31bf2d52015-04-01 21:57:09 +02004010struct sock_send {
4011 char *buf;
4012 Py_ssize_t len;
4013 int flags;
4014 Py_ssize_t result;
4015};
4016
4017static int
4018sock_send_impl(PySocketSockObject *s, void *data)
4019{
4020 struct sock_send *ctx = data;
4021
4022#ifdef MS_WINDOWS
4023 if (ctx->len > INT_MAX)
4024 ctx->len = INT_MAX;
4025 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4026#else
4027 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4028#endif
4029 return (ctx->result >= 0);
4030}
4031
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004032/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004033
Guido van Rossum73624e91994-10-10 17:59:00 +00004034static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004035sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004036{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004037 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004039 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4042 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 if (!IS_SELECTABLE(s)) {
4045 PyBuffer_Release(&pbuf);
4046 return select_error();
4047 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004048 ctx.buf = pbuf.buf;
4049 ctx.len = pbuf.len;
4050 ctx.flags = flags;
4051 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004052 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 return NULL;
4054 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004055 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004056
4057 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004058}
4059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004060PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004061"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004062\n\
4063Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004064argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004065sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004066
4067
4068/* s.sendall(data [,flags]) method */
4069
4070static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004071sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004074 Py_ssize_t len, n;
4075 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004077 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004078 int has_timeout = (s->sock_timeout > 0);
4079 _PyTime_t interval = s->sock_timeout;
4080 _PyTime_t deadline = 0;
4081 int deadline_initialized = 0;
4082 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4085 return NULL;
4086 buf = pbuf.buf;
4087 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 if (!IS_SELECTABLE(s)) {
4090 PyBuffer_Release(&pbuf);
4091 return select_error();
4092 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004095 if (has_timeout) {
4096 if (deadline_initialized) {
4097 /* recompute the timeout */
4098 interval = deadline - _PyTime_GetMonotonicClock();
4099 }
4100 else {
4101 deadline_initialized = 1;
4102 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4103 }
4104
4105 if (interval <= 0) {
4106 PyErr_SetString(socket_timeout, "timed out");
4107 goto done;
4108 }
4109 }
4110
Victor Stinner02f32ab2015-04-01 22:53:26 +02004111 ctx.buf = buf;
4112 ctx.len = len;
4113 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004114 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4115 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004116 n = ctx.result;
4117 assert(n >= 0);
4118
4119 buf += n;
4120 len -= n;
4121
4122 /* We must run our signal handlers before looping again.
4123 send() can return a successful partial write when it is
4124 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004125 if (PyErr_CheckSignals())
4126 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004127 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004129
Victor Stinner8912d142015-04-06 23:16:34 +02004130 Py_INCREF(Py_None);
4131 res = Py_None;
4132
4133done:
4134 PyBuffer_Release(&pbuf);
4135 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004136}
4137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004138PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004139"sendall(data[, flags])\n\
4140\n\
4141Send a data string to the socket. For the optional flags\n\
4142argument, see the Unix manual. This calls send() repeatedly\n\
4143until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004144to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004145
Guido van Rossum30a685f1991-06-27 15:51:29 +00004146
Victor Stinner31bf2d52015-04-01 21:57:09 +02004147struct sock_sendto {
4148 char *buf;
4149 Py_ssize_t len;
4150 int flags;
4151 int addrlen;
4152 sock_addr_t *addrbuf;
4153 Py_ssize_t result;
4154};
4155
4156static int
4157sock_sendto_impl(PySocketSockObject *s, void *data)
4158{
4159 struct sock_sendto *ctx = data;
4160
4161#ifdef MS_WINDOWS
4162 if (ctx->len > INT_MAX)
4163 ctx->len = INT_MAX;
4164 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4165 SAS2SA(ctx->addrbuf), ctx->addrlen);
4166#else
4167 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4168 SAS2SA(ctx->addrbuf), ctx->addrlen);
4169#endif
4170 return (ctx->result >= 0);
4171}
4172
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004173/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004174
Guido van Rossum73624e91994-10-10 17:59:00 +00004175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004176sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 Py_buffer pbuf;
4179 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004180 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004182 int addrlen, flags;
4183 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004186 arglen = PyTuple_Size(args);
4187 switch (arglen) {
4188 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004189 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4190 return NULL;
4191 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004192 break;
4193 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004194 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4195 &pbuf, &flags, &addro)) {
4196 return NULL;
4197 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004198 break;
4199 default:
4200 PyErr_Format(PyExc_TypeError,
4201 "sendto() takes 2 or 3 arguments (%d given)",
4202 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004203 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 if (!IS_SELECTABLE(s)) {
4207 PyBuffer_Release(&pbuf);
4208 return select_error();
4209 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004210
Oren Milman735171e2018-09-11 19:51:29 +03004211 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 PyBuffer_Release(&pbuf);
4213 return NULL;
4214 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004215
Victor Stinner31bf2d52015-04-01 21:57:09 +02004216 ctx.buf = pbuf.buf;
4217 ctx.len = pbuf.len;
4218 ctx.flags = flags;
4219 ctx.addrlen = addrlen;
4220 ctx.addrbuf = &addrbuf;
4221 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004222 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 return NULL;
4224 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004225 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004226
4227 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004228}
4229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004230PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004231"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004232\n\
4233Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004234For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004235
Guido van Rossum30a685f1991-06-27 15:51:29 +00004236
Victor Stinner35bee932015-04-02 12:28:07 +02004237/* The sendmsg() and recvmsg[_into]() methods require a working
4238 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4239#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004240struct sock_sendmsg {
4241 struct msghdr *msg;
4242 int flags;
4243 ssize_t result;
4244};
4245
4246static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004247sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4248 struct msghdr *msg,
4249 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4250 Py_ssize_t ndataparts, ndatabufs = 0;
4251 int result = -1;
4252 struct iovec *iovs = NULL;
4253 PyObject *data_fast = NULL;
4254 Py_buffer *databufs = NULL;
4255
4256 /* Fill in an iovec for each message part, and save the Py_buffer
4257 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004258 data_fast = PySequence_Fast(data_arg,
4259 "sendmsg() argument 1 must be an "
4260 "iterable");
4261 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004262 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004263 }
4264
Christian Heimesdffa3942016-09-05 23:54:41 +02004265 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4266 if (ndataparts > INT_MAX) {
4267 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4268 goto finally;
4269 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004270
Christian Heimesdffa3942016-09-05 23:54:41 +02004271 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004272 if (ndataparts > 0) {
4273 iovs = PyMem_New(struct iovec, ndataparts);
4274 if (iovs == NULL) {
4275 PyErr_NoMemory();
4276 goto finally;
4277 }
4278 msg->msg_iov = iovs;
4279
4280 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004281 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004282 PyErr_NoMemory();
4283 goto finally;
4284 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004285 }
4286 for (; ndatabufs < ndataparts; ndatabufs++) {
4287 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4288 "y*;sendmsg() argument 1 must be an iterable of "
4289 "bytes-like objects",
4290 &databufs[ndatabufs]))
4291 goto finally;
4292 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4293 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4294 }
4295 result = 0;
4296 finally:
4297 *databufsout = databufs;
4298 *ndatabufsout = ndatabufs;
4299 Py_XDECREF(data_fast);
4300 return result;
4301}
4302
4303static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004304sock_sendmsg_impl(PySocketSockObject *s, void *data)
4305{
4306 struct sock_sendmsg *ctx = data;
4307
4308 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4309 return (ctx->result >= 0);
4310}
4311
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004312/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4313
4314static PyObject *
4315sock_sendmsg(PySocketSockObject *s, PyObject *args)
4316{
Christian Heimesdffa3942016-09-05 23:54:41 +02004317 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004318 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004319 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004320 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321 struct cmsginfo {
4322 int level;
4323 int type;
4324 Py_buffer data;
4325 } *cmsgs = NULL;
4326 void *controlbuf = NULL;
4327 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004328 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004329 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004330 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004331 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004332
4333 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004334 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004335 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004336 }
4337
4338 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004339
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004340 /* Parse destination address. */
4341 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004342 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4343 "sendmsg"))
4344 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004345 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004346 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347 msg.msg_name = &addrbuf;
4348 msg.msg_namelen = addrlen;
4349 }
4350
4351 /* Fill in an iovec for each message part, and save the Py_buffer
4352 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004353 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004354 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004355 }
4356
4357 if (cmsg_arg == NULL)
4358 ncmsgs = 0;
4359 else {
4360 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4361 "sendmsg() argument 2 must be an "
4362 "iterable")) == NULL)
4363 goto finally;
4364 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4365 }
4366
4367#ifndef CMSG_SPACE
4368 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004369 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004370 "sending multiple control messages is not supported "
4371 "on this system");
4372 goto finally;
4373 }
4374#endif
4375 /* Save level, type and Py_buffer for each control message,
4376 and calculate total size. */
4377 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4378 PyErr_NoMemory();
4379 goto finally;
4380 }
4381 controllen = controllen_last = 0;
4382 while (ncmsgbufs < ncmsgs) {
4383 size_t bufsize, space;
4384
4385 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4386 "(iiy*):[sendmsg() ancillary data items]",
4387 &cmsgs[ncmsgbufs].level,
4388 &cmsgs[ncmsgbufs].type,
4389 &cmsgs[ncmsgbufs].data))
4390 goto finally;
4391 bufsize = cmsgs[ncmsgbufs++].data.len;
4392
4393#ifdef CMSG_SPACE
4394 if (!get_CMSG_SPACE(bufsize, &space)) {
4395#else
4396 if (!get_CMSG_LEN(bufsize, &space)) {
4397#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004398 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004399 goto finally;
4400 }
4401 controllen += space;
4402 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004403 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004404 goto finally;
4405 }
4406 controllen_last = controllen;
4407 }
4408
4409 /* Construct ancillary data block from control message info. */
4410 if (ncmsgbufs > 0) {
4411 struct cmsghdr *cmsgh = NULL;
4412
Victor Stinner52d61e42016-09-12 11:41:58 +02004413 controlbuf = PyMem_Malloc(controllen);
4414 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004415 PyErr_NoMemory();
4416 goto finally;
4417 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004418 msg.msg_control = controlbuf;
4419
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004420 msg.msg_controllen = controllen;
4421
4422 /* Need to zero out the buffer as a workaround for glibc's
4423 CMSG_NXTHDR() implementation. After getting the pointer to
4424 the next header, it checks its (uninitialized) cmsg_len
4425 member to see if the "message" fits in the buffer, and
4426 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004427 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004428 memset(controlbuf, 0, controllen);
4429
4430 for (i = 0; i < ncmsgbufs; i++) {
4431 size_t msg_len, data_len = cmsgs[i].data.len;
4432 int enough_space = 0;
4433
4434 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4435 if (cmsgh == NULL) {
4436 PyErr_Format(PyExc_RuntimeError,
4437 "unexpected NULL result from %s()",
4438 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4439 goto finally;
4440 }
4441 if (!get_CMSG_LEN(data_len, &msg_len)) {
4442 PyErr_SetString(PyExc_RuntimeError,
4443 "item size out of range for CMSG_LEN()");
4444 goto finally;
4445 }
4446 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4447 size_t space;
4448
4449 cmsgh->cmsg_len = msg_len;
4450 if (get_cmsg_data_space(&msg, cmsgh, &space))
4451 enough_space = (space >= data_len);
4452 }
4453 if (!enough_space) {
4454 PyErr_SetString(PyExc_RuntimeError,
4455 "ancillary data does not fit in calculated "
4456 "space");
4457 goto finally;
4458 }
4459 cmsgh->cmsg_level = cmsgs[i].level;
4460 cmsgh->cmsg_type = cmsgs[i].type;
4461 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4462 }
4463 }
4464
4465 /* Make the system call. */
4466 if (!IS_SELECTABLE(s)) {
4467 select_error();
4468 goto finally;
4469 }
4470
Victor Stinner31bf2d52015-04-01 21:57:09 +02004471 ctx.msg = &msg;
4472 ctx.flags = flags;
4473 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004474 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004475
4476 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004477
4478finally:
4479 PyMem_Free(controlbuf);
4480 for (i = 0; i < ncmsgbufs; i++)
4481 PyBuffer_Release(&cmsgs[i].data);
4482 PyMem_Free(cmsgs);
4483 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004484 PyMem_Free(msg.msg_iov);
4485 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004486 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004487 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004488 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004489 return retval;
4490}
4491
4492PyDoc_STRVAR(sendmsg_doc,
4493"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4494\n\
4495Send normal and ancillary data to the socket, gathering the\n\
4496non-ancillary data from a series of buffers and concatenating it into\n\
4497a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004498data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004499The ancdata argument specifies the ancillary data (control messages)\n\
4500as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4501cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4502protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004503is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004504argument defaults to 0 and has the same meaning as for send(). If\n\
4505address is supplied and not None, it sets a destination address for\n\
4506the message. The return value is the number of bytes of non-ancillary\n\
4507data sent.");
4508#endif /* CMSG_LEN */
4509
Christian Heimesdffa3942016-09-05 23:54:41 +02004510#ifdef HAVE_SOCKADDR_ALG
4511static PyObject*
4512sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4513{
4514 PyObject *retval = NULL;
4515
4516 Py_ssize_t i, ndatabufs = 0;
4517 Py_buffer *databufs = NULL;
4518 PyObject *data_arg = NULL;
4519
4520 Py_buffer iv = {NULL, NULL};
4521
4522 PyObject *opobj = NULL;
4523 int op = -1;
4524
4525 PyObject *assoclenobj = NULL;
4526 int assoclen = -1;
4527
4528 unsigned int *uiptr;
4529 int flags = 0;
4530
4531 struct msghdr msg;
4532 struct cmsghdr *header = NULL;
4533 struct af_alg_iv *alg_iv = NULL;
4534 struct sock_sendmsg ctx;
4535 Py_ssize_t controllen;
4536 void *controlbuf = NULL;
4537 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4538
4539 if (self->sock_family != AF_ALG) {
4540 PyErr_SetString(PyExc_OSError,
4541 "algset is only supported for AF_ALG");
4542 return NULL;
4543 }
4544
4545 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4546 "|O$O!y*O!i:sendmsg_afalg", keywords,
4547 &data_arg,
4548 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004549 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004550 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004551 }
4552
4553 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004554
4555 /* op is a required, keyword-only argument >= 0 */
4556 if (opobj != NULL) {
4557 op = _PyLong_AsInt(opobj);
4558 }
4559 if (op < 0) {
4560 /* override exception from _PyLong_AsInt() */
4561 PyErr_SetString(PyExc_TypeError,
4562 "Invalid or missing argument 'op'");
4563 goto finally;
4564 }
4565 /* assoclen is optional but must be >= 0 */
4566 if (assoclenobj != NULL) {
4567 assoclen = _PyLong_AsInt(assoclenobj);
4568 if (assoclen == -1 && PyErr_Occurred()) {
4569 goto finally;
4570 }
4571 if (assoclen < 0) {
4572 PyErr_SetString(PyExc_TypeError,
4573 "assoclen must be positive");
4574 goto finally;
4575 }
4576 }
4577
4578 controllen = CMSG_SPACE(4);
4579 if (iv.buf != NULL) {
4580 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4581 }
4582 if (assoclen >= 0) {
4583 controllen += CMSG_SPACE(4);
4584 }
4585
4586 controlbuf = PyMem_Malloc(controllen);
4587 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004588 PyErr_NoMemory();
4589 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004590 }
4591 memset(controlbuf, 0, controllen);
4592
Christian Heimesdffa3942016-09-05 23:54:41 +02004593 msg.msg_controllen = controllen;
4594 msg.msg_control = controlbuf;
4595
4596 /* Fill in an iovec for each message part, and save the Py_buffer
4597 structs to release afterwards. */
4598 if (data_arg != NULL) {
4599 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4600 goto finally;
4601 }
4602 }
4603
4604 /* set operation to encrypt or decrypt */
4605 header = CMSG_FIRSTHDR(&msg);
4606 if (header == NULL) {
4607 PyErr_SetString(PyExc_RuntimeError,
4608 "unexpected NULL result from CMSG_FIRSTHDR");
4609 goto finally;
4610 }
4611 header->cmsg_level = SOL_ALG;
4612 header->cmsg_type = ALG_SET_OP;
4613 header->cmsg_len = CMSG_LEN(4);
4614 uiptr = (void*)CMSG_DATA(header);
4615 *uiptr = (unsigned int)op;
4616
4617 /* set initialization vector */
4618 if (iv.buf != NULL) {
4619 header = CMSG_NXTHDR(&msg, header);
4620 if (header == NULL) {
4621 PyErr_SetString(PyExc_RuntimeError,
4622 "unexpected NULL result from CMSG_NXTHDR(iv)");
4623 goto finally;
4624 }
4625 header->cmsg_level = SOL_ALG;
4626 header->cmsg_type = ALG_SET_IV;
4627 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4628 alg_iv = (void*)CMSG_DATA(header);
4629 alg_iv->ivlen = iv.len;
4630 memcpy(alg_iv->iv, iv.buf, iv.len);
4631 }
4632
4633 /* set length of associated data for AEAD */
4634 if (assoclen >= 0) {
4635 header = CMSG_NXTHDR(&msg, header);
4636 if (header == NULL) {
4637 PyErr_SetString(PyExc_RuntimeError,
4638 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4639 goto finally;
4640 }
4641 header->cmsg_level = SOL_ALG;
4642 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4643 header->cmsg_len = CMSG_LEN(4);
4644 uiptr = (void*)CMSG_DATA(header);
4645 *uiptr = (unsigned int)assoclen;
4646 }
4647
4648 ctx.msg = &msg;
4649 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004650 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004651 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004652 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004653
4654 retval = PyLong_FromSsize_t(ctx.result);
4655
4656 finally:
4657 PyMem_Free(controlbuf);
4658 if (iv.buf != NULL) {
4659 PyBuffer_Release(&iv);
4660 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004661 PyMem_Free(msg.msg_iov);
4662 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004663 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004664 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004665 PyMem_Free(databufs);
4666 return retval;
4667}
4668
4669PyDoc_STRVAR(sendmsg_afalg_doc,
4670"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4671\n\
4672Set operation mode, IV and length of associated data for an AF_ALG\n\
4673operation socket.");
4674#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004675
Guido van Rossum30a685f1991-06-27 15:51:29 +00004676/* s.shutdown(how) method */
4677
Guido van Rossum73624e91994-10-10 17:59:00 +00004678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004679sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 int how;
4682 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004683
Serhiy Storchaka78980432013-01-15 01:12:17 +02004684 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 if (how == -1 && PyErr_Occurred())
4686 return NULL;
4687 Py_BEGIN_ALLOW_THREADS
4688 res = shutdown(s->sock_fd, how);
4689 Py_END_ALLOW_THREADS
4690 if (res < 0)
4691 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004692 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004693}
4694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004695PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004696"shutdown(flag)\n\
4697\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004698Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4699of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004700
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004701#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004702static PyObject*
4703sock_ioctl(PySocketSockObject *s, PyObject *arg)
4704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 unsigned long cmd = SIO_RCVALL;
4706 PyObject *argO;
4707 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4710 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 switch (cmd) {
4713 case SIO_RCVALL: {
4714 unsigned int option = RCVALL_ON;
4715 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4716 return NULL;
4717 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4718 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4719 return set_error();
4720 }
4721 return PyLong_FromUnsignedLong(recv); }
4722 case SIO_KEEPALIVE_VALS: {
4723 struct tcp_keepalive ka;
4724 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4725 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4726 return NULL;
4727 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4728 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4729 return set_error();
4730 }
4731 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004732#if defined(SIO_LOOPBACK_FAST_PATH)
4733 case SIO_LOOPBACK_FAST_PATH: {
4734 unsigned int option;
4735 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4736 return NULL;
4737 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4738 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4739 return set_error();
4740 }
4741 return PyLong_FromUnsignedLong(recv); }
4742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 default:
4744 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4745 return NULL;
4746 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004747}
4748PyDoc_STRVAR(sock_ioctl_doc,
4749"ioctl(cmd, option) -> long\n\
4750\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004751Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4752SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004753SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4754SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004755#endif
4756
4757#if defined(MS_WINDOWS)
4758static PyObject*
4759sock_share(PySocketSockObject *s, PyObject *arg)
4760{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004761 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004762 DWORD processId;
4763 int result;
4764
4765 if (!PyArg_ParseTuple(arg, "I", &processId))
4766 return NULL;
4767
4768 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004769 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004770 Py_END_ALLOW_THREADS
4771 if (result == SOCKET_ERROR)
4772 return set_error();
4773 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4774}
4775PyDoc_STRVAR(sock_share_doc,
4776"share(process_id) -> bytes\n\
4777\n\
4778Share the socket with another process. The target process id\n\
4779must be provided and the resulting bytes object passed to the target\n\
4780process. There the shared socket can be instantiated by calling\n\
4781socket.fromshare().");
4782
Christian Heimesfaf2f632008-01-06 16:59:19 +00004783
4784#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004785
4786/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004787
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004788static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4790 accept_doc},
4791 {"bind", (PyCFunction)sock_bind, METH_O,
4792 bind_doc},
4793 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004794 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 {"connect", (PyCFunction)sock_connect, METH_O,
4796 connect_doc},
4797 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4798 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004799 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4800 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4802 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004803#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 {"getpeername", (PyCFunction)sock_getpeername,
4805 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 {"getsockname", (PyCFunction)sock_getsockname,
4808 METH_NOARGS, getsockname_doc},
4809 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4810 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004811#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4813 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004814#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004815#if defined(MS_WINDOWS)
4816 {"share", (PyCFunction)sock_share, METH_VARARGS,
4817 sock_share_doc},
4818#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004819 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 listen_doc},
4821 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4822 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004823 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 recv_into_doc},
4825 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4826 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004827 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 recvfrom_into_doc},
4829 {"send", (PyCFunction)sock_send, METH_VARARGS,
4830 send_doc},
4831 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4832 sendall_doc},
4833 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4834 sendto_doc},
4835 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4836 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004837 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4838 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4840 settimeout_doc},
4841 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4842 gettimeout_doc},
4843 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4844 setsockopt_doc},
4845 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4846 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004847#ifdef CMSG_LEN
4848 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4849 recvmsg_doc},
4850 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4851 recvmsg_into_doc,},
4852 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4853 sendmsg_doc},
4854#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004855#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004856 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004857 sendmsg_afalg_doc},
4858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004860};
4861
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004862/* SockObject members */
4863static PyMemberDef sock_memberlist[] = {
4864 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4865 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4866 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004867 {0},
4868};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004869
Victor Stinner71694d52015-03-28 01:18:54 +01004870static PyGetSetDef sock_getsetlist[] = {
4871 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4872 {NULL} /* sentinel */
4873};
4874
Guido van Rossum73624e91994-10-10 17:59:00 +00004875/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004876 First close the file description. */
4877
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004878static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004879sock_finalize(PySocketSockObject *s)
4880{
4881 SOCKET_T fd;
4882 PyObject *error_type, *error_value, *error_traceback;
4883
4884 /* Save the current exception, if any. */
4885 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4886
Victor Stinnerd3afb622016-07-22 17:47:09 +02004887 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004888 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4889 /* Spurious errors can appear at shutdown */
4890 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4891 PyErr_WriteUnraisable((PyObject *)s);
4892 }
4893 }
4894
4895 /* Only close the socket *after* logging the ResourceWarning warning
4896 to allow the logger to call socket methods like
4897 socket.getsockname(). If the socket is closed before, socket
4898 methods fails with the EBADF error. */
4899 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004900 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004901
4902 /* We do not want to retry upon EINTR: see sock_close() */
4903 Py_BEGIN_ALLOW_THREADS
4904 (void) SOCKETCLOSE(fd);
4905 Py_END_ALLOW_THREADS
4906 }
4907
4908 /* Restore the saved exception. */
4909 PyErr_Restore(error_type, error_value, error_traceback);
4910}
4911
4912static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004913sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004914{
Victor Stinner19a8e842016-03-21 16:36:48 +01004915 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4916 return;
4917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004919}
4920
Guido van Rossum30a685f1991-06-27 15:51:29 +00004921
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004922static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004923sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004924{
Victor Stinnere254e532014-07-26 14:36:55 +02004925 long sock_fd;
4926 /* On Windows, this test is needed because SOCKET_T is unsigned */
4927 if (s->sock_fd == INVALID_SOCKET) {
4928 sock_fd = -1;
4929 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004930#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004931 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 /* this can occur on Win64, and actually there is a special
4933 ugly printf formatter for decimal pointer length integer
4934 printing, only bother if necessary*/
4935 PyErr_SetString(PyExc_OverflowError,
4936 "no printf formatter to display "
4937 "the socket descriptor in decimal");
4938 return NULL;
4939 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004940#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004941 else
4942 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 return PyUnicode_FromFormat(
4944 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004945 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 s->sock_type,
4947 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004948}
4949
4950
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004951/* Create a new, uninitialized socket object. */
4952
4953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004954sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 new = type->tp_alloc(type, 0);
4959 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004960 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004961 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 ((PySocketSockObject *)new)->errorhandler = &set_error;
4963 }
4964 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004965}
4966
4967
4968/* Initialize a new socket object. */
4969
Victor Stinnerdaf45552013-08-28 00:53:59 +02004970#ifdef SOCK_CLOEXEC
4971/* socket() and socketpair() fail with EINVAL on Linux kernel older
4972 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4973static int sock_cloexec_works = -1;
4974#endif
4975
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004976/*ARGSUSED*/
4977static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004978sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 PySocketSockObject *s = (PySocketSockObject *)self;
4981 PyObject *fdobj = NULL;
4982 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004983 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004985#ifndef MS_WINDOWS
4986#ifdef SOCK_CLOEXEC
4987 int *atomic_flag_works = &sock_cloexec_works;
4988#else
4989 int *atomic_flag_works = NULL;
4990#endif
4991#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4994 "|iiiO:socket", keywords,
4995 &family, &type, &proto, &fdobj))
4996 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004999#ifdef MS_WINDOWS
5000 /* recreate a socket that was duplicated */
5001 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005002 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005003 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5004 PyErr_Format(PyExc_ValueError,
5005 "socket descriptor string has wrong size, "
5006 "should be %zu bytes.", sizeof(info));
5007 return -1;
5008 }
5009 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
5010 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005011 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005012 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5013 Py_END_ALLOW_THREADS
5014 if (fd == INVALID_SOCKET) {
5015 set_error();
5016 return -1;
5017 }
5018 family = info.iAddressFamily;
5019 type = info.iSocketType;
5020 proto = info.iProtocol;
5021 }
5022 else
5023#endif
5024 {
Dima Tisneke9912702018-12-17 22:07:55 +09005025
5026 if (PyFloat_Check(fdobj)) {
5027 PyErr_SetString(PyExc_TypeError,
5028 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005029 return -1;
5030 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005031
Dima Tisneke9912702018-12-17 22:07:55 +09005032 fd = PyLong_AsSocket_t(fdobj);
5033 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5034 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005035#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005036 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005037#else
Dima Tisneke9912702018-12-17 22:07:55 +09005038 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005039#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005040 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5041 return -1;
5042 }
5043
5044 /* validate that passed file descriptor is valid and a socket. */
5045 sock_addr_t addrbuf;
5046 socklen_t addrlen = sizeof(sock_addr_t);
5047
5048 memset(&addrbuf, 0, addrlen);
5049 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5050 if (family == -1) {
5051 family = SAS2SA(&addrbuf)->sa_family;
5052 }
5053 } else {
5054#ifdef MS_WINDOWS
5055 /* getsockname() on an unbound socket is an error on Windows.
5056 Invalid descriptor and not a socket is same error code.
5057 Error out if family must be resolved, or bad descriptor. */
5058 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5059#else
5060 /* getsockname() is not supported for SOL_ALG on Linux. */
5061 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5062#endif
5063 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005064 return -1;
5065 }
5066 }
5067#ifdef SO_TYPE
5068 if (type == -1) {
5069 int tmp;
5070 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005071 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5072 (void *)&tmp, &slen) == 0)
5073 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005074 type = tmp;
5075 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005076 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005077 return -1;
5078 }
5079 }
5080#else
5081 type = SOCK_STREAM;
5082#endif
5083#ifdef SO_PROTOCOL
5084 if (proto == -1) {
5085 int tmp;
5086 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005087 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5088 (void *)&tmp, &slen) == 0)
5089 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005090 proto = tmp;
5091 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005092 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005093 return -1;
5094 }
5095 }
5096#else
5097 proto = 0;
5098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 }
5100 }
5101 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005102 /* No fd, default to AF_INET and SOCK_STREAM */
5103 if (family == -1) {
5104 family = AF_INET;
5105 }
5106 if (type == -1) {
5107 type = SOCK_STREAM;
5108 }
5109 if (proto == -1) {
5110 proto = 0;
5111 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005112#ifdef MS_WINDOWS
5113 /* Windows implementation */
5114#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5115#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5116#endif
5117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005119 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005120 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005121 NULL, 0,
5122 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5123 if (fd == INVALID_SOCKET) {
5124 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5125 support_wsa_no_inherit = 0;
5126 fd = socket(family, type, proto);
5127 }
5128 }
5129 else {
5130 fd = socket(family, type, proto);
5131 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 if (fd == INVALID_SOCKET) {
5135 set_error();
5136 return -1;
5137 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005138
5139 if (!support_wsa_no_inherit) {
5140 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5141 closesocket(fd);
5142 PyErr_SetFromWindowsErr(0);
5143 return -1;
5144 }
5145 }
5146#else
5147 /* UNIX */
5148 Py_BEGIN_ALLOW_THREADS
5149#ifdef SOCK_CLOEXEC
5150 if (sock_cloexec_works != 0) {
5151 fd = socket(family, type | SOCK_CLOEXEC, proto);
5152 if (sock_cloexec_works == -1) {
5153 if (fd >= 0) {
5154 sock_cloexec_works = 1;
5155 }
5156 else if (errno == EINVAL) {
5157 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5158 sock_cloexec_works = 0;
5159 fd = socket(family, type, proto);
5160 }
5161 }
5162 }
5163 else
5164#endif
5165 {
5166 fd = socket(family, type, proto);
5167 }
5168 Py_END_ALLOW_THREADS
5169
5170 if (fd == INVALID_SOCKET) {
5171 set_error();
5172 return -1;
5173 }
5174
5175 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5176 SOCKETCLOSE(fd);
5177 return -1;
5178 }
5179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005181 if (init_sockobject(s, fd, family, type, proto) == -1) {
5182 SOCKETCLOSE(fd);
5183 return -1;
5184 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005187
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005188}
5189
5190
Guido van Rossumb6775db1994-08-01 11:34:53 +00005191/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005192
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005193static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5195 "_socket.socket", /* tp_name */
5196 sizeof(PySocketSockObject), /* tp_basicsize */
5197 0, /* tp_itemsize */
5198 (destructor)sock_dealloc, /* tp_dealloc */
5199 0, /* tp_print */
5200 0, /* tp_getattr */
5201 0, /* tp_setattr */
5202 0, /* tp_reserved */
5203 (reprfunc)sock_repr, /* tp_repr */
5204 0, /* tp_as_number */
5205 0, /* tp_as_sequence */
5206 0, /* tp_as_mapping */
5207 0, /* tp_hash */
5208 0, /* tp_call */
5209 0, /* tp_str */
5210 PyObject_GenericGetAttr, /* tp_getattro */
5211 0, /* tp_setattro */
5212 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005213 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5214 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 sock_doc, /* tp_doc */
5216 0, /* tp_traverse */
5217 0, /* tp_clear */
5218 0, /* tp_richcompare */
5219 0, /* tp_weaklistoffset */
5220 0, /* tp_iter */
5221 0, /* tp_iternext */
5222 sock_methods, /* tp_methods */
5223 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005224 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 0, /* tp_base */
5226 0, /* tp_dict */
5227 0, /* tp_descr_get */
5228 0, /* tp_descr_set */
5229 0, /* tp_dictoffset */
5230 sock_initobj, /* tp_init */
5231 PyType_GenericAlloc, /* tp_alloc */
5232 sock_new, /* tp_new */
5233 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005234 0, /* tp_is_gc */
5235 0, /* tp_bases */
5236 0, /* tp_mro */
5237 0, /* tp_cache */
5238 0, /* tp_subclasses */
5239 0, /* tp_weaklist */
5240 0, /* tp_del */
5241 0, /* tp_version_tag */
5242 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005243};
5244
Guido van Rossum30a685f1991-06-27 15:51:29 +00005245
Guido van Rossum81194471991-07-27 21:42:02 +00005246/* Python interface to gethostname(). */
5247
5248/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005249static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005250socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005251{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005252#ifdef MS_WINDOWS
5253 /* Don't use winsock's gethostname, as this returns the ANSI
5254 version of the hostname, whereas we need a Unicode string.
5255 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005256 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005257 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005258 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005259 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005260
5261 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005262 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005263
5264 if (GetLastError() != ERROR_MORE_DATA)
5265 return PyErr_SetFromWindowsErr(0);
5266
5267 if (size == 0)
5268 return PyUnicode_New(0, 0);
5269
5270 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5271 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005272 name = PyMem_New(wchar_t, size);
5273 if (!name) {
5274 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005275 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005276 }
Victor Stinner74168972011-11-17 01:11:36 +01005277 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5278 name,
5279 &size))
5280 {
5281 PyMem_Free(name);
5282 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005283 }
Victor Stinner74168972011-11-17 01:11:36 +01005284
5285 result = PyUnicode_FromWideChar(name, size);
5286 PyMem_Free(name);
5287 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005288#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 char buf[1024];
5290 int res;
5291 Py_BEGIN_ALLOW_THREADS
5292 res = gethostname(buf, (int) sizeof buf - 1);
5293 Py_END_ALLOW_THREADS
5294 if (res < 0)
5295 return set_error();
5296 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005297 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005298#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005299}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005300
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005301PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005302"gethostname() -> string\n\
5303\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005304Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005305
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005306#ifdef HAVE_SETHOSTNAME
5307PyDoc_STRVAR(sethostname_doc,
5308"sethostname(name)\n\n\
5309Sets the hostname to name.");
5310
5311static PyObject *
5312socket_sethostname(PyObject *self, PyObject *args)
5313{
5314 PyObject *hnobj;
5315 Py_buffer buf;
5316 int res, flag = 0;
5317
Christian Heimesd2774c72013-06-19 02:06:29 +02005318#ifdef _AIX
5319/* issue #18259, not declared in any useful header file */
5320extern int sethostname(const char *, size_t);
5321#endif
5322
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005323 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5324 PyErr_Clear();
5325 if (!PyArg_ParseTuple(args, "O&:sethostname",
5326 PyUnicode_FSConverter, &hnobj))
5327 return NULL;
5328 flag = 1;
5329 }
5330 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5331 if (!res) {
5332 res = sethostname(buf.buf, buf.len);
5333 PyBuffer_Release(&buf);
5334 }
5335 if (flag)
5336 Py_DECREF(hnobj);
5337 if (res)
5338 return set_error();
5339 Py_RETURN_NONE;
5340}
5341#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005342
Guido van Rossum30a685f1991-06-27 15:51:29 +00005343/* Python interface to gethostbyname(name). */
5344
5345/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005346static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005347socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005350 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005351 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005352
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005353 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 return NULL;
Коренберг Марк7766b962018-02-13 00:47:42 +05005355 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005356 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005357 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005358finally:
5359 PyMem_Free(name);
5360 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005361}
5362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005363PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005364"gethostbyname(host) -> address\n\
5365\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005366Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005367
5368
Victor Stinner72400302016-01-28 15:41:01 +01005369static PyObject*
5370sock_decode_hostname(const char *name)
5371{
5372#ifdef MS_WINDOWS
5373 /* Issue #26227: gethostbyaddr() returns a string encoded
5374 * to the ANSI code page */
5375 return PyUnicode_DecodeFSDefault(name);
5376#else
5377 /* Decode from UTF-8 */
5378 return PyUnicode_FromString(name);
5379#endif
5380}
5381
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005382/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5383
5384static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005385gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 char **pch;
5388 PyObject *rtn_tuple = (PyObject *)NULL;
5389 PyObject *name_list = (PyObject *)NULL;
5390 PyObject *addr_list = (PyObject *)NULL;
5391 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005392 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 if (h == NULL) {
5395 /* Let's get real error message to return */
5396 set_herror(h_errno);
5397 return NULL;
5398 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 if (h->h_addrtype != af) {
5401 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005402 errno = EAFNOSUPPORT;
5403 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 return NULL;
5405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 case AF_INET:
5410 if (alen < sizeof(struct sockaddr_in))
5411 return NULL;
5412 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005413
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005414#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 case AF_INET6:
5416 if (alen < sizeof(struct sockaddr_in6))
5417 return NULL;
5418 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 if ((name_list = PyList_New(0)) == NULL)
5424 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 if ((addr_list = PyList_New(0)) == NULL)
5427 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 /* SF #1511317: h_aliases can be NULL */
5430 if (h->h_aliases) {
5431 for (pch = h->h_aliases; *pch != NULL; pch++) {
5432 int status;
5433 tmp = PyUnicode_FromString(*pch);
5434 if (tmp == NULL)
5435 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 status = PyList_Append(name_list, tmp);
5438 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 if (status)
5441 goto err;
5442 }
5443 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5446 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 case AF_INET:
5451 {
5452 struct sockaddr_in sin;
5453 memset(&sin, 0, sizeof(sin));
5454 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005459 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 if (pch == h->h_addr_list && alen >= sizeof(sin))
5462 memcpy((char *) addr, &sin, sizeof(sin));
5463 break;
5464 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005465
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005466#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 case AF_INET6:
5468 {
5469 struct sockaddr_in6 sin6;
5470 memset(&sin6, 0, sizeof(sin6));
5471 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005472#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005476 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5479 memcpy((char *) addr, &sin6, sizeof(sin6));
5480 break;
5481 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005485 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 "unsupported address family");
5487 return NULL;
5488 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 if (tmp == NULL)
5491 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 status = PyList_Append(addr_list, tmp);
5494 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 if (status)
5497 goto err;
5498 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005499
Victor Stinner72400302016-01-28 15:41:01 +01005500 name = sock_decode_hostname(h->h_name);
5501 if (name == NULL)
5502 goto err;
5503 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005504
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005505 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 Py_XDECREF(name_list);
5507 Py_XDECREF(addr_list);
5508 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005509}
5510
5511
5512/* Python interface to gethostbyname_ex(name). */
5513
5514/*ARGSUSED*/
5515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005516socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 char *name;
5519 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005520 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005522 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005523#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005525#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005527#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 char buf[16384];
5529 int buf_len = (sizeof buf) - 1;
5530 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005531#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005532#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005534#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005535#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005536
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005537 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005539 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005540 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005542#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005543#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005544 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005546#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005548#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 memset((void *) &data, '\0', sizeof(data));
5550 result = gethostbyname_r(name, &hp_allocated, &data);
5551 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005552#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005553#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005554#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005556#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005557 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005559#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 Py_END_ALLOW_THREADS
5561 /* Some C libraries would require addr.__ss_family instead of
5562 addr.ss_family.
5563 Therefore, we cast the sockaddr_storage into sockaddr to
5564 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005565 sa = SAS2SA(&addr);
5566 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005568#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005570#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005571finally:
5572 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005574}
5575
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005576PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005577"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5578\n\
5579Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005580for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005581
5582
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005583/* Python interface to gethostbyaddr(IP). */
5584
5585/*ARGSUSED*/
5586static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005587socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005588{
Charles-François Natali8b759652011-12-23 16:44:51 +01005589 sock_addr_t addr;
5590 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 char *ip_num;
5592 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005593 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005594#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005596#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005598#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 /* glibcs up to 2.10 assume that the buf argument to
5600 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5601 does not ensure. The attribute below instructs the compiler
5602 to maintain this alignment. */
5603 char buf[16384] Py_ALIGNED(8);
5604 int buf_len = (sizeof buf) - 1;
5605 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005606#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005607#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005609#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005610#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005611 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 int al;
5613 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005614
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005615 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 return NULL;
5617 af = AF_UNSPEC;
5618 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005619 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 af = sa->sa_family;
5621 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005622 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 switch (af) {
5624 case AF_INET:
5625 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5626 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5627 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005628#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 case AF_INET6:
5630 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5631 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5632 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005635 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005636 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 }
5638 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005639#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005640#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005641 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 &hp_allocated, buf, buf_len,
5643 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005644#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 h = gethostbyaddr_r(ap, al, af,
5646 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005647#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 memset((void *) &data, '\0', sizeof(data));
5649 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5650 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005651#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005652#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005653#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005655#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005656 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005658#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005660 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005661#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005663#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005664finally:
5665 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005667}
5668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005669PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005670"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5671\n\
5672Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005673for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005674
Guido van Rossum30a685f1991-06-27 15:51:29 +00005675
5676/* Python interface to getservbyname(name).
5677 This only returns the port number, since the other info is already
5678 known or not useful (like the list of aliases). */
5679
5680/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005682socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005683{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005684 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 struct servent *sp;
5686 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5687 return NULL;
5688 Py_BEGIN_ALLOW_THREADS
5689 sp = getservbyname(name, proto);
5690 Py_END_ALLOW_THREADS
5691 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005692 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 return NULL;
5694 }
5695 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005696}
5697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005698PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005699"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005700\n\
5701Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005702The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5703otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005704
Guido van Rossum30a685f1991-06-27 15:51:29 +00005705
Barry Warsaw11b91a02004-06-28 00:50:43 +00005706/* Python interface to getservbyport(port).
5707 This only returns the service name, since the other info is already
5708 known or not useful (like the list of aliases). */
5709
5710/*ARGSUSED*/
5711static PyObject *
5712socket_getservbyport(PyObject *self, PyObject *args)
5713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005715 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 struct servent *sp;
5717 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5718 return NULL;
5719 if (port < 0 || port > 0xffff) {
5720 PyErr_SetString(
5721 PyExc_OverflowError,
5722 "getservbyport: port must be 0-65535.");
5723 return NULL;
5724 }
5725 Py_BEGIN_ALLOW_THREADS
5726 sp = getservbyport(htons((short)port), proto);
5727 Py_END_ALLOW_THREADS
5728 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005729 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 return NULL;
5731 }
5732 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005733}
5734
5735PyDoc_STRVAR(getservbyport_doc,
5736"getservbyport(port[, protocolname]) -> string\n\
5737\n\
5738Return the service name from a port number and protocol name.\n\
5739The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5740otherwise any protocol will match.");
5741
Guido van Rossum3901d851996-12-19 16:35:04 +00005742/* Python interface to getprotobyname(name).
5743 This only returns the protocol number, since the other info is
5744 already known or not useful (like the list of aliases). */
5745
5746/*ARGSUSED*/
5747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005748socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005749{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005750 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 struct protoent *sp;
5752 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5753 return NULL;
5754 Py_BEGIN_ALLOW_THREADS
5755 sp = getprotobyname(name);
5756 Py_END_ALLOW_THREADS
5757 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005758 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 return NULL;
5760 }
5761 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005762}
5763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005764PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005765"getprotobyname(name) -> integer\n\
5766\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005767Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005768
Christian Heimesd0e31b92018-01-27 09:54:13 +01005769static PyObject *
5770socket_close(PyObject *self, PyObject *fdobj)
5771{
5772 SOCKET_T fd;
5773 int res;
5774
5775 fd = PyLong_AsSocket_t(fdobj);
5776 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5777 return NULL;
5778 Py_BEGIN_ALLOW_THREADS
5779 res = SOCKETCLOSE(fd);
5780 Py_END_ALLOW_THREADS
5781 /* bpo-30319: The peer can already have closed the connection.
5782 Python ignores ECONNRESET on close(). */
5783 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5784 return set_error();
5785 }
5786 Py_RETURN_NONE;
5787}
5788
5789PyDoc_STRVAR(close_doc,
5790"close(integer) -> None\n\
5791\n\
5792Close an integer socket file descriptor. This is like os.close(), but for\n\
5793sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005794
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005795#ifndef NO_DUP
5796/* dup() function for socket fds */
5797
5798static PyObject *
5799socket_dup(PyObject *self, PyObject *fdobj)
5800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 SOCKET_T fd, newfd;
5802 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005803#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005804 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005805#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 fd = PyLong_AsSocket_t(fdobj);
5808 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5809 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005810
Victor Stinnerdaf45552013-08-28 00:53:59 +02005811#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005812 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005813 return set_error();
5814
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005815 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005816 FROM_PROTOCOL_INFO,
5817 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 if (newfd == INVALID_SOCKET)
5819 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005820
Victor Stinnerdaf45552013-08-28 00:53:59 +02005821 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5822 closesocket(newfd);
5823 PyErr_SetFromWindowsErr(0);
5824 return NULL;
5825 }
5826#else
5827 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5828 newfd = _Py_dup(fd);
5829 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005830 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005831#endif
5832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 newfdobj = PyLong_FromSocket_t(newfd);
5834 if (newfdobj == NULL)
5835 SOCKETCLOSE(newfd);
5836 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005837}
5838
5839PyDoc_STRVAR(dup_doc,
5840"dup(integer) -> integer\n\
5841\n\
5842Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5843sockets; on some platforms os.dup() won't work for socket file descriptors.");
5844#endif
5845
5846
Dave Cole331708b2004-08-09 04:51:41 +00005847#ifdef HAVE_SOCKETPAIR
5848/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005849 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005850 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005851
5852/*ARGSUSED*/
5853static PyObject *
5854socket_socketpair(PyObject *self, PyObject *args)
5855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 PySocketSockObject *s0 = NULL, *s1 = NULL;
5857 SOCKET_T sv[2];
5858 int family, type = SOCK_STREAM, proto = 0;
5859 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005860#ifdef SOCK_CLOEXEC
5861 int *atomic_flag_works = &sock_cloexec_works;
5862#else
5863 int *atomic_flag_works = NULL;
5864#endif
5865 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005866
5867#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005869#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5873 &family, &type, &proto))
5874 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005877 Py_BEGIN_ALLOW_THREADS
5878#ifdef SOCK_CLOEXEC
5879 if (sock_cloexec_works != 0) {
5880 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5881 if (sock_cloexec_works == -1) {
5882 if (ret >= 0) {
5883 sock_cloexec_works = 1;
5884 }
5885 else if (errno == EINVAL) {
5886 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5887 sock_cloexec_works = 0;
5888 ret = socketpair(family, type, proto, sv);
5889 }
5890 }
5891 }
5892 else
5893#endif
5894 {
5895 ret = socketpair(family, type, proto, sv);
5896 }
5897 Py_END_ALLOW_THREADS
5898
5899 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005901
5902 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5903 goto finally;
5904 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5905 goto finally;
5906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 s0 = new_sockobject(sv[0], family, type, proto);
5908 if (s0 == NULL)
5909 goto finally;
5910 s1 = new_sockobject(sv[1], family, type, proto);
5911 if (s1 == NULL)
5912 goto finally;
5913 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005914
5915finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 if (res == NULL) {
5917 if (s0 == NULL)
5918 SOCKETCLOSE(sv[0]);
5919 if (s1 == NULL)
5920 SOCKETCLOSE(sv[1]);
5921 }
5922 Py_XDECREF(s0);
5923 Py_XDECREF(s1);
5924 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005925}
5926
5927PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005928"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005929\n\
5930Create a pair of socket objects from the sockets returned by the platform\n\
5931socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005932The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005933AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005934
5935#endif /* HAVE_SOCKETPAIR */
5936
5937
Guido van Rossum006bf911996-06-12 04:04:55 +00005938static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005939socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005940{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005941 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005942
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005943 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 return NULL;
5945 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005946 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005948 "ntohs: can't convert negative Python int to C "
5949 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 return NULL;
5951 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005952 if (x > 0xffff) {
5953 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5954 "ntohs: Python int too large to convert to C "
5955 "16-bit unsigned integer (The silent truncation "
5956 "is deprecated)",
5957 1)) {
5958 return NULL;
5959 }
5960 }
5961 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005962}
5963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005964PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005965"ntohs(integer) -> integer\n\
5966\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005967Convert a 16-bit unsigned integer from network to host byte order.\n\
5968Note that in case the received integer does not fit in 16-bit unsigned\n\
5969integer, but does fit in a positive C int, it is silently truncated to\n\
597016-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005971However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005972exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005973
5974
Guido van Rossum006bf911996-06-12 04:04:55 +00005975static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005976socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 if (PyLong_Check(arg)) {
5981 x = PyLong_AsUnsignedLong(arg);
5982 if (x == (unsigned long) -1 && PyErr_Occurred())
5983 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005984#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 {
5986 unsigned long y;
5987 /* only want the trailing 32 bits */
5988 y = x & 0xFFFFFFFFUL;
5989 if (y ^ x)
5990 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005991 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 x = y;
5993 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 }
5996 else
5997 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005998 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006001}
6002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006003PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006004"ntohl(integer) -> integer\n\
6005\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006006Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006007
6008
Guido van Rossum006bf911996-06-12 04:04:55 +00006009static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006010socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006011{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006012 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006013
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006014 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 return NULL;
6016 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006017 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006019 "htons: can't convert negative Python int to C "
6020 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 return NULL;
6022 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006023 if (x > 0xffff) {
6024 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6025 "htons: Python int too large to convert to C "
6026 "16-bit unsigned integer (The silent truncation "
6027 "is deprecated)",
6028 1)) {
6029 return NULL;
6030 }
6031 }
6032 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006033}
6034
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006035PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006036"htons(integer) -> integer\n\
6037\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006038Convert a 16-bit unsigned integer from host to network byte order.\n\
6039Note that in case the received integer does not fit in 16-bit unsigned\n\
6040integer, but does fit in a positive C int, it is silently truncated to\n\
604116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006042However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006043exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006044
6045
Guido van Rossum006bf911996-06-12 04:04:55 +00006046static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006047socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 if (PyLong_Check(arg)) {
6052 x = PyLong_AsUnsignedLong(arg);
6053 if (x == (unsigned long) -1 && PyErr_Occurred())
6054 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006055#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 {
6057 unsigned long y;
6058 /* only want the trailing 32 bits */
6059 y = x & 0xFFFFFFFFUL;
6060 if (y ^ x)
6061 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006062 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 x = y;
6064 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 }
6067 else
6068 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006069 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 Py_TYPE(arg)->tp_name);
6071 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006072}
6073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006074PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006075"htonl(integer) -> integer\n\
6076\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006077Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006078
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006079/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006081PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006082"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006083\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006084Convert 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 +00006085binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006086
6087static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006088socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006089{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006090#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006092#endif
6093
6094#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006095#if (SIZEOF_INT != 4)
6096#error "Not sure if in_addr_t exists and int is not 32-bits."
6097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 /* Have to use inet_addr() instead */
6099 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006100#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006101 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6104 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006105
Tim Peters1df9fdd2003-02-13 03:13:40 +00006106
6107#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006108
6109#ifdef USE_INET_ATON_WEAKLINK
6110 if (inet_aton != NULL) {
6111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 if (inet_aton(ip_addr, &buf))
6113 return PyBytes_FromStringAndSize((char *)(&buf),
6114 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006115
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006116 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 "illegal IP address string passed to inet_aton");
6118 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006119
Thomas Wouters477c8d52006-05-27 19:21:47 +00006120#ifdef USE_INET_ATON_WEAKLINK
6121 } else {
6122#endif
6123
6124#endif
6125
6126#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 /* special-case this address as inet_addr might return INADDR_NONE
6129 * for this */
6130 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006131 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006133
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006134 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006138 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 "illegal IP address string passed to inet_aton");
6140 return NULL;
6141 }
6142 }
6143 return PyBytes_FromStringAndSize((char *) &packed_addr,
6144 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006145
6146#ifdef USE_INET_ATON_WEAKLINK
6147 }
6148#endif
6149
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006150#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006151}
6152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006153PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006154"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006155\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006156Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006157
6158static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006159socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006160{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006161 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006163
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006164 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 return NULL;
6166 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006167
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006168 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006169 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006171 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 return NULL;
6173 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006174
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006175 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6176 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006177
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006178 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006180}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006181
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006182#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006183
6184PyDoc_STRVAR(inet_pton_doc,
6185"inet_pton(af, ip) -> packed IP address string\n\
6186\n\
6187Convert an IP address from string format to a packed string suitable\n\
6188for use with low-level network functions.");
6189
6190static PyObject *
6191socket_inet_pton(PyObject *self, PyObject *args)
6192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006194 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006196#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006197 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006198#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6202 return NULL;
6203 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006204
Martin v. Löwis04697e82004-06-02 12:35:29 +00006205#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006207 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 "can't use AF_INET6, IPv6 is disabled");
6209 return NULL;
6210 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006211#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 retval = inet_pton(af, ip, packed);
6214 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006215 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 return NULL;
6217 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006218 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 "illegal IP address string passed to inet_pton");
6220 return NULL;
6221 } else if (af == AF_INET) {
6222 return PyBytes_FromStringAndSize(packed,
6223 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006224#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 } else if (af == AF_INET6) {
6226 return PyBytes_FromStringAndSize(packed,
6227 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006230 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 return NULL;
6232 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006233}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006234
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006235PyDoc_STRVAR(inet_ntop_doc,
6236"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6237\n\
6238Convert a packed IP address of the given family to string format.");
6239
6240static PyObject *
6241socket_inet_ntop(PyObject *self, PyObject *args)
6242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006244 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006246#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006247 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006248#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006249 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006250#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006251
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006252 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 return NULL;
6254 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006257 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 PyErr_SetString(PyExc_ValueError,
6259 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006260 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 return NULL;
6262 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006263#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006265 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 PyErr_SetString(PyExc_ValueError,
6267 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006268 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 return NULL;
6270 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 } else {
6273 PyErr_Format(PyExc_ValueError,
6274 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006275 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 return NULL;
6277 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006278
Коренберг Марк7766b962018-02-13 00:47:42 +05006279 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006280 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6281 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006283 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 return NULL;
6285 } else {
6286 return PyUnicode_FromString(retval);
6287 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006288}
6289
6290#endif /* HAVE_INET_PTON */
6291
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006292/* Python interface to getaddrinfo(host, port). */
6293
6294/*ARGSUSED*/
6295static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006296socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006297{
Victor Stinner77af1722011-05-26 14:05:59 +02006298 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006299 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 struct addrinfo hints, *res;
6301 struct addrinfo *res0 = NULL;
6302 PyObject *hobj = NULL;
6303 PyObject *pobj = (PyObject *)NULL;
6304 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006305 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306 int family, socktype, protocol, flags;
6307 int error;
6308 PyObject *all = (PyObject *)NULL;
6309 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006310
Georg Brandl6083a4b2013-10-14 06:51:46 +02006311 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006313 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006314 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 &protocol, &flags)) {
6316 return NULL;
6317 }
6318 if (hobj == Py_None) {
6319 hptr = NULL;
6320 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006321 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322 if (!idna)
6323 return NULL;
6324 assert(PyBytes_Check(idna));
6325 hptr = PyBytes_AS_STRING(idna);
6326 } else if (PyBytes_Check(hobj)) {
6327 hptr = PyBytes_AsString(hobj);
6328 } else {
6329 PyErr_SetString(PyExc_TypeError,
6330 "getaddrinfo() argument 1 must be string or None");
6331 return NULL;
6332 }
6333 if (PyLong_CheckExact(pobj)) {
6334 long value = PyLong_AsLong(pobj);
6335 if (value == -1 && PyErr_Occurred())
6336 goto err;
6337 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6338 pptr = pbuf;
6339 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006340 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006341 if (pptr == NULL)
6342 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006344 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 } else if (pobj == Py_None) {
6346 pptr = (char *)NULL;
6347 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006348 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 goto err;
6350 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006351#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006352 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006353 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006354 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6355 * This workaround avoids a segfault in libsystem.
6356 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006357 pptr = "00";
6358 }
6359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 memset(&hints, 0, sizeof(hints));
6361 hints.ai_family = family;
6362 hints.ai_socktype = socktype;
6363 hints.ai_protocol = protocol;
6364 hints.ai_flags = flags;
6365 Py_BEGIN_ALLOW_THREADS
6366 ACQUIRE_GETADDRINFO_LOCK
6367 error = getaddrinfo(hptr, pptr, &hints, &res0);
6368 Py_END_ALLOW_THREADS
6369 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6370 if (error) {
6371 set_gaierror(error);
6372 goto err;
6373 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006374
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006375 all = PyList_New(0);
6376 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 goto err;
6378 for (res = res0; res; res = res->ai_next) {
6379 PyObject *single;
6380 PyObject *addr =
6381 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6382 if (addr == NULL)
6383 goto err;
6384 single = Py_BuildValue("iiisO", res->ai_family,
6385 res->ai_socktype, res->ai_protocol,
6386 res->ai_canonname ? res->ai_canonname : "",
6387 addr);
6388 Py_DECREF(addr);
6389 if (single == NULL)
6390 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006391
Zackery Spytz4c596d52018-11-14 15:39:01 -07006392 if (PyList_Append(all, single)) {
6393 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006395 }
6396 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 }
6398 Py_XDECREF(idna);
6399 if (res0)
6400 freeaddrinfo(res0);
6401 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006402 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 Py_XDECREF(all);
6404 Py_XDECREF(idna);
6405 if (res0)
6406 freeaddrinfo(res0);
6407 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006408}
6409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006410PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006411"getaddrinfo(host, port [, family, type, proto, flags])\n\
6412 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006413\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006414Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006415
6416/* Python interface to getnameinfo(sa, flags). */
6417
6418/*ARGSUSED*/
6419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006420socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 PyObject *sa = (PyObject *)NULL;
6423 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006424 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006425 int port;
6426 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6428 struct addrinfo hints, *res = NULL;
6429 int error;
6430 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006431 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 flags = flowinfo = scope_id = 0;
6434 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6435 return NULL;
6436 if (!PyTuple_Check(sa)) {
6437 PyErr_SetString(PyExc_TypeError,
6438 "getnameinfo() argument 1 must be a tuple");
6439 return NULL;
6440 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006441 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006443 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006445 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006446 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006447 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006448 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006449 return NULL;
6450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6452 memset(&hints, 0, sizeof(hints));
6453 hints.ai_family = AF_UNSPEC;
6454 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006455 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 Py_BEGIN_ALLOW_THREADS
6457 ACQUIRE_GETADDRINFO_LOCK
6458 error = getaddrinfo(hostp, pbuf, &hints, &res);
6459 Py_END_ALLOW_THREADS
6460 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6461 if (error) {
6462 set_gaierror(error);
6463 goto fail;
6464 }
6465 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006466 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 "sockaddr resolved to multiple addresses");
6468 goto fail;
6469 }
6470 switch (res->ai_family) {
6471 case AF_INET:
6472 {
6473 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006474 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 "IPv4 sockaddr must be 2 tuple");
6476 goto fail;
6477 }
6478 break;
6479 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006480#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 case AF_INET6:
6482 {
6483 struct sockaddr_in6 *sin6;
6484 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006485 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 sin6->sin6_scope_id = scope_id;
6487 break;
6488 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006491 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6493 if (error) {
6494 set_gaierror(error);
6495 goto fail;
6496 }
Victor Stinner72400302016-01-28 15:41:01 +01006497
6498 name = sock_decode_hostname(hbuf);
6499 if (name == NULL)
6500 goto fail;
6501 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006502
6503fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 if (res)
6505 freeaddrinfo(res);
6506 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006507}
6508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006509PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006510"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006511\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006512Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006513
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006514
6515/* Python API to getting and setting the default timeout value. */
6516
6517static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306518socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006519{
Victor Stinner71694d52015-03-28 01:18:54 +01006520 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006521 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522 }
Victor Stinner71694d52015-03-28 01:18:54 +01006523 else {
6524 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6525 return PyFloat_FromDouble(seconds);
6526 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006527}
6528
6529PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006530"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006531\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006532Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006533A value of None indicates that new socket objects have no timeout.\n\
6534When the socket module is first imported, the default is None.");
6535
6536static PyObject *
6537socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6538{
Victor Stinner71694d52015-03-28 01:18:54 +01006539 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006540
Victor Stinner71694d52015-03-28 01:18:54 +01006541 if (socket_parse_timeout(&timeout, arg) < 0)
6542 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006545
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006546 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006547}
6548
6549PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006550"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006551\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006552Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006553A value of None indicates that new socket objects have no timeout.\n\
6554When the socket module is first imported, the default is None.");
6555
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006556#ifdef HAVE_IF_NAMEINDEX
6557/* Python API for getting interface indices and names */
6558
6559static PyObject *
6560socket_if_nameindex(PyObject *self, PyObject *arg)
6561{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006562 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006563 int i;
6564 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006565
Charles-François Natali60713592011-05-20 16:55:06 +02006566 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006567 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006568 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006569 return NULL;
6570 }
6571
6572 list = PyList_New(0);
6573 if (list == NULL) {
6574 if_freenameindex(ni);
6575 return NULL;
6576 }
6577
Gregory P. Smithb474e672018-12-30 17:05:36 -08006578#ifdef _Py_MEMORY_SANITIZER
6579 __msan_unpoison(ni, sizeof(ni));
6580 __msan_unpoison(&ni[0], sizeof(ni[0]));
6581#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006582 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006583#ifdef _Py_MEMORY_SANITIZER
6584 /* This one isn't the end sentinel, the next one must exist. */
6585 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6586 /* Otherwise Py_BuildValue internals are flagged by MSan when
6587 they access the not-msan-tracked if_name string data. */
6588 {
6589 char *to_sanitize = ni[i].if_name;
6590 do {
6591 __msan_unpoison(to_sanitize, 1);
6592 } while (*to_sanitize++ != '\0');
6593 }
6594#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006595 PyObject *ni_tuple = Py_BuildValue("IO&",
6596 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006597
6598 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6599 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006600 Py_DECREF(list);
6601 if_freenameindex(ni);
6602 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006603 }
6604 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006605 }
6606
6607 if_freenameindex(ni);
6608 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006609}
6610
6611PyDoc_STRVAR(if_nameindex_doc,
6612"if_nameindex()\n\
6613\n\
6614Returns a list of network interface information (index, name) tuples.");
6615
Charles-François Natali60713592011-05-20 16:55:06 +02006616static PyObject *
6617socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006618{
Charles-François Natali60713592011-05-20 16:55:06 +02006619 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006620 unsigned long index;
6621
Charles-François Natali60713592011-05-20 16:55:06 +02006622 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6623 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006624 return NULL;
6625
Charles-François Natali60713592011-05-20 16:55:06 +02006626 index = if_nametoindex(PyBytes_AS_STRING(oname));
6627 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006628 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006629 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006630 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006631 return NULL;
6632 }
6633
6634 return PyLong_FromUnsignedLong(index);
6635}
6636
6637PyDoc_STRVAR(if_nametoindex_doc,
6638"if_nametoindex(if_name)\n\
6639\n\
6640Returns the interface index corresponding to the interface name if_name.");
6641
Charles-François Natali60713592011-05-20 16:55:06 +02006642static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006643socket_if_indextoname(PyObject *self, PyObject *arg)
6644{
Charles-François Natali60713592011-05-20 16:55:06 +02006645 unsigned long index;
6646 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006647
Charles-François Natali60713592011-05-20 16:55:06 +02006648 index = PyLong_AsUnsignedLong(arg);
6649 if (index == (unsigned long) -1)
6650 return NULL;
6651
6652 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006653 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006654 return NULL;
6655 }
6656
Charles-François Natali60713592011-05-20 16:55:06 +02006657 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006658}
6659
6660PyDoc_STRVAR(if_indextoname_doc,
6661"if_indextoname(if_index)\n\
6662\n\
6663Returns the interface name corresponding to the interface index if_index.");
6664
6665#endif /* HAVE_IF_NAMEINDEX */
6666
6667
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006668#ifdef CMSG_LEN
6669/* Python interface to CMSG_LEN(length). */
6670
6671static PyObject *
6672socket_CMSG_LEN(PyObject *self, PyObject *args)
6673{
6674 Py_ssize_t length;
6675 size_t result;
6676
6677 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6678 return NULL;
6679 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6680 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6681 return NULL;
6682 }
6683 return PyLong_FromSize_t(result);
6684}
6685
6686PyDoc_STRVAR(CMSG_LEN_doc,
6687"CMSG_LEN(length) -> control message length\n\
6688\n\
6689Return the total length, without trailing padding, of an ancillary\n\
6690data item with associated data of the given length. This value can\n\
6691often be used as the buffer size for recvmsg() to receive a single\n\
6692item of ancillary data, but RFC 3542 requires portable applications to\n\
6693use CMSG_SPACE() and thus include space for padding, even when the\n\
6694item will be the last in the buffer. Raises OverflowError if length\n\
6695is outside the permissible range of values.");
6696
6697
6698#ifdef CMSG_SPACE
6699/* Python interface to CMSG_SPACE(length). */
6700
6701static PyObject *
6702socket_CMSG_SPACE(PyObject *self, PyObject *args)
6703{
6704 Py_ssize_t length;
6705 size_t result;
6706
6707 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6708 return NULL;
6709 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6710 PyErr_SetString(PyExc_OverflowError,
6711 "CMSG_SPACE() argument out of range");
6712 return NULL;
6713 }
6714 return PyLong_FromSize_t(result);
6715}
6716
6717PyDoc_STRVAR(CMSG_SPACE_doc,
6718"CMSG_SPACE(length) -> buffer size\n\
6719\n\
6720Return the buffer size needed for recvmsg() to receive an ancillary\n\
6721data item with associated data of the given length, along with any\n\
6722trailing padding. The buffer space needed to receive multiple items\n\
6723is the sum of the CMSG_SPACE() values for their associated data\n\
6724lengths. Raises OverflowError if length is outside the permissible\n\
6725range of values.");
6726#endif /* CMSG_SPACE */
6727#endif /* CMSG_LEN */
6728
6729
Guido van Rossum30a685f1991-06-27 15:51:29 +00006730/* List of functions exported by this module. */
6731
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006732static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 {"gethostbyname", socket_gethostbyname,
6734 METH_VARARGS, gethostbyname_doc},
6735 {"gethostbyname_ex", socket_gethostbyname_ex,
6736 METH_VARARGS, ghbn_ex_doc},
6737 {"gethostbyaddr", socket_gethostbyaddr,
6738 METH_VARARGS, gethostbyaddr_doc},
6739 {"gethostname", socket_gethostname,
6740 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006741#ifdef HAVE_SETHOSTNAME
6742 {"sethostname", socket_sethostname,
6743 METH_VARARGS, sethostname_doc},
6744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 {"getservbyname", socket_getservbyname,
6746 METH_VARARGS, getservbyname_doc},
6747 {"getservbyport", socket_getservbyport,
6748 METH_VARARGS, getservbyport_doc},
6749 {"getprotobyname", socket_getprotobyname,
6750 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006751 {"close", socket_close,
6752 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006753#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 {"dup", socket_dup,
6755 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006756#endif
Dave Cole331708b2004-08-09 04:51:41 +00006757#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 {"socketpair", socket_socketpair,
6759 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 {"ntohs", socket_ntohs,
6762 METH_VARARGS, ntohs_doc},
6763 {"ntohl", socket_ntohl,
6764 METH_O, ntohl_doc},
6765 {"htons", socket_htons,
6766 METH_VARARGS, htons_doc},
6767 {"htonl", socket_htonl,
6768 METH_O, htonl_doc},
6769 {"inet_aton", socket_inet_aton,
6770 METH_VARARGS, inet_aton_doc},
6771 {"inet_ntoa", socket_inet_ntoa,
6772 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006773#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774 {"inet_pton", socket_inet_pton,
6775 METH_VARARGS, inet_pton_doc},
6776 {"inet_ntop", socket_inet_ntop,
6777 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006778#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006779 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006780 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781 {"getnameinfo", socket_getnameinfo,
6782 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306783 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784 METH_NOARGS, getdefaulttimeout_doc},
6785 {"setdefaulttimeout", socket_setdefaulttimeout,
6786 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006787#ifdef HAVE_IF_NAMEINDEX
6788 {"if_nameindex", socket_if_nameindex,
6789 METH_NOARGS, if_nameindex_doc},
6790 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006791 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006792 {"if_indextoname", socket_if_indextoname,
6793 METH_O, if_indextoname_doc},
6794#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006795#ifdef CMSG_LEN
6796 {"CMSG_LEN", socket_CMSG_LEN,
6797 METH_VARARGS, CMSG_LEN_doc},
6798#ifdef CMSG_SPACE
6799 {"CMSG_SPACE", socket_CMSG_SPACE,
6800 METH_VARARGS, CMSG_SPACE_doc},
6801#endif
6802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006804};
6805
Guido van Rossum30a685f1991-06-27 15:51:29 +00006806
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006807#ifdef MS_WINDOWS
6808#define OS_INIT_DEFINED
6809
6810/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006811
6812static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006813os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006814{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006816}
6817
6818static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006819os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006820{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006821 WSADATA WSAData;
6822 int ret;
6823 ret = WSAStartup(0x0101, &WSAData);
6824 switch (ret) {
6825 case 0: /* No error */
6826 Py_AtExit(os_cleanup);
6827 return 1; /* Success */
6828 case WSASYSNOTREADY:
6829 PyErr_SetString(PyExc_ImportError,
6830 "WSAStartup failed: network not ready");
6831 break;
6832 case WSAVERNOTSUPPORTED:
6833 case WSAEINVAL:
6834 PyErr_SetString(
6835 PyExc_ImportError,
6836 "WSAStartup failed: requested version not supported");
6837 break;
6838 default:
6839 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6840 break;
6841 }
6842 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006843}
6844
Guido van Rossum8d665e61996-06-26 18:22:49 +00006845#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006846
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006847
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006848
6849#ifndef OS_INIT_DEFINED
6850static int
6851os_init(void)
6852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006854}
6855#endif
6856
6857
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006858/* C API table - always add new things to the end for binary
6859 compatibility. */
6860static
6861PySocketModule_APIObject PySocketModuleAPI =
6862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006864 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006866};
6867
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006868
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006869/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006870
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006871 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006872 "socket.py" which implements some additional functionality.
6873 The import of "_socket" may fail with an ImportError exception if
6874 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006875 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006876 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006877*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006878
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006879PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006880"Implementation module for socket operations.\n\
6881\n\
6882See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006883
Martin v. Löwis1a214512008-06-11 05:26:20 +00006884static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 PyModuleDef_HEAD_INIT,
6886 PySocket_MODULE_NAME,
6887 socket_doc,
6888 -1,
6889 socket_methods,
6890 NULL,
6891 NULL,
6892 NULL,
6893 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006894};
6895
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006896PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006897PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901 if (!os_init())
6902 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006903
Victor Stinnerdaf45552013-08-28 00:53:59 +02006904#ifdef MS_WINDOWS
6905 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006906 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006907 }
6908#endif
6909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910 Py_TYPE(&sock_type) = &PyType_Type;
6911 m = PyModule_Create(&socketmodule);
6912 if (m == NULL)
6913 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006914
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006915 Py_INCREF(PyExc_OSError);
6916 PySocketModuleAPI.error = PyExc_OSError;
6917 Py_INCREF(PyExc_OSError);
6918 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006920 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 if (socket_herror == NULL)
6922 return NULL;
6923 Py_INCREF(socket_herror);
6924 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006925 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926 NULL);
6927 if (socket_gaierror == NULL)
6928 return NULL;
6929 Py_INCREF(socket_gaierror);
6930 PyModule_AddObject(m, "gaierror", socket_gaierror);
6931 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006932 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 if (socket_timeout == NULL)
6934 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006935 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 Py_INCREF(socket_timeout);
6937 PyModule_AddObject(m, "timeout", socket_timeout);
6938 Py_INCREF((PyObject *)&sock_type);
6939 if (PyModule_AddObject(m, "SocketType",
6940 (PyObject *)&sock_type) != 0)
6941 return NULL;
6942 Py_INCREF((PyObject *)&sock_type);
6943 if (PyModule_AddObject(m, "socket",
6944 (PyObject *)&sock_type) != 0)
6945 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006946
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006947#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006949#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 Py_INCREF(has_ipv6);
6953 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 /* Export C API */
6956 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6957 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6958 ) != 0)
6959 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006962#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006964#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006966#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006968#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006969#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006972#endif
6973#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006975#endif
6976#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006979#endif
6980#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006983#endif
6984#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006987#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006988#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006991#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006992#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006995#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006996#ifdef HAVE_SOCKADDR_ALG
6997 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6998#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006999#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007000 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007002#endif
7003#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007005#endif
7006#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007007 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007009#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007010#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007013#endif
7014#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007017#endif
7018#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007019 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007021#endif
7022#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007023 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007025#endif
7026#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, AF_NETLINK);
7029 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007030#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007032#endif
7033#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007035#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7037 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007038#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007040#endif
7041#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007043#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007044#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007046#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007047#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007049#endif
7050#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007052#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007054#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007056#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007057#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007059#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007060#ifdef NETLINK_CRYPTO
7061 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7062#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007063#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007064
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007065#ifdef AF_QIPCRTR
7066 /* Qualcomm IPCROUTER */
7067 PyModule_AddIntMacro(m, AF_QIPCRTR);
7068#endif
7069
caaveryeffc12f2017-09-06 18:18:10 -04007070#ifdef AF_VSOCK
7071 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7072 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7073 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7074 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7075 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7076 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7077 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7078 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7079 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7080#endif
7081
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007082#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007085#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007086#ifdef AF_LINK
7087 PyModule_AddIntMacro(m, AF_LINK);
7088#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007089#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007092#endif
7093#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007096#endif
7097#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007100#endif
7101#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007104#endif
7105#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007108#endif
7109#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007112#endif
7113#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007116#endif
7117#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007120#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007121
Hye-Shik Chang81268602004-02-02 06:05:24 +00007122#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7124 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7125 PyModule_AddIntMacro(m, BTPROTO_HCI);
7126 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007127#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007129#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007130#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007131#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007133#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7135 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007136#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7139 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007140#endif
7141
Charles-François Natali47413c12011-10-06 19:47:44 +02007142#ifdef AF_CAN
7143 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007145#endif
7146#ifdef PF_CAN
7147 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007148 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007149#endif
7150
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007151/* Reliable Datagram Sockets */
7152#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007154#endif
7155#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007157#endif
7158
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007159/* Kernel event messages */
7160#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007162#endif
7163#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007165#endif
7166
Antoine Pitroub156a462010-10-27 20:13:57 +00007167#ifdef AF_PACKET
7168 PyModule_AddIntMacro(m, AF_PACKET);
7169#endif
7170#ifdef PF_PACKET
7171 PyModule_AddIntMacro(m, PF_PACKET);
7172#endif
7173#ifdef PACKET_HOST
7174 PyModule_AddIntMacro(m, PACKET_HOST);
7175#endif
7176#ifdef PACKET_BROADCAST
7177 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7178#endif
7179#ifdef PACKET_MULTICAST
7180 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7181#endif
7182#ifdef PACKET_OTHERHOST
7183 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7184#endif
7185#ifdef PACKET_OUTGOING
7186 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7187#endif
7188#ifdef PACKET_LOOPBACK
7189 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7190#endif
7191#ifdef PACKET_FASTROUTE
7192 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007193#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007194
Christian Heimes043d6f62008-01-07 17:19:16 +00007195#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7200 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7201 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007202
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7204 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7205 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, SOL_TIPC);
7209 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7210 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7211 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7212 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007213
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7215 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7216 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7217 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007219 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7221 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007222#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007225#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7227 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7228 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7229 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7230 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7231 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007232#endif
7233
Christian Heimesdffa3942016-09-05 23:54:41 +02007234#ifdef HAVE_SOCKADDR_ALG
7235 /* Socket options */
7236 PyModule_AddIntMacro(m, ALG_SET_KEY);
7237 PyModule_AddIntMacro(m, ALG_SET_IV);
7238 PyModule_AddIntMacro(m, ALG_SET_OP);
7239 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7240 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7241 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7242
7243 /* Operations */
7244 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7245 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7246 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7247 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7248#endif
7249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, SOCK_STREAM);
7252 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007253/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007254#ifdef SOCK_RAW
7255 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007257#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007259#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007261#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007262#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007264#endif
7265#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007267#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007277#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007278#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007280#endif
7281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007300#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007331#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007332#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007333 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007334#endif
7335#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007337#endif
7338#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007340#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007341#ifdef SO_PASSSEC
7342 PyModule_AddIntMacro(m, SO_PASSSEC);
7343#endif
7344#ifdef SO_PEERSEC
7345 PyModule_AddIntMacro(m, SO_PEERSEC);
7346#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007347#ifdef SO_BINDTODEVICE
7348 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7349#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007350#ifdef SO_PRIORITY
7351 PyModule_AddIntMacro(m, SO_PRIORITY);
7352#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007353#ifdef SO_MARK
7354 PyModule_AddIntMacro(m, SO_MARK);
7355#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007356#ifdef SO_DOMAIN
7357 PyModule_AddIntMacro(m, SO_DOMAIN);
7358#endif
7359#ifdef SO_PROTOCOL
7360 PyModule_AddIntMacro(m, SO_PROTOCOL);
7361#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363 /* Maximum number of connections for "listen" */
7364#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007368#endif
7369
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007370 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007371#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007373#endif
7374#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007376#endif
7377#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007379#endif
7380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381 /* Flags for send, recv */
7382#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007385#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007391#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007394#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007411#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007412#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007414#endif
7415#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007417#endif
7418#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007420#endif
7421#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007423#endif
7424#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007426#endif
7427#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007429#endif
7430#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007432#endif
7433#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007435#endif
7436#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007438#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007439#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007441#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443 /* Protocol level and numbers, usable for [gs]etsockopt */
7444#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007449#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007458#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007474#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007476#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007477#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007479#endif
7480#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7482 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007483#endif
7484#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7486 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7487 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007488
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7490 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7491 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007492#ifdef CAN_ISOTP
7493 PyModule_AddIntMacro(m, CAN_ISOTP);
7494#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007495#endif
7496#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7498 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7499 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7500 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007501#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007502#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7503 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7504#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007505#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007507 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7508 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7509 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7510 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7511 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7512 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7513 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7514 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7515 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7516 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7517 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7518 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7519#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007520#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007522#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007523#ifdef HAVE_SOCKADDR_ALG
7524 PyModule_AddIntMacro(m, SOL_ALG);
7525#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007526#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007528#endif
7529#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007531#endif
7532#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007534#endif
7535#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007537#endif
7538#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007540#endif
7541#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007546#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007557#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007558 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007560#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007563#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007566#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007572#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007575 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007577#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007585#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007624#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007627#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007630#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007633#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007644#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007645#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007650#endif
7651/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007652#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007654#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007655 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007659#endif
7660
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007661#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007663#endif
7664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665 /* Some port configuration */
7666#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007668#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007673#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007675#endif
7676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677 /* Some reserved IP v.4 addresses */
7678#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007680#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007681 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007683#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007686 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007688#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007695#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698#ifdef INADDR_ALLHOSTS_GROUP
7699 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7700 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007701#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007713#endif
7714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007715 /* IPv4 [gs]etsockopt options */
7716#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007717 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007719#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007720 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007722#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007723 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007725#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007726 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007728#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007729 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007730#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007731#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007732 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007734#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007737#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007740#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007743#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007749#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007752#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007755#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007758#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007759 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007761#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007763#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007764#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007765 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007766#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007768 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7769#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007772#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007775#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007778#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007781#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007784#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007787 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007788#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007791 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007792#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007793 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007794#endif
7795#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007796 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007797#endif
7798#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007799 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007800#endif
7801#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007803#endif
7804#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007806#endif
7807#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007809#endif
7810#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007812#endif
7813#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007815#endif
7816#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007818#endif
7819#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007821#endif
7822#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007824#endif
7825#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007827#endif
7828#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007830#endif
7831#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007833#endif
7834#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007836#endif
7837#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007839#endif
7840#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007842#endif
7843#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007845#endif
7846#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007848#endif
7849#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007851#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007853 /* TCP options */
7854#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007855 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007857#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007858 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007860#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007861 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007863#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007864 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007866#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007867 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007869#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007872#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007875#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007876 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007878#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007884#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007885 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007887#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007889#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007890#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007892#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007893#ifdef TCP_CONGESTION
7894 PyModule_AddIntMacro(m, TCP_CONGESTION);
7895#endif
7896#ifdef TCP_USER_TIMEOUT
7897 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7898#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007899#ifdef TCP_NOTSENT_LOWAT
7900 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7901#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903 /* IPX options */
7904#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007905 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007906#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007907
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007908/* Reliable Datagram Sockets */
7909#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007911#endif
7912#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007914#endif
7915#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007917#endif
7918#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007920#endif
7921#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007923#endif
7924#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007926#endif
7927#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007929#endif
7930#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007931 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007932#endif
7933#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007934 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007935#endif
7936#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007938#endif
7939#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007940 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007941#endif
7942#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007943 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007944#endif
7945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007947#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007948 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007949#endif
7950#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007952#endif
7953#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007954 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007955#endif
7956#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007958#endif
7959#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007960 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007961#endif
7962#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007963 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007964#endif
7965#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007966 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007967#endif
7968#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007970#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007971#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007972 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007973#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007974#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007975 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007976#endif
7977#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007978 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007979#endif
7980#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007981 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007982#endif
7983#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007985#endif
7986#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007987 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007988#endif
7989#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007990 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007991#endif
7992#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007993 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007994#endif
7995#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007996 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007997#endif
7998#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008000#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008001#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008002 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008003#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008004#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008005 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008006#endif
8007#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008008 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008009#endif
8010#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008012#endif
8013#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008014 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008015#endif
8016#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008017 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008018#endif
8019#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008020 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008021#endif
8022#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008023 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008024#endif
8025#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008026 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008027#endif
8028#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008029 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008030#endif
8031#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008032 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008033#endif
8034#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008035 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008036#endif
8037#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008038 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008039#endif
8040#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008042#endif
8043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008044 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008045#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008046 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008047#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008048 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008050 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008051#endif
8052#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008054#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008055 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008056#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008057 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008058#endif
8059#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008061#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008062 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008063#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008064 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008065#endif
8066
Christian Heimesfaf2f632008-01-06 16:59:19 +00008067#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008068 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008069 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8070#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008071 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008072#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008073 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008074 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8075#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008076 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008077#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008078 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008079 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008080 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008081 PyObject *tmp;
8082 tmp = PyLong_FromUnsignedLong(codes[i]);
8083 if (tmp == NULL)
8084 return NULL;
8085 PyModule_AddObject(m, names[i], tmp);
8086 }
8087 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008088 PyModule_AddIntMacro(m, RCVALL_OFF);
8089 PyModule_AddIntMacro(m, RCVALL_ON);
8090 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008091#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008093#endif
8094#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008096#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008097#endif /* _MSTCPIP_ */
8098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008099 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008100#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008101 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008102#endif
animalize19e7d482018-02-27 02:10:36 +08008103
8104#ifdef MS_WINDOWS
8105 /* remove some flags on older version Windows during run-time */
8106 remove_unusable_flags(m);
8107#endif
8108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008109 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008110}