blob: 5fe2431bee84586084104d22928f9104211395e9 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000171# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700175# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000177# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
178# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
180# undef HAVE_GETHOSTBYNAME_R
181# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#endif
183
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200184#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000186#endif
187
Ned Deilye1d4e582016-02-23 22:05:29 +1100188/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000189#ifdef HAVE_SYS_PARAM_H
190#include <sys/param.h>
191#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100193 (this includes the getaddrinfo emulation) protect access with a lock.
194
195 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
196 a mix of code including an unsafe implementation from an old BSD's
197 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
198 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100199 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100200
Ned Deilye1d4e582016-02-23 22:05:29 +1100201 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
202 http://www.openbsd.org/plus54.html
203
204 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
205
206http://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 +1100207 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200208#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100209 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000210 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
212 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100213 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000214#define USE_GETADDRINFO_LOCK
215#endif
216
217#ifdef USE_GETADDRINFO_LOCK
218#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
219#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
220#else
221#define ACQUIRE_GETADDRINFO_LOCK
222#define RELEASE_GETADDRINFO_LOCK
223#endif
224
225#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000227#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229
Serhiy Storchakad3187152017-11-09 18:00:38 +0200230#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100231# include <sys/ioctl.h>
232#endif
233
234
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000235#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236/* make sure that the reentrant (gethostbyaddr_r etc)
237 functions are declared correctly if compiling with
238 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239
Thomas Wouters477c8d52006-05-27 19:21:47 +0000240/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000241 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000242#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000245#undef _XOPEN_SOURCE
246#include <sys/socket.h>
247#include <sys/types.h>
248#include <netinet/in.h>
249#ifdef _SS_ALIGNSIZE
250#define HAVE_GETADDRINFO 1
251#define HAVE_GETNAMEINFO 1
252#endif
253
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000254#define HAVE_INET_PTON
255#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000256#endif
257
Benjamin Peterson06930632017-09-04 16:36:05 -0700258/* Solaris fails to define this variable at all. */
259#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000260#define INET_ADDRSTRLEN 16
261#endif
262
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000265#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000266#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700268#ifdef HAVE_SYS_SOCKET_H
269#include <sys/socket.h>
270#endif
271
272#ifdef HAVE_NET_IF_H
273#include <net/if.h>
274#endif
275
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000276/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000278#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
280/* Addressing includes */
281
Guido van Rossum6f489d91996-06-28 20:15:15 +0000282#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
284/* Non-MS WINDOWS includes */
285# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000286# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000287
Guido van Rossum9376b741999-09-15 22:01:40 +0000288/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Steve Dower65e4cb12014-11-22 12:54:57 -0800300/* Provides the IsWindows7SP1OrGreater() function */
301#include <VersionHelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800302
Jeremy Hylton22308652001-02-02 03:23:09 +0000303#endif
304
Skip Montanaro7befb992004-02-10 16:50:21 +0000305#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000306
Neal Norwitz39d22e52002-11-02 19:55:21 +0000307#ifndef O_NONBLOCK
308# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000309#endif
310
Trent Micka708d6e2004-09-07 17:48:26 +0000311/* include Python's addrinfo.h unless it causes trouble */
312#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
313 /* Do not include addinfo.h on some newer IRIX versions.
314 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
315 * for example, but not by 6.5.10.
316 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000317#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000318 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
319 * EAI_* constants are defined in (the already included) ws2tcpip.h.
320 */
321#else
322# include "addrinfo.h"
323#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000324
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000325#ifdef __APPLE__
326/* On OS X, getaddrinfo returns no error indication of lookup
327 failure, so we must use the emulation instead of the libinfo
328 implementation. Unfortunately, performing an autoconf test
329 for this bug would require DNS access for the machine performing
330 the configuration, which is not acceptable. Therefore, we
331 determine the bug just by checking for __APPLE__. If this bug
332 gets ever fixed, perhaps checking for sys/version.h would be
333 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000334#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600335/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000336 Find to check for Jaguar is that it has getnameinfo(), which
337 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000338#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000340
341#ifdef HAVE_INET_ATON
342#define USE_INET_ATON_WEAKLINK
343#endif
344
Jack Jansen84262fb2002-07-02 14:40:42 +0000345#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000347/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000349/* avoid clashes with the C library definition of the symbol. */
350#define getaddrinfo fake_getaddrinfo
351#define gai_strerror fake_gai_strerror
352#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getaddrinfo.c"
354#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000356#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000357#include "getnameinfo.c"
358#endif
359
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000360#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000361#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000362#endif
363
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000365#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000366#define EAFNOSUPPORT WSAEAFNOSUPPORT
367#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000368#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000369
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000370#ifndef SOCKETCLOSE
371#define SOCKETCLOSE close
372#endif
373
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000374#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000375#define USE_BLUETOOTH 1
376#if defined(__FreeBSD__)
377#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
378#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000379#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define SOL_HCI SOL_HCI_RAW
381#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000382#define sockaddr_l2 sockaddr_l2cap
383#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000384#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000385#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
386#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000388#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000389#define sockaddr_l2 sockaddr_bt
390#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000391#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000392#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000393#define SOL_HCI BTPROTO_HCI
394#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000395#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
396#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000397#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000398#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000400#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
401#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000402#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000403#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
404#endif
405#endif
406
Charles-François Natali8b759652011-12-23 16:44:51 +0100407/* Convert "sock_addr_t *" to "struct sockaddr *". */
408#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000409
Martin v. Löwise9416172003-05-03 10:12:45 +0000410/*
411 * Constants for getnameinfo()
412 */
413#if !defined(NI_MAXHOST)
414#define NI_MAXHOST 1025
415#endif
416#if !defined(NI_MAXSERV)
417#define NI_MAXSERV 32
418#endif
419
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000420#ifndef INVALID_SOCKET /* MS defines this */
421#define INVALID_SOCKET (-1)
422#endif
423
Charles-François Natali0cc86852013-09-13 19:53:08 +0200424#ifndef INADDR_NONE
425#define INADDR_NONE (-1)
426#endif
427
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000428/* XXX There's a problem here: *static* functions are not supposed to have
429 a Py prefix (or use CapitalizedWords). Later... */
430
Guido van Rossum30a685f1991-06-27 15:51:29 +0000431/* Global variable holding the exception type for errors detected
432 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433static PyObject *socket_herror;
434static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000435static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436
Tim Peters643a7fc2002-02-17 04:13:21 +0000437/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438 The sock_type variable contains pointers to various functions,
439 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000440 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000441static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000442
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000443#if defined(HAVE_POLL_H)
444#include <poll.h>
445#elif defined(HAVE_SYS_POLL_H)
446#include <sys/poll.h>
447#endif
448
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000449/* Largest value to try to store in a socklen_t (used when handling
450 ancillary data). POSIX requires socklen_t to hold at least
451 (2**31)-1 and recommends against storing larger values, but
452 socklen_t was originally int in the BSD interface, so to be on the
453 safe side we use the smaller of (2**31)-1 and INT_MAX. */
454#if INT_MAX > 0x7fffffff
455#define SOCKLEN_T_LIMIT 0x7fffffff
456#else
457#define SOCKLEN_T_LIMIT INT_MAX
458#endif
459
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200460#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461/* Instead of select(), we'll use poll() since poll() works on any fd. */
462#define IS_SELECTABLE(s) 1
463/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200465/* If there's no timeout left, we don't have to call select, so it's a safe,
466 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100467#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000469
470static PyObject*
471select_error(void)
472{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200473 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000475}
476
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000478#ifndef WSAEAGAIN
479#define WSAEAGAIN WSAEWOULDBLOCK
480#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000481#define CHECK_ERRNO(expected) \
482 (WSAGetLastError() == WSA ## expected)
483#else
484#define CHECK_ERRNO(expected) \
485 (errno == expected)
486#endif
487
Victor Stinnerdaf45552013-08-28 00:53:59 +0200488#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200489# define GET_SOCK_ERROR WSAGetLastError()
490# define SET_SOCK_ERROR(err) WSASetLastError(err)
491# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
492# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300493# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200494#else
495# define GET_SOCK_ERROR errno
496# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
497# define SOCK_TIMEOUT_ERR EWOULDBLOCK
498# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300499# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200500#endif
501
502
503#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200504/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
505static int support_wsa_no_inherit = -1;
506#endif
507
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508/* Convenience function to raise an error according to errno
509 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000514#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 int err_no = WSAGetLastError();
516 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
517 recognizes the error codes used by both GetLastError() and
518 WSAGetLastError */
519 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200520 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000521#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000522
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200523 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524}
525
Guido van Rossum30a685f1991-06-27 15:51:29 +0000526
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531
532#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000534#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (v != NULL) {
538 PyErr_SetObject(socket_herror, v);
539 Py_DECREF(v);
540 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543}
544
545
546static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000547set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Martin v. Löwis272cb402002-03-01 08:31:07 +0000551#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* EAI_SYSTEM is not available on Windows XP. */
553 if (error == EAI_SYSTEM)
554 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000555#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000557#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 if (v != NULL) {
563 PyErr_SetObject(socket_gaierror, v);
564 Py_DECREF(v);
565 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568}
569
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000570/* Function to perform the setting of socket blocking mode
571 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000572static int
573internal_setblocking(PySocketSockObject *s, int block)
574{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400575 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200576#ifdef MS_WINDOWS
577 u_long arg;
578#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100579#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100580 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100581 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100586#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200588 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400589 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100590#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200592 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400593 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100595 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 else
Victor Stinner9a954832013-12-04 00:41:24 +0100597 new_delay_flag = delay_flag | O_NONBLOCK;
598 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200599 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400600 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100601#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200603 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200604 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400605 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400607
608 result = 0;
609
610 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000612
Yury Selivanovfa22b292016-10-18 16:03:52 -0400613 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200614#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400615 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200616#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400617 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200618#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400619 }
620
621 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622}
623
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000624static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200625internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
626 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100629#ifdef HAVE_POLL
630 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200631 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100632#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200633 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200634 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100635#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000636
Victor Stinnerb7df3142015-03-27 22:59:32 +0100637 /* must be called with the GIL held */
638 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100639
Victor Stinner416f2e62015-03-31 13:56:29 +0200640 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200641 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200644 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* Prefer poll, if available, since you can poll() any fd
648 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000649#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100650 pollfd.fd = s->sock_fd;
651 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200652 if (connect) {
653 /* On Windows, the socket becomes writable on connection success,
654 but a connection failure is notified as an error. On POSIX, the
655 socket becomes writable on connection success or on connection
656 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200657 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200658 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659
Victor Stinner71694d52015-03-28 01:18:54 +0100660 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200661 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200662 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000663
Victor Stinner71694d52015-03-28 01:18:54 +0100664 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200665 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100666 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667#else
Victor Stinnerced11742015-04-09 10:27:25 +0200668 if (interval >= 0) {
669 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
670 tvp = &tv;
671 }
672 else
673 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674
Victor Stinner71694d52015-03-28 01:18:54 +0100675 FD_ZERO(&fds);
676 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200677 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200678 if (connect) {
679 /* On Windows, the socket becomes writable on connection success,
680 but a connection failure is notified as an error. On POSIX, the
681 socket becomes writable on connection success or on connection
682 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200684 }
Victor Stinner71694d52015-03-28 01:18:54 +0100685
686 /* See if the socket is ready */
687 Py_BEGIN_ALLOW_THREADS;
688 if (writing)
689 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200690 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100691 else
692 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200693 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100694 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000695#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (n < 0)
698 return -1;
699 if (n == 0)
700 return 1;
701 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702}
703
Victor Stinner31bf2d52015-04-01 21:57:09 +0200704/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000705
Victor Stinner81c41db2015-04-02 11:50:57 +0200706 On error, raise an exception and return -1 if err is set, or fill err and
707 return -1 otherwise. If a signal was received and the signal handler raised
708 an exception, return -1, and set err to -1 if err is set.
709
710 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100711
Victor Stinner31bf2d52015-04-01 21:57:09 +0200712 If the socket has a timeout, wait until the socket is ready before calling
713 the function: wait until the socket is writable if writing is nonzero, wait
714 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100715
Victor Stinner81c41db2015-04-02 11:50:57 +0200716 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200717 the function, except if the signal handler raised an exception (PEP 475).
718
719 When the function is retried, recompute the timeout using a monotonic clock.
720
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 sock_call_ex() must be called with the GIL held. The socket function is
722 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200723static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200724sock_call_ex(PySocketSockObject *s,
725 int writing,
726 int (*sock_func) (PySocketSockObject *s, void *data),
727 void *data,
728 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200729 int *err,
730 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200731{
Victor Stinner8912d142015-04-06 23:16:34 +0200732 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200733 _PyTime_t deadline = 0;
734 int deadline_initialized = 0;
735 int res;
736
737 /* sock_call() must be called with the GIL held. */
738 assert(PyGILState_Check());
739
740 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200741 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200742 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200743 /* For connect(), poll even for blocking socket. The connection
744 runs asynchronously. */
745 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200746 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200747 _PyTime_t interval;
748
Victor Stinner81c41db2015-04-02 11:50:57 +0200749 if (deadline_initialized) {
750 /* recompute the timeout */
751 interval = deadline - _PyTime_GetMonotonicClock();
752 }
753 else {
754 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200755 deadline = _PyTime_GetMonotonicClock() + timeout;
756 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200758
Victor Stinner10550cd2015-04-03 13:22:27 +0200759 if (interval >= 0)
760 res = internal_select(s, writing, interval, connect);
761 else
762 res = 1;
763 }
764 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200765 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200766 }
767
Victor Stinner31bf2d52015-04-01 21:57:09 +0200768 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 if (err)
770 *err = GET_SOCK_ERROR;
771
Victor Stinner31bf2d52015-04-01 21:57:09 +0200772 if (CHECK_ERRNO(EINTR)) {
773 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (PyErr_CheckSignals()) {
775 if (err)
776 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200777 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200778 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200779
780 /* retry select() */
781 continue;
782 }
783
784 /* select() failed */
785 s->errorhandler();
786 return -1;
787 }
788
789 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 if (err)
791 *err = SOCK_TIMEOUT_ERR;
792 else
793 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200794 return -1;
795 }
796
797 /* the socket is ready */
798 }
799
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 /* inner loop to retry sock_func() when sock_func() is interrupted
801 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200802 while (1) {
803 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200804 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 Py_END_ALLOW_THREADS
806
807 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200808 /* sock_func() succeeded */
809 if (err)
810 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811 return 0;
812 }
813
Victor Stinner81c41db2015-04-02 11:50:57 +0200814 if (err)
815 *err = GET_SOCK_ERROR;
816
Victor Stinner31bf2d52015-04-01 21:57:09 +0200817 if (!CHECK_ERRNO(EINTR))
818 break;
819
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 /* sock_func() was interrupted by a signal */
821 if (PyErr_CheckSignals()) {
822 if (err)
823 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200824 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826
Victor Stinner81c41db2015-04-02 11:50:57 +0200827 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828 }
829
830 if (s->sock_timeout > 0
831 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833
834 For example, select() could indicate a socket is ready for
835 reading, but the data then discarded by the OS because of a
836 wrong checksum.
837
838 Loop on select() to recheck for socket readyness. */
839 continue;
840 }
841
Victor Stinner81c41db2015-04-02 11:50:57 +0200842 /* sock_func() failed */
843 if (!err)
844 s->errorhandler();
845 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000846 return -1;
847 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000849
Victor Stinner81c41db2015-04-02 11:50:57 +0200850static int
851sock_call(PySocketSockObject *s,
852 int writing,
853 int (*func) (PySocketSockObject *s, void *data),
854 void *data)
855{
Victor Stinner8912d142015-04-06 23:16:34 +0200856 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200857}
858
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000859
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000860/* Initialize a new socket object. */
861
Victor Stinner88ed6402015-04-09 10:23:12 +0200862/* Default timeout for new sockets */
863static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000864
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200865static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000866init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 s->sock_fd = fd;
870 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500873
874 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
875 on some OSes as part of socket.type. We want to reset them here,
876 to make socket.type be set to the same value on all platforms.
877 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
878 not portable.
879 */
880#ifdef SOCK_NONBLOCK
881 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
882#endif
883#ifdef SOCK_CLOEXEC
884 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
885#endif
886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000890#ifdef SOCK_NONBLOCK
891 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100892 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000893 else
894#endif
895 {
896 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200897 if (defaulttimeout >= 0) {
898 if (internal_setblocking(s, 0) == -1) {
899 return -1;
900 }
901 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000902 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200903 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000904}
905
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907/* Create a new socket object.
908 This just creates the object and initializes it.
909 If the creation fails, return NULL and set an exception (implicit
910 in NEWOBJ()). */
911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000913new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PySocketSockObject *s;
916 s = (PySocketSockObject *)
917 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200918 if (s == NULL)
919 return NULL;
920 if (init_sockobject(s, fd, family, type, proto) == -1) {
921 Py_DECREF(s);
922 return NULL;
923 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925}
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927
Guido van Rossum48a680c2001-03-02 06:34:14 +0000928/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000929 thread to be in gethostbyname or getaddrinfo */
930#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200931static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000932#endif
933
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935/* Convert a string specifying a host name or one of a few symbolic
936 names to a numeric IP address. This usually calls gethostbyname()
937 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000938 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939 an error occurred; then an exception is raised. */
940
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200942setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 struct addrinfo hints, *res;
945 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
948 if (name[0] == '\0') {
949 int siz;
950 memset(&hints, 0, sizeof(hints));
951 hints.ai_family = af;
952 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
953 hints.ai_flags = AI_PASSIVE;
954 Py_BEGIN_ALLOW_THREADS
955 ACQUIRE_GETADDRINFO_LOCK
956 error = getaddrinfo(NULL, "0", &hints, &res);
957 Py_END_ALLOW_THREADS
958 /* We assume that those thread-unsafe getaddrinfo() versions
959 *are* safe regarding their return value, ie. that a
960 subsequent call to getaddrinfo() does not destroy the
961 outcome of the first call. */
962 RELEASE_GETADDRINFO_LOCK
963 if (error) {
964 set_gaierror(error);
965 return -1;
966 }
967 switch (res->ai_family) {
968 case AF_INET:
969 siz = 4;
970 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000971#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case AF_INET6:
973 siz = 16;
974 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 default:
977 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200978 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 "unsupported address family");
980 return -1;
981 }
982 if (res->ai_next) {
983 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200984 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 "wildcard resolved to multiple address");
986 return -1;
987 }
988 if (res->ai_addrlen < addr_ret_size)
989 addr_ret_size = res->ai_addrlen;
990 memcpy(addr_ret, res->ai_addr, addr_ret_size);
991 freeaddrinfo(res);
992 return siz;
993 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200994 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100995 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200996 if (strcmp(name, "255.255.255.255") == 0 ||
997 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 struct sockaddr_in *sin;
999 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001000 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 "address family mismatched");
1002 return -1;
1003 }
1004 sin = (struct sockaddr_in *)addr_ret;
1005 memset((void *) sin, '\0', sizeof(*sin));
1006 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001007#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 sin->sin_addr.s_addr = INADDR_BROADCAST;
1011 return sizeof(sin->sin_addr);
1012 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001013
1014 /* avoid a name resolution in case of numeric address */
1015#ifdef HAVE_INET_PTON
1016 /* check for an IPv4 address */
1017 if (af == AF_UNSPEC || af == AF_INET) {
1018 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1019 memset(sin, 0, sizeof(*sin));
1020 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1021 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001022#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001023 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001024#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001025 return 4;
1026 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001028#ifdef ENABLE_IPV6
1029 /* check for an IPv6 address - if the address contains a scope ID, we
1030 * fallback to getaddrinfo(), which can handle translation from interface
1031 * name to interface index */
1032 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1033 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1034 memset(sin, 0, sizeof(*sin));
1035 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1036 sin->sin6_family = AF_INET6;
1037#ifdef HAVE_SOCKADDR_SA_LEN
1038 sin->sin6_len = sizeof(*sin);
1039#endif
1040 return 16;
1041 }
1042 }
1043#endif /* ENABLE_IPV6 */
1044#else /* HAVE_INET_PTON */
1045 /* check for an IPv4 address */
1046 if (af == AF_INET || af == AF_UNSPEC) {
1047 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1048 memset(sin, 0, sizeof(*sin));
1049 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1050 sin->sin_family = AF_INET;
1051#ifdef HAVE_SOCKADDR_SA_LEN
1052 sin->sin_len = sizeof(*sin);
1053#endif
1054 return 4;
1055 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001056 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001057#endif /* HAVE_INET_PTON */
1058
1059 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 memset(&hints, 0, sizeof(hints));
1061 hints.ai_family = af;
1062 Py_BEGIN_ALLOW_THREADS
1063 ACQUIRE_GETADDRINFO_LOCK
1064 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001065#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 if (error == EAI_NONAME && af == AF_UNSPEC) {
1067 /* On Tru64 V5.1, numeric-to-addr conversion fails
1068 if no address family is given. Assume IPv4 for now.*/
1069 hints.ai_family = AF_INET;
1070 error = getaddrinfo(name, NULL, &hints, &res);
1071 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 Py_END_ALLOW_THREADS
1074 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1075 if (error) {
1076 set_gaierror(error);
1077 return -1;
1078 }
1079 if (res->ai_addrlen < addr_ret_size)
1080 addr_ret_size = res->ai_addrlen;
1081 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1082 freeaddrinfo(res);
1083 switch (addr_ret->sa_family) {
1084 case AF_INET:
1085 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001086#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 case AF_INET6:
1088 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001091 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 return -1;
1093 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001094}
1095
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001097/* Create a string object representing an IP address.
1098 This is always a string of the form 'dd.dd.dd.dd' (with variable
1099 size numbers). */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100
Guido van Rossum73624e91994-10-10 17:59:00 +00001101static PyObject *
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001102makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103{
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001104 char buf[NI_MAXHOST];
1105 int error;
1106
1107 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1108 NI_NUMERICHOST);
1109 if (error) {
1110 set_gaierror(error);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 return NULL;
1112 }
1113 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114}
1115
1116
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117#ifdef USE_BLUETOOTH
1118/* Convert a string representation of a Bluetooth address into a numeric
1119 address. Returns the length (6), or raises an exception and returns -1 if
1120 an error occurred. */
1121
1122static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001123setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 unsigned int b0, b1, b2, b3, b4, b5;
1126 char ch;
1127 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1130 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1131 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1132 bdaddr->b[0] = b0;
1133 bdaddr->b[1] = b1;
1134 bdaddr->b[2] = b2;
1135 bdaddr->b[3] = b3;
1136 bdaddr->b[4] = b4;
1137 bdaddr->b[5] = b5;
1138 return 6;
1139 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001140 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 return -1;
1142 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001143}
1144
1145/* Create a string representation of the Bluetooth address. This is always a
1146 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1147 value (zero padded if necessary). */
1148
1149static PyObject *
1150makebdaddr(bdaddr_t *bdaddr)
1151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1155 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1156 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1157 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158}
1159#endif
1160
1161
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162/* Create an object representing the given socket address,
1163 suitable for passing it back to bind(), connect() etc.
1164 The family field of the sockaddr structure is inspected
1165 to determine what kind of address it really is. */
1166
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001168static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001169makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 if (addrlen == 0) {
1172 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001173 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 case AF_INET:
1179 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001180 struct sockaddr_in *a;
1181 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyObject *ret = NULL;
1183 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001184 a = (struct sockaddr_in *)addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1186 Py_DECREF(addrobj);
1187 }
1188 return ret;
1189 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001191#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 case AF_UNIX:
1193 {
1194 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001195#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001196 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1197 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1198 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 }
1200 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001201#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 {
1203 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001204 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 }
1206 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001207#endif /* AF_UNIX */
1208
Martin v. Löwis11017b12006-01-14 18:12:57 +00001209#if defined(AF_NETLINK)
1210 case AF_NETLINK:
1211 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1213 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001214 }
1215#endif /* AF_NETLINK */
1216
caaveryeffc12f2017-09-06 18:18:10 -04001217#if defined(AF_VSOCK)
1218 case AF_VSOCK:
1219 {
1220 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1221 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1222 }
1223#endif /* AF_VSOCK */
1224
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001225#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 case AF_INET6:
1227 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001228 struct sockaddr_in6 *a;
1229 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 PyObject *ret = NULL;
1231 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001232 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001233 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 addrobj,
1235 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001236 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 a->sin6_scope_id);
1238 Py_DECREF(addrobj);
1239 }
1240 return ret;
1241 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001242#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001244#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 case AF_BLUETOOTH:
1246 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 case BTPROTO_L2CAP:
1249 {
1250 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1251 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1252 PyObject *ret = NULL;
1253 if (addrobj) {
1254 ret = Py_BuildValue("Oi",
1255 addrobj,
1256 _BT_L2_MEMB(a, psm));
1257 Py_DECREF(addrobj);
1258 }
1259 return ret;
1260 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 case BTPROTO_RFCOMM:
1263 {
1264 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1265 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1266 PyObject *ret = NULL;
1267 if (addrobj) {
1268 ret = Py_BuildValue("Oi",
1269 addrobj,
1270 _BT_RC_MEMB(a, channel));
1271 Py_DECREF(addrobj);
1272 }
1273 return ret;
1274 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 case BTPROTO_HCI:
1277 {
1278 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001279#if defined(__NetBSD__) || defined(__DragonFly__)
1280 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001281#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 PyObject *ret = NULL;
1283 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1284 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001285#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001287
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001288#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 case BTPROTO_SCO:
1290 {
1291 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1292 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1293 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001294#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 default:
1297 PyErr_SetString(PyExc_ValueError,
1298 "Unknown Bluetooth protocol");
1299 return NULL;
1300 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001301#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302
Antoine Pitroub156a462010-10-27 20:13:57 +00001303#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 case AF_PACKET:
1305 {
1306 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001307 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 struct ifreq ifr;
1309 /* need to look up interface name give index */
1310 if (a->sll_ifindex) {
1311 ifr.ifr_ifindex = a->sll_ifindex;
1312 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1313 ifname = ifr.ifr_name;
1314 }
1315 return Py_BuildValue("shbhy#",
1316 ifname,
1317 ntohs(a->sll_protocol),
1318 a->sll_pkttype,
1319 a->sll_hatype,
1320 a->sll_addr,
1321 a->sll_halen);
1322 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001323#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001324
Christian Heimes043d6f62008-01-07 17:19:16 +00001325#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 case AF_TIPC:
1327 {
1328 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1329 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1330 return Py_BuildValue("IIIII",
1331 a->addrtype,
1332 a->addr.nameseq.type,
1333 a->addr.nameseq.lower,
1334 a->addr.nameseq.upper,
1335 a->scope);
1336 } else if (a->addrtype == TIPC_ADDR_NAME) {
1337 return Py_BuildValue("IIIII",
1338 a->addrtype,
1339 a->addr.name.name.type,
1340 a->addr.name.name.instance,
1341 a->addr.name.name.instance,
1342 a->scope);
1343 } else if (a->addrtype == TIPC_ADDR_ID) {
1344 return Py_BuildValue("IIIII",
1345 a->addrtype,
1346 a->addr.id.node,
1347 a->addr.id.ref,
1348 0,
1349 a->scope);
1350 } else {
1351 PyErr_SetString(PyExc_ValueError,
1352 "Invalid address type");
1353 return NULL;
1354 }
1355 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001356#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001357
Serhiy Storchakad3187152017-11-09 18:00:38 +02001358#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001359 case AF_CAN:
1360 {
1361 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001362 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001363 struct ifreq ifr;
1364 /* need to look up interface name given index */
1365 if (a->can_ifindex) {
1366 ifr.ifr_ifindex = a->can_ifindex;
1367 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1368 ifname = ifr.ifr_name;
1369 }
1370
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001371 switch (proto) {
1372#ifdef CAN_ISOTP
1373 case CAN_ISOTP:
1374 {
1375 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1376 ifname,
1377 a->can_addr.tp.rx_id,
1378 a->can_addr.tp.tx_id);
1379 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001380#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001381 default:
1382 {
1383 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1384 ifname);
1385 }
1386 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001387 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001388#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001389
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001390#ifdef PF_SYSTEM
1391 case PF_SYSTEM:
1392 switch(proto) {
1393#ifdef SYSPROTO_CONTROL
1394 case SYSPROTO_CONTROL:
1395 {
1396 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1397 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1398 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001399#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001400 default:
1401 PyErr_SetString(PyExc_ValueError,
1402 "Invalid address type");
1403 return 0;
1404 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001405#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001406
Christian Heimesdffa3942016-09-05 23:54:41 +02001407#ifdef HAVE_SOCKADDR_ALG
1408 case AF_ALG:
1409 {
1410 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1411 return Py_BuildValue("s#s#HH",
1412 a->salg_type,
1413 strnlen((const char*)a->salg_type,
1414 sizeof(a->salg_type)),
1415 a->salg_name,
1416 strnlen((const char*)a->salg_name,
1417 sizeof(a->salg_name)),
1418 a->salg_feat,
1419 a->salg_mask);
1420 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001421#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 default:
1426 /* If we don't know the address family, don't raise an
1427 exception -- return it as an (int, bytes) tuple. */
1428 return Py_BuildValue("iy#",
1429 addr->sa_family,
1430 addr->sa_data,
1431 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001434}
1435
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001436/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1437 (in particular, numeric IP addresses). */
1438struct maybe_idna {
1439 PyObject *obj;
1440 char *buf;
1441};
1442
1443static void
1444idna_cleanup(struct maybe_idna *data)
1445{
1446 Py_CLEAR(data->obj);
1447}
1448
1449static int
1450idna_converter(PyObject *obj, struct maybe_idna *data)
1451{
1452 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001453 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001454 if (obj == NULL) {
1455 idna_cleanup(data);
1456 return 1;
1457 }
1458 data->obj = NULL;
1459 len = -1;
1460 if (PyBytes_Check(obj)) {
1461 data->buf = PyBytes_AsString(obj);
1462 len = PyBytes_Size(obj);
1463 }
1464 else if (PyByteArray_Check(obj)) {
1465 data->buf = PyByteArray_AsString(obj);
1466 len = PyByteArray_Size(obj);
1467 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001468 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001469 if (PyUnicode_READY(obj) == -1) {
1470 return 0;
1471 }
1472 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001473 data->buf = PyUnicode_DATA(obj);
1474 len = PyUnicode_GET_LENGTH(obj);
1475 }
1476 else {
1477 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1478 if (!obj2) {
1479 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1480 return 0;
1481 }
1482 assert(PyBytes_Check(obj2));
1483 data->obj = obj2;
1484 data->buf = PyBytes_AS_STRING(obj2);
1485 len = PyBytes_GET_SIZE(obj2);
1486 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001487 }
1488 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001489 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1490 obj->ob_type->tp_name);
1491 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001492 }
1493 if (strlen(data->buf) != len) {
1494 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001495 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001496 return 0;
1497 }
1498 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001499}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001500
1501/* Parse a socket address argument according to the socket object's
1502 address family. Return 1 if the address was in the proper format,
1503 0 of not. The address is returned through addr_ret, its length
1504 through len_ret. */
1505
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001506static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001511
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001512#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 case AF_UNIX:
1514 {
1515 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001516 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001517 int retval = 0;
1518
1519 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1520 allow embedded nulls on Linux. */
1521 if (PyUnicode_Check(args)) {
1522 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1523 return 0;
1524 }
1525 else
1526 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001527 if (!PyArg_Parse(args, "y*", &path)) {
1528 Py_DECREF(args);
1529 return retval;
1530 }
1531 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001534#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001537 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001538 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001540 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 }
1542 }
1543 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001544#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 {
1546 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001547 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001548 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001550 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 }
1554 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001555 memcpy(addr->sun_path, path.buf, path.len);
1556 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001557 retval = 1;
1558 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001559 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001560 Py_DECREF(args);
1561 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001563#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564
Martin v. Löwis11017b12006-01-14 18:12:57 +00001565#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 case AF_NETLINK:
1567 {
1568 struct sockaddr_nl* addr;
1569 int pid, groups;
1570 addr = (struct sockaddr_nl *)addr_ret;
1571 if (!PyTuple_Check(args)) {
1572 PyErr_Format(
1573 PyExc_TypeError,
1574 "getsockaddrarg: "
1575 "AF_NETLINK address must be tuple, not %.500s",
1576 Py_TYPE(args)->tp_name);
1577 return 0;
1578 }
1579 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1580 return 0;
1581 addr->nl_family = AF_NETLINK;
1582 addr->nl_pid = pid;
1583 addr->nl_groups = groups;
1584 *len_ret = sizeof(*addr);
1585 return 1;
1586 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001587#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001588
caaveryeffc12f2017-09-06 18:18:10 -04001589#if defined(AF_VSOCK)
1590 case AF_VSOCK:
1591 {
1592 struct sockaddr_vm* addr;
1593 int port, cid;
1594 addr = (struct sockaddr_vm *)addr_ret;
1595 memset(addr, 0, sizeof(struct sockaddr_vm));
1596 if (!PyTuple_Check(args)) {
1597 PyErr_Format(
1598 PyExc_TypeError,
1599 "getsockaddrarg: "
1600 "AF_VSOCK address must be tuple, not %.500s",
1601 Py_TYPE(args)->tp_name);
1602 return 0;
1603 }
1604 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1605 return 0;
1606 addr->svm_family = s->sock_family;
1607 addr->svm_port = port;
1608 addr->svm_cid = cid;
1609 *len_ret = sizeof(*addr);
1610 return 1;
1611 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001612#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001613
1614
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001615#ifdef AF_RDS
1616 case AF_RDS:
1617 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001618#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 case AF_INET:
1621 {
1622 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 int port, result;
1625 if (!PyTuple_Check(args)) {
1626 PyErr_Format(
1627 PyExc_TypeError,
1628 "getsockaddrarg: "
1629 "AF_INET address must be tuple, not %.500s",
1630 Py_TYPE(args)->tp_name);
1631 return 0;
1632 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001633 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1634 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 return 0;
1636 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 if (result < 0)
1641 return 0;
1642 if (port < 0 || port > 0xffff) {
1643 PyErr_SetString(
1644 PyExc_OverflowError,
1645 "getsockaddrarg: port must be 0-65535.");
1646 return 0;
1647 }
1648 addr->sin_family = AF_INET;
1649 addr->sin_port = htons((short)port);
1650 *len_ret = sizeof *addr;
1651 return 1;
1652 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001654#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 case AF_INET6:
1656 {
1657 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001658 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001659 int port, result;
1660 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 flowinfo = scope_id = 0;
1662 if (!PyTuple_Check(args)) {
1663 PyErr_Format(
1664 PyExc_TypeError,
1665 "getsockaddrarg: "
1666 "AF_INET6 address must be tuple, not %.500s",
1667 Py_TYPE(args)->tp_name);
1668 return 0;
1669 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001670 if (!PyArg_ParseTuple(args, "O&i|II",
1671 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 &scope_id)) {
1673 return 0;
1674 }
1675 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001676 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001678 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 if (result < 0)
1680 return 0;
1681 if (port < 0 || port > 0xffff) {
1682 PyErr_SetString(
1683 PyExc_OverflowError,
1684 "getsockaddrarg: port must be 0-65535.");
1685 return 0;
1686 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001687 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001688 PyErr_SetString(
1689 PyExc_OverflowError,
1690 "getsockaddrarg: flowinfo must be 0-1048575.");
1691 return 0;
1692 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 addr->sin6_family = s->sock_family;
1694 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001695 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 addr->sin6_scope_id = scope_id;
1697 *len_ret = sizeof *addr;
1698 return 1;
1699 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001700#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001701
Hye-Shik Chang81268602004-02-02 06:05:24 +00001702#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 case AF_BLUETOOTH:
1704 {
1705 switch (s->sock_proto) {
1706 case BTPROTO_L2CAP:
1707 {
1708 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001709 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 addr = (struct sockaddr_l2 *)addr_ret;
1712 memset(addr, 0, sizeof(struct sockaddr_l2));
1713 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1714 if (!PyArg_ParseTuple(args, "si", &straddr,
1715 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001716 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 "wrong format");
1718 return 0;
1719 }
1720 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1721 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 *len_ret = sizeof *addr;
1724 return 1;
1725 }
1726 case BTPROTO_RFCOMM:
1727 {
1728 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001729 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 addr = (struct sockaddr_rc *)addr_ret;
1732 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1733 if (!PyArg_ParseTuple(args, "si", &straddr,
1734 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001735 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 "wrong format");
1737 return 0;
1738 }
1739 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1740 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 *len_ret = sizeof *addr;
1743 return 1;
1744 }
1745 case BTPROTO_HCI:
1746 {
1747 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001748#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001749 const char *straddr;
1750 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1751 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001752 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001753 "wrong format");
1754 return 0;
1755 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001756 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001757 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1758 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001759#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1761 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001762 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 "wrong format");
1764 return 0;
1765 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001766#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 *len_ret = sizeof *addr;
1768 return 1;
1769 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001770#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 case BTPROTO_SCO:
1772 {
1773 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001774 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 addr = (struct sockaddr_sco *)addr_ret;
1777 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1778 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001779 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 "wrong format");
1781 return 0;
1782 }
1783 straddr = PyBytes_AS_STRING(args);
1784 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1785 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 *len_ret = sizeof *addr;
1788 return 1;
1789 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001790#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001792 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 return 0;
1794 }
1795 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001796#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001797
Antoine Pitroub156a462010-10-27 20:13:57 +00001798#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 case AF_PACKET:
1800 {
1801 struct sockaddr_ll* addr;
1802 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001803 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 int protoNumber;
1805 int hatype = 0;
1806 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001807 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (!PyTuple_Check(args)) {
1810 PyErr_Format(
1811 PyExc_TypeError,
1812 "getsockaddrarg: "
1813 "AF_PACKET address must be tuple, not %.500s",
1814 Py_TYPE(args)->tp_name);
1815 return 0;
1816 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001817 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001819 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return 0;
1821 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1822 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1823 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1824 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001825 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 return 0;
1827 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 if (haddr.buf && haddr.len > 8) {
1829 PyErr_SetString(PyExc_ValueError,
1830 "Hardware address must be 8 bytes or less");
1831 PyBuffer_Release(&haddr);
1832 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 }
1834 if (protoNumber < 0 || protoNumber > 0xffff) {
1835 PyErr_SetString(
1836 PyExc_OverflowError,
1837 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001838 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return 0;
1840 }
1841 addr = (struct sockaddr_ll*)addr_ret;
1842 addr->sll_family = AF_PACKET;
1843 addr->sll_protocol = htons((short)protoNumber);
1844 addr->sll_ifindex = ifr.ifr_ifindex;
1845 addr->sll_pkttype = pkttype;
1846 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001847 if (haddr.buf) {
1848 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1849 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001851 else
1852 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001854 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 return 1;
1856 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001857#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001858
Christian Heimes043d6f62008-01-07 17:19:16 +00001859#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 case AF_TIPC:
1861 {
1862 unsigned int atype, v1, v2, v3;
1863 unsigned int scope = TIPC_CLUSTER_SCOPE;
1864 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (!PyTuple_Check(args)) {
1867 PyErr_Format(
1868 PyExc_TypeError,
1869 "getsockaddrarg: "
1870 "AF_TIPC address must be tuple, not %.500s",
1871 Py_TYPE(args)->tp_name);
1872 return 0;
1873 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 if (!PyArg_ParseTuple(args,
1876 "IIII|I;Invalid TIPC address format",
1877 &atype, &v1, &v2, &v3, &scope))
1878 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 addr = (struct sockaddr_tipc *) addr_ret;
1881 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 addr->family = AF_TIPC;
1884 addr->scope = scope;
1885 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 if (atype == TIPC_ADDR_NAMESEQ) {
1888 addr->addr.nameseq.type = v1;
1889 addr->addr.nameseq.lower = v2;
1890 addr->addr.nameseq.upper = v3;
1891 } else if (atype == TIPC_ADDR_NAME) {
1892 addr->addr.name.name.type = v1;
1893 addr->addr.name.name.instance = v2;
1894 } else if (atype == TIPC_ADDR_ID) {
1895 addr->addr.id.node = v1;
1896 addr->addr.id.ref = v2;
1897 } else {
1898 /* Shouldn't happen */
1899 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1900 return 0;
1901 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 1;
1906 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001907#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001908
Serhiy Storchakad3187152017-11-09 18:00:38 +02001909#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001910 case AF_CAN:
1911 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001912#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001914 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001915#endif
1916#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001917 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001918#endif
1919#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001920 {
1921 struct sockaddr_can *addr;
1922 PyObject *interfaceName;
1923 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001925 addr = (struct sockaddr_can *)addr_ret;
1926
Charles-François Natali47413c12011-10-06 19:47:44 +02001927 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1928 &interfaceName))
1929 return 0;
1930
1931 len = PyBytes_GET_SIZE(interfaceName);
1932
1933 if (len == 0) {
1934 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001935 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001936 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1937 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001938 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1939 s->errorhandler();
1940 Py_DECREF(interfaceName);
1941 return 0;
1942 }
1943 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001944 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001945 "AF_CAN interface name too long");
1946 Py_DECREF(interfaceName);
1947 return 0;
1948 }
1949
1950 addr->can_family = AF_CAN;
1951 addr->can_ifindex = ifr.ifr_ifindex;
1952
1953 *len_ret = sizeof(*addr);
1954 Py_DECREF(interfaceName);
1955 return 1;
1956 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001957#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001958
1959#ifdef CAN_ISOTP
1960 case CAN_ISOTP:
1961 {
1962 struct sockaddr_can *addr;
1963 PyObject *interfaceName;
1964 struct ifreq ifr;
1965 Py_ssize_t len;
1966 unsigned long int rx_id, tx_id;
1967
1968 addr = (struct sockaddr_can *)addr_ret;
1969
1970 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1971 &interfaceName,
1972 &rx_id,
1973 &tx_id))
1974 return 0;
1975
1976 len = PyBytes_GET_SIZE(interfaceName);
1977
1978 if (len == 0) {
1979 ifr.ifr_ifindex = 0;
1980 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1981 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1982 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1983 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1984 s->errorhandler();
1985 Py_DECREF(interfaceName);
1986 return 0;
1987 }
1988 } else {
1989 PyErr_SetString(PyExc_OSError,
1990 "AF_CAN interface name too long");
1991 Py_DECREF(interfaceName);
1992 return 0;
1993 }
1994
1995 addr->can_family = AF_CAN;
1996 addr->can_ifindex = ifr.ifr_ifindex;
1997 addr->can_addr.tp.rx_id = rx_id;
1998 addr->can_addr.tp.tx_id = tx_id;
1999
2000 *len_ret = sizeof(*addr);
2001 Py_DECREF(interfaceName);
2002 return 1;
2003 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002004#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002005 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002006 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002007 "getsockaddrarg: unsupported CAN protocol");
2008 return 0;
2009 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002010#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002011
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002012#ifdef PF_SYSTEM
2013 case PF_SYSTEM:
2014 switch (s->sock_proto) {
2015#ifdef SYSPROTO_CONTROL
2016 case SYSPROTO_CONTROL:
2017 {
2018 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002019
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002020 addr = (struct sockaddr_ctl *)addr_ret;
2021 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002022 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002023
2024 if (PyUnicode_Check(args)) {
2025 struct ctl_info info;
2026 PyObject *ctl_name;
2027
2028 if (!PyArg_Parse(args, "O&",
2029 PyUnicode_FSConverter, &ctl_name)) {
2030 return 0;
2031 }
2032
Victor Stinnerf50e1872015-03-20 11:32:24 +01002033 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002034 PyErr_SetString(PyExc_ValueError,
2035 "provided string is too long");
2036 Py_DECREF(ctl_name);
2037 return 0;
2038 }
2039 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2040 sizeof(info.ctl_name));
2041 Py_DECREF(ctl_name);
2042
2043 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2044 PyErr_SetString(PyExc_OSError,
2045 "cannot find kernel control with provided name");
2046 return 0;
2047 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002048
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002049 addr->sc_id = info.ctl_id;
2050 addr->sc_unit = 0;
2051 } else if (!PyArg_ParseTuple(args, "II",
2052 &(addr->sc_id), &(addr->sc_unit))) {
2053 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2054 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002055
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002056 return 0;
2057 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002058
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002059 *len_ret = sizeof(*addr);
2060 return 1;
2061 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002062#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002063 default:
2064 PyErr_SetString(PyExc_OSError,
2065 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2066 return 0;
2067 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002068#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002069#ifdef HAVE_SOCKADDR_ALG
2070 case AF_ALG:
2071 {
2072 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002073 const char *type;
2074 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002075 sa = (struct sockaddr_alg *)addr_ret;
2076
2077 memset(sa, 0, sizeof(*sa));
2078 sa->salg_family = AF_ALG;
2079
2080 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2081 &type, &name, &sa->salg_feat, &sa->salg_mask))
2082 return 0;
2083 /* sockaddr_alg has fixed-sized char arrays for type and name */
2084 if (strlen(type) > sizeof(sa->salg_type)) {
2085 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2086 return 0;
2087 }
2088 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2089 if (strlen(name) > sizeof(sa->salg_name)) {
2090 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2091 return 0;
2092 }
2093 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2094
2095 *len_ret = sizeof(*sa);
2096 return 1;
2097 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002098#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002103 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002107}
2108
Guido van Rossum30a685f1991-06-27 15:51:29 +00002109
Guido van Rossum48a680c2001-03-02 06:34:14 +00002110/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002111 Return 1 if the family is known, 0 otherwise. The length is returned
2112 through len_ret. */
2113
2114static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002115getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002118
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002119#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 case AF_UNIX:
2121 {
2122 *len_ret = sizeof (struct sockaddr_un);
2123 return 1;
2124 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002125#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002126
Martin v. Löwis11017b12006-01-14 18:12:57 +00002127#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002128 case AF_NETLINK:
2129 {
2130 *len_ret = sizeof (struct sockaddr_nl);
2131 return 1;
2132 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002133#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002134
caaveryeffc12f2017-09-06 18:18:10 -04002135#if defined(AF_VSOCK)
2136 case AF_VSOCK:
2137 {
2138 *len_ret = sizeof (struct sockaddr_vm);
2139 return 1;
2140 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002141#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002142
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002143#ifdef AF_RDS
2144 case AF_RDS:
2145 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002146#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 case AF_INET:
2149 {
2150 *len_ret = sizeof (struct sockaddr_in);
2151 return 1;
2152 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002153
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002154#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 case AF_INET6:
2156 {
2157 *len_ret = sizeof (struct sockaddr_in6);
2158 return 1;
2159 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002160#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002161
Hye-Shik Chang81268602004-02-02 06:05:24 +00002162#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 case AF_BLUETOOTH:
2164 {
2165 switch(s->sock_proto)
2166 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 case BTPROTO_L2CAP:
2169 *len_ret = sizeof (struct sockaddr_l2);
2170 return 1;
2171 case BTPROTO_RFCOMM:
2172 *len_ret = sizeof (struct sockaddr_rc);
2173 return 1;
2174 case BTPROTO_HCI:
2175 *len_ret = sizeof (struct sockaddr_hci);
2176 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002177#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 case BTPROTO_SCO:
2179 *len_ret = sizeof (struct sockaddr_sco);
2180 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002181#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002183 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 "unknown BT protocol");
2185 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 }
2188 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002189#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002190
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002191#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 case AF_PACKET:
2193 {
2194 *len_ret = sizeof (struct sockaddr_ll);
2195 return 1;
2196 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002197#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002198
Christian Heimes043d6f62008-01-07 17:19:16 +00002199#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 case AF_TIPC:
2201 {
2202 *len_ret = sizeof (struct sockaddr_tipc);
2203 return 1;
2204 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002205#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002206
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002207#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002208 case AF_CAN:
2209 {
2210 *len_ret = sizeof (struct sockaddr_can);
2211 return 1;
2212 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002213#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002215#ifdef PF_SYSTEM
2216 case PF_SYSTEM:
2217 switch(s->sock_proto) {
2218#ifdef SYSPROTO_CONTROL
2219 case SYSPROTO_CONTROL:
2220 *len_ret = sizeof (struct sockaddr_ctl);
2221 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002222#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002223 default:
2224 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2225 "unknown PF_SYSTEM protocol");
2226 return 0;
2227 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002228#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002229#ifdef HAVE_SOCKADDR_ALG
2230 case AF_ALG:
2231 {
2232 *len_ret = sizeof (struct sockaddr_alg);
2233 return 1;
2234 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002235#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002240 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002244}
2245
2246
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002247/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2248 Currently, these methods are only compiled if the RFC 2292/3542
2249 CMSG_LEN() macro is available. Older systems seem to have used
2250 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2251 it may be possible to define CMSG_LEN() that way if it's not
2252 provided. Some architectures might need extra padding after the
2253 cmsghdr, however, and CMSG_LEN() would have to take account of
2254 this. */
2255#ifdef CMSG_LEN
2256/* If length is in range, set *result to CMSG_LEN(length) and return
2257 true; otherwise, return false. */
2258static int
2259get_CMSG_LEN(size_t length, size_t *result)
2260{
2261 size_t tmp;
2262
2263 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2264 return 0;
2265 tmp = CMSG_LEN(length);
2266 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2267 return 0;
2268 *result = tmp;
2269 return 1;
2270}
2271
2272#ifdef CMSG_SPACE
2273/* If length is in range, set *result to CMSG_SPACE(length) and return
2274 true; otherwise, return false. */
2275static int
2276get_CMSG_SPACE(size_t length, size_t *result)
2277{
2278 size_t tmp;
2279
2280 /* Use CMSG_SPACE(1) here in order to take account of the padding
2281 necessary before *and* after the data. */
2282 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2283 return 0;
2284 tmp = CMSG_SPACE(length);
2285 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2286 return 0;
2287 *result = tmp;
2288 return 1;
2289}
2290#endif
2291
2292/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2293 pointer in msg->msg_control with at least "space" bytes after it,
2294 and its cmsg_len member inside the buffer. */
2295static int
2296cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2297{
2298 size_t cmsg_offset;
2299 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2300 sizeof(cmsgh->cmsg_len));
2301
Charles-François Natali466517d2011-08-28 18:23:43 +02002302 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002303 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002305 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2306 annoying under OS X as it's unsigned there and so it triggers a
2307 tautological comparison warning under Clang when compared against 0.
2308 Since the check is valid on other platforms, silence the warning under
2309 Clang. */
2310 #ifdef __clang__
2311 #pragma clang diagnostic push
2312 #pragma clang diagnostic ignored "-Wtautological-compare"
2313 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002314 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002315 #pragma GCC diagnostic push
2316 #pragma GCC diagnostic ignored "-Wtype-limits"
2317 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002318 if (msg->msg_controllen < 0)
2319 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002320 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002321 #pragma GCC diagnostic pop
2322 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002323 #ifdef __clang__
2324 #pragma clang diagnostic pop
2325 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002326 if (space < cmsg_len_end)
2327 space = cmsg_len_end;
2328 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2329 return (cmsg_offset <= (size_t)-1 - space &&
2330 cmsg_offset + space <= msg->msg_controllen);
2331}
2332
2333/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2334 *space to number of bytes following it in the buffer and return
2335 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2336 msg->msg_controllen are valid. */
2337static int
2338get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2339{
2340 size_t data_offset;
2341 char *data_ptr;
2342
2343 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2344 return 0;
2345 data_offset = data_ptr - (char *)msg->msg_control;
2346 if (data_offset > msg->msg_controllen)
2347 return 0;
2348 *space = msg->msg_controllen - data_offset;
2349 return 1;
2350}
2351
2352/* If cmsgh is invalid or not contained in the buffer pointed to by
2353 msg->msg_control, return -1. If cmsgh is valid and its associated
2354 data is entirely contained in the buffer, set *data_len to the
2355 length of the associated data and return 0. If only part of the
2356 associated data is contained in the buffer but cmsgh is otherwise
2357 valid, set *data_len to the length contained in the buffer and
2358 return 1. */
2359static int
2360get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2361{
2362 size_t space, cmsg_data_len;
2363
2364 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2365 cmsgh->cmsg_len < CMSG_LEN(0))
2366 return -1;
2367 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2368 if (!get_cmsg_data_space(msg, cmsgh, &space))
2369 return -1;
2370 if (space >= cmsg_data_len) {
2371 *data_len = cmsg_data_len;
2372 return 0;
2373 }
2374 *data_len = space;
2375 return 1;
2376}
2377#endif /* CMSG_LEN */
2378
2379
Victor Stinner31bf2d52015-04-01 21:57:09 +02002380struct sock_accept {
2381 socklen_t *addrlen;
2382 sock_addr_t *addrbuf;
2383 SOCKET_T result;
2384};
2385
2386#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2387/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2388static int accept4_works = -1;
2389#endif
2390
2391static int
2392sock_accept_impl(PySocketSockObject *s, void *data)
2393{
2394 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002395 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2396 socklen_t *paddrlen = ctx->addrlen;
2397#ifdef HAVE_SOCKADDR_ALG
2398 /* AF_ALG does not support accept() with addr and raises
2399 * ECONNABORTED instead. */
2400 if (s->sock_family == AF_ALG) {
2401 addr = NULL;
2402 paddrlen = NULL;
2403 *ctx->addrlen = 0;
2404 }
2405#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002406
2407#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2408 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002409 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002410 SOCK_CLOEXEC);
2411 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2412 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2413 accept4_works = (errno != ENOSYS);
2414 }
2415 }
2416 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002417 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002418#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002419 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002420#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002421
2422#ifdef MS_WINDOWS
2423 return (ctx->result != INVALID_SOCKET);
2424#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002425 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002426#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002427}
2428
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002429/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002430
Guido van Rossum73624e91994-10-10 17:59:00 +00002431static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002432sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002435 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 socklen_t addrlen;
2437 PyObject *sock = NULL;
2438 PyObject *addr = NULL;
2439 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002440 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 if (!getsockaddrlen(s, &addrlen))
2443 return NULL;
2444 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 if (!IS_SELECTABLE(s))
2447 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002448
Victor Stinner31bf2d52015-04-01 21:57:09 +02002449 ctx.addrlen = &addrlen;
2450 ctx.addrbuf = &addrbuf;
2451 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002453 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002454
Victor Stinnerdaf45552013-08-28 00:53:59 +02002455#ifdef MS_WINDOWS
2456 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2457 PyErr_SetFromWindowsErr(0);
2458 SOCKETCLOSE(newfd);
2459 goto finally;
2460 }
2461#else
2462
2463#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2464 if (!accept4_works)
2465#endif
2466 {
2467 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2468 SOCKETCLOSE(newfd);
2469 goto finally;
2470 }
2471 }
2472#endif
2473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 sock = PyLong_FromSocket_t(newfd);
2475 if (sock == NULL) {
2476 SOCKETCLOSE(newfd);
2477 goto finally;
2478 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2481 addrlen, s->sock_proto);
2482 if (addr == NULL)
2483 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002486
Guido van Rossum67f7a382002-06-06 21:08:16 +00002487finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 Py_XDECREF(sock);
2489 Py_XDECREF(addr);
2490 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002491}
2492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002494"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002495\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002496Wait for an incoming connection. Return a new socket file descriptor\n\
2497representing the connection, and the address of the client.\n\
2498For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002499
Guido van Rossum11ba0942002-06-13 15:07:44 +00002500/* s.setblocking(flag) method. Argument:
2501 False -- non-blocking mode; same as settimeout(0)
2502 True -- blocking mode; same as settimeout(None)
2503*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002504
Guido van Rossum73624e91994-10-10 17:59:00 +00002505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002506sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002507{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002508 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 block = PyLong_AsLong(arg);
2511 if (block == -1 && PyErr_Occurred())
2512 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Victor Stinner9001d802015-04-06 23:06:01 +02002514 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002515 if (internal_setblocking(s, block) == -1) {
2516 return NULL;
2517 }
2518 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002519}
Guido van Rossume4485b01994-09-07 14:32:49 +00002520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522"setblocking(flag)\n\
2523\n\
2524Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002525setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002526setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002527
Victor Stinner71694d52015-03-28 01:18:54 +01002528static int
2529socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2530{
2531#ifdef MS_WINDOWS
2532 struct timeval tv;
2533#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002534#ifndef HAVE_POLL
2535 _PyTime_t ms;
2536#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002537 int overflow = 0;
2538
2539 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002540 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002541 return 0;
2542 }
2543
Victor Stinner869e1772015-03-30 03:49:14 +02002544 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002545 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002546 return -1;
2547
2548 if (*timeout < 0) {
2549 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2550 return -1;
2551 }
2552
2553#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002554 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002555#endif
2556#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002557 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002558 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002559#endif
2560 if (overflow) {
2561 PyErr_SetString(PyExc_OverflowError,
2562 "timeout doesn't fit into C timeval");
2563 return -1;
2564 }
2565
2566 return 0;
2567}
2568
Guido van Rossum11ba0942002-06-13 15:07:44 +00002569/* s.settimeout(timeout) method. Argument:
2570 None -- no timeout, blocking mode; same as setblocking(True)
2571 0.0 -- non-blocking mode; same as setblocking(False)
2572 > 0 -- timeout mode; operations time out after timeout seconds
2573 < 0 -- illegal; raises an exception
2574*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002576sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577{
Victor Stinner71694d52015-03-28 01:18:54 +01002578 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579
Victor Stinner71694d52015-03-28 01:18:54 +01002580 if (socket_parse_timeout(&timeout, arg) < 0)
2581 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002584 if (internal_setblocking(s, timeout < 0) == -1) {
2585 return NULL;
2586 }
2587 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002588}
2589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002590PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002591"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002592\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002593Set a timeout on socket operations. 'timeout' can be a float,\n\
2594giving in seconds, or None. Setting a timeout of None disables\n\
2595the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002596Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002598/* s.gettimeout() method.
2599 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002600static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002601sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002602{
Victor Stinner71694d52015-03-28 01:18:54 +01002603 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002604 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 }
Victor Stinner71694d52015-03-28 01:18:54 +01002606 else {
2607 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2608 return PyFloat_FromDouble(seconds);
2609 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002610}
2611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002613"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002614\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002615Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002616operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002617operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002618
Guido van Rossumaee08791992-09-08 09:05:33 +00002619/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002620 With an integer third argument, sets an integer optval with optlen=4.
2621 With None as third argument and an integer fourth argument, set
2622 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002623 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002624 use optional built-in module 'struct' to encode the string.
2625*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002626
Guido van Rossum73624e91994-10-10 17:59:00 +00002627static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002628sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 int level;
2631 int optname;
2632 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002633 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002635 unsigned int optlen;
2636 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002637
caaveryeffc12f2017-09-06 18:18:10 -04002638#ifdef AF_VSOCK
2639 if (s->sock_family == AF_VSOCK) {
2640 uint64_t vflag; // Must be set width of 64 bits
2641 /* setsockopt(level, opt, flag) */
2642 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2643 &level, &optname, &vflag)) {
2644 // level should always be set to AF_VSOCK
2645 res = setsockopt(s->sock_fd, level, optname,
2646 (void*)&vflag, sizeof vflag);
2647 goto done;
2648 }
2649 return NULL;
2650 }
2651#endif
2652
Christian Heimesdffa3942016-09-05 23:54:41 +02002653 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 if (PyArg_ParseTuple(args, "iii:setsockopt",
2655 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002656 res = setsockopt(s->sock_fd, level, optname,
2657 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002658 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002660
2661 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002662 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002663 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2664 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2665 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002666 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002667 NULL, (socklen_t)optlen);
2668 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002670
2671 PyErr_Clear();
2672 /* setsockopt(level, opt, buffer) */
2673 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2674 &level, &optname, &optval))
2675 return NULL;
2676
2677#ifdef MS_WINDOWS
2678 if (optval.len > INT_MAX) {
2679 PyBuffer_Release(&optval);
2680 PyErr_Format(PyExc_OverflowError,
2681 "socket option is larger than %i bytes",
2682 INT_MAX);
2683 return NULL;
2684 }
2685 res = setsockopt(s->sock_fd, level, optname,
2686 optval.buf, (int)optval.len);
2687#else
2688 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2689#endif
2690 PyBuffer_Release(&optval);
2691
2692done:
Victor Stinnercc739322016-03-23 21:35:29 +01002693 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002695 }
2696
2697 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002698}
2699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002700PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002701"setsockopt(level, option, value: int)\n\
2702setsockopt(level, option, value: buffer)\n\
2703setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002704\n\
2705Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002706The value argument can either be an integer, a string buffer, or \n\
2707None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002708
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002709
Guido van Rossumaee08791992-09-08 09:05:33 +00002710/* s.getsockopt() method.
2711 With two arguments, retrieves an integer option.
2712 With a third integer argument, retrieves a string buffer of that size;
2713 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002714
Guido van Rossum73624e91994-10-10 17:59:00 +00002715static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002716sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 int level;
2719 int optname;
2720 int res;
2721 PyObject *buf;
2722 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002723 int flag = 0;
2724 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2727 &level, &optname, &buflen))
2728 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002731#ifdef AF_VSOCK
2732 if (s->sock_family == AF_VSOCK) {
2733 uint64_t vflag = 0; // Must be set width of 64 bits
2734 flagsize = sizeof vflag;
2735 res = getsockopt(s->sock_fd, level, optname,
2736 (void *)&vflag, &flagsize);
2737 if (res < 0)
2738 return s->errorhandler();
2739 return PyLong_FromUnsignedLong(vflag);
2740 }
2741#endif
2742 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 res = getsockopt(s->sock_fd, level, optname,
2744 (void *)&flag, &flagsize);
2745 if (res < 0)
2746 return s->errorhandler();
2747 return PyLong_FromLong(flag);
2748 }
caaveryeffc12f2017-09-06 18:18:10 -04002749#ifdef AF_VSOCK
2750 if (s->sock_family == AF_VSOCK) {
2751 PyErr_SetString(PyExc_OSError,
2752 "getsockopt string buffer not allowed");
2753 return NULL;
2754 }
2755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002757 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 "getsockopt buflen out of range");
2759 return NULL;
2760 }
2761 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2762 if (buf == NULL)
2763 return NULL;
2764 res = getsockopt(s->sock_fd, level, optname,
2765 (void *)PyBytes_AS_STRING(buf), &buflen);
2766 if (res < 0) {
2767 Py_DECREF(buf);
2768 return s->errorhandler();
2769 }
2770 _PyBytes_Resize(&buf, buflen);
2771 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002772}
2773
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002774PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002775"getsockopt(level, option[, buffersize]) -> value\n\
2776\n\
2777Get a socket option. See the Unix manual for level and option.\n\
2778If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002779string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002780
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002781
Fred Drake728819a2000-07-01 03:40:12 +00002782/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002783
Guido van Rossum73624e91994-10-10 17:59:00 +00002784static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002785sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 sock_addr_t addrbuf;
2788 int addrlen;
2789 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2792 return NULL;
2793 Py_BEGIN_ALLOW_THREADS
2794 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2795 Py_END_ALLOW_THREADS
2796 if (res < 0)
2797 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002798 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002799}
2800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002801PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002802"bind(address)\n\
2803\n\
2804Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002805pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002807
Guido van Rossum30a685f1991-06-27 15:51:29 +00002808
2809/* s.close() method.
2810 Set the file descriptor to -1 so operations tried subsequently
2811 will surely fail. */
2812
Guido van Rossum73624e91994-10-10 17:59:00 +00002813static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002814sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002817 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002818
Victor Stinner19a8e842016-03-21 16:36:48 +01002819 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002820 if (fd != INVALID_SOCKET) {
2821 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002822
2823 /* We do not want to retry upon EINTR: see
2824 http://lwn.net/Articles/576478/ and
2825 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2826 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002828 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002830 /* bpo-30319: The peer can already have closed the connection.
2831 Python ignores ECONNRESET on close(). */
2832 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002833 return s->errorhandler();
2834 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002836 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002837}
2838
Christian Heimesd0e31b92018-01-27 09:54:13 +01002839PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002840"close()\n\
2841\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002842Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002843
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002844static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002845sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002846{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002847 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002848 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002849 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002850}
2851
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002852PyDoc_STRVAR(detach_doc,
2853"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002854\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002855Close the socket object without closing the underlying file descriptor.\n\
2856The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002857can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002858
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002859static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002860sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002861{
Victor Stinner81c41db2015-04-02 11:50:57 +02002862 int err;
2863 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002864
Victor Stinner81c41db2015-04-02 11:50:57 +02002865 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2866 /* getsockopt() failed */
2867 return 0;
2868 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002869
Victor Stinner81c41db2015-04-02 11:50:57 +02002870 if (err == EISCONN)
2871 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002872 if (err != 0) {
2873 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2874 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002875 return 0;
2876 }
2877 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002878}
2879
2880static int
2881internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2882 int raise)
2883{
2884 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002885
2886 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002888 Py_END_ALLOW_THREADS
2889
Victor Stinner70a46f62015-03-31 22:03:59 +02002890 if (!res) {
2891 /* connect() succeeded, the socket is connected */
2892 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002894
Victor Stinner81c41db2015-04-02 11:50:57 +02002895 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002896
Victor Stinner81c41db2015-04-02 11:50:57 +02002897 /* save error, PyErr_CheckSignals() can replace it */
2898 err = GET_SOCK_ERROR;
2899 if (CHECK_ERRNO(EINTR)) {
2900 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002901 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002902
2903 /* Issue #23618: when connect() fails with EINTR, the connection is
2904 running asynchronously.
2905
2906 If the socket is blocking or has a timeout, wait until the
2907 connection completes, fails or timed out using select(), and then
2908 get the connection status using getsockopt(SO_ERROR).
2909
2910 If the socket is non-blocking, raise InterruptedError. The caller is
2911 responsible to wait until the connection completes, fails or timed
2912 out (it's the case in asyncio for example). */
2913 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2914 }
2915 else {
2916 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2917 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002918 }
2919
Victor Stinner81c41db2015-04-02 11:50:57 +02002920 if (!wait_connect) {
2921 if (raise) {
2922 /* restore error, maybe replaced by PyErr_CheckSignals() */
2923 SET_SOCK_ERROR(err);
2924 s->errorhandler();
2925 return -1;
2926 }
2927 else
2928 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002929 }
2930
Victor Stinner81c41db2015-04-02 11:50:57 +02002931 if (raise) {
2932 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002933 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2934 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002935 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002936 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002937 else {
2938 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002939 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2940 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002941 return err;
2942 }
2943 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002944}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002945
Fred Drake728819a2000-07-01 03:40:12 +00002946/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002947
Guido van Rossum73624e91994-10-10 17:59:00 +00002948static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002949sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 sock_addr_t addrbuf;
2952 int addrlen;
2953 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2956 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002957
Victor Stinner81c41db2015-04-02 11:50:57 +02002958 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002959 if (res < 0)
2960 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002961
Victor Stinneree699e92015-03-31 21:28:42 +02002962 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002963}
2964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002965PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002966"connect(address)\n\
2967\n\
2968Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002969is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970
Guido van Rossum30a685f1991-06-27 15:51:29 +00002971
Fred Drake728819a2000-07-01 03:40:12 +00002972/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002973
2974static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002975sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 sock_addr_t addrbuf;
2978 int addrlen;
2979 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2982 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002983
Victor Stinner81c41db2015-04-02 11:50:57 +02002984 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002985 if (res < 0)
2986 return NULL;
2987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002989}
2990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002991PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002992"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002993\n\
2994This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002995instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002996
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002997
Guido van Rossumed233a51992-06-23 09:07:03 +00002998/* s.fileno() method */
2999
Guido van Rossum73624e91994-10-10 17:59:00 +00003000static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003001sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003003 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003004}
3005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007"fileno() -> integer\n\
3008\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003009Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003010
Guido van Rossumed233a51992-06-23 09:07:03 +00003011
Guido van Rossumc89705d1992-11-26 08:54:07 +00003012/* s.getsockname() method */
3013
Guido van Rossum73624e91994-10-10 17:59:00 +00003014static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003015sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 sock_addr_t addrbuf;
3018 int res;
3019 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 if (!getsockaddrlen(s, &addrlen))
3022 return NULL;
3023 memset(&addrbuf, 0, addrlen);
3024 Py_BEGIN_ALLOW_THREADS
3025 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3026 Py_END_ALLOW_THREADS
3027 if (res < 0)
3028 return s->errorhandler();
3029 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3030 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003031}
3032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003033PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003034"getsockname() -> address info\n\
3035\n\
3036Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003037info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003038
Guido van Rossumc89705d1992-11-26 08:54:07 +00003039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003041/* s.getpeername() method */
3042
Guido van Rossum73624e91994-10-10 17:59:00 +00003043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 sock_addr_t addrbuf;
3047 int res;
3048 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 if (!getsockaddrlen(s, &addrlen))
3051 return NULL;
3052 memset(&addrbuf, 0, addrlen);
3053 Py_BEGIN_ALLOW_THREADS
3054 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3055 Py_END_ALLOW_THREADS
3056 if (res < 0)
3057 return s->errorhandler();
3058 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3059 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003060}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003062PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003063"getpeername() -> address info\n\
3064\n\
3065Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003066info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003067
Guido van Rossumb6775db1994-08-01 11:34:53 +00003068#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003069
3070
Guido van Rossum30a685f1991-06-27 15:51:29 +00003071/* s.listen(n) method */
3072
Guido van Rossum73624e91994-10-10 17:59:00 +00003073static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003074sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003075{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003076 /* We try to choose a default backlog high enough to avoid connection drops
3077 * for common workloads, yet not too high to limit resource usage. */
3078 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003080
Charles-François Natali644b8f52014-05-22 19:45:39 +01003081 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003085 /* To avoid problems on systems that don't allow a negative backlog
3086 * (which doesn't make sense anyway) we force a minimum value of 0. */
3087 if (backlog < 0)
3088 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 res = listen(s->sock_fd, backlog);
3090 Py_END_ALLOW_THREADS
3091 if (res < 0)
3092 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003093 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003094}
3095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003096PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003097"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003098\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003099Enable a server to accept connections. If backlog is specified, it must be\n\
3100at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003101unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003102connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003103
Victor Stinner31bf2d52015-04-01 21:57:09 +02003104struct sock_recv {
3105 char *cbuf;
3106 Py_ssize_t len;
3107 int flags;
3108 Py_ssize_t result;
3109};
3110
3111static int
3112sock_recv_impl(PySocketSockObject *s, void *data)
3113{
3114 struct sock_recv *ctx = data;
3115
3116#ifdef MS_WINDOWS
3117 if (ctx->len > INT_MAX)
3118 ctx->len = INT_MAX;
3119 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3120#else
3121 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3122#endif
3123 return (ctx->result >= 0);
3124}
3125
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126
Thomas Wouters477c8d52006-05-27 19:21:47 +00003127/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003128 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003129 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003131 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003132 * also possible that we return a number of bytes smaller than the request
3133 * bytes.
3134 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003135
Antoine Pitrou19467d22010-08-17 19:33:30 +00003136static Py_ssize_t
3137sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003138{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003139 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 if (!IS_SELECTABLE(s)) {
3142 select_error();
3143 return -1;
3144 }
3145 if (len == 0) {
3146 /* If 0 bytes were requested, do nothing. */
3147 return 0;
3148 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003149
Victor Stinner31bf2d52015-04-01 21:57:09 +02003150 ctx.cbuf = cbuf;
3151 ctx.len = len;
3152 ctx.flags = flags;
3153 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003155
3156 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003157}
3158
Guido van Rossum48a680c2001-03-02 06:34:14 +00003159
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003160/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003161
Guido van Rossum73624e91994-10-10 17:59:00 +00003162static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003163sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003164{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003165 Py_ssize_t recvlen, outlen;
3166 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003168
Antoine Pitrou19467d22010-08-17 19:33:30 +00003169 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 if (recvlen < 0) {
3173 PyErr_SetString(PyExc_ValueError,
3174 "negative buffersize in recv");
3175 return NULL;
3176 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 /* Allocate a new string. */
3179 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3180 if (buf == NULL)
3181 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 /* Call the guts */
3184 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3185 if (outlen < 0) {
3186 /* An error occurred, release the string and return an
3187 error. */
3188 Py_DECREF(buf);
3189 return NULL;
3190 }
3191 if (outlen != recvlen) {
3192 /* We did not read as many bytes as we anticipated, resize the
3193 string if possible and be successful. */
3194 _PyBytes_Resize(&buf, outlen);
3195 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003198}
3199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003200PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003201"recv(buffersize[, flags]) -> data\n\
3202\n\
3203Receive up to buffersize bytes from the socket. For the optional flags\n\
3204argument, see the Unix manual. When no data is available, block until\n\
3205at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003206the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003207
Guido van Rossum30a685f1991-06-27 15:51:29 +00003208
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003209/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003210
Thomas Wouters477c8d52006-05-27 19:21:47 +00003211static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003212sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003215
Antoine Pitrou19467d22010-08-17 19:33:30 +00003216 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 Py_buffer pbuf;
3218 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003219 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003222 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 &pbuf, &recvlen, &flags))
3224 return NULL;
3225 buf = pbuf.buf;
3226 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 if (recvlen < 0) {
3229 PyBuffer_Release(&pbuf);
3230 PyErr_SetString(PyExc_ValueError,
3231 "negative buffersize in recv_into");
3232 return NULL;
3233 }
3234 if (recvlen == 0) {
3235 /* If nbytes was not specified, use the buffer's length */
3236 recvlen = buflen;
3237 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 /* Check if the buffer is large enough */
3240 if (buflen < recvlen) {
3241 PyBuffer_Release(&pbuf);
3242 PyErr_SetString(PyExc_ValueError,
3243 "buffer too small for requested bytes");
3244 return NULL;
3245 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 /* Call the guts */
3248 readlen = sock_recv_guts(s, buf, recvlen, flags);
3249 if (readlen < 0) {
3250 /* Return an error. */
3251 PyBuffer_Release(&pbuf);
3252 return NULL;
3253 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 PyBuffer_Release(&pbuf);
3256 /* Return the number of bytes read. Note that we do not do anything
3257 special here in the case that readlen < recvlen. */
3258 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003259}
3260
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003261PyDoc_STRVAR(recv_into_doc,
3262"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003263\n\
3264A version of recv() that stores its data into a buffer rather than creating \n\
3265a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3266is not specified (or 0), receive up to the size available in the given buffer.\n\
3267\n\
3268See recv() for documentation about the flags.");
3269
Victor Stinner31bf2d52015-04-01 21:57:09 +02003270struct sock_recvfrom {
3271 char* cbuf;
3272 Py_ssize_t len;
3273 int flags;
3274 socklen_t *addrlen;
3275 sock_addr_t *addrbuf;
3276 Py_ssize_t result;
3277};
3278
3279static int
3280sock_recvfrom_impl(PySocketSockObject *s, void *data)
3281{
3282 struct sock_recvfrom *ctx = data;
3283
3284 memset(ctx->addrbuf, 0, *ctx->addrlen);
3285
3286#ifdef MS_WINDOWS
3287 if (ctx->len > INT_MAX)
3288 ctx->len = INT_MAX;
3289 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3290 SAS2SA(ctx->addrbuf), ctx->addrlen);
3291#else
3292 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3293 SAS2SA(ctx->addrbuf), ctx->addrlen);
3294#endif
3295 return (ctx->result >= 0);
3296}
3297
Thomas Wouters477c8d52006-05-27 19:21:47 +00003298
3299/*
Christian Heimes99170a52007-12-19 02:07:34 +00003300 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3301 * into a char buffer. If you have any inc/def ref to do to the objects that
3302 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003303 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003304 * that it is also possible that we return a number of bytes smaller than the
3305 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003306 *
3307 * 'addr' is a return value for the address object. Note that you must decref
3308 * it yourself.
3309 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003310static Py_ssize_t
3311sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003316 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 if (!getsockaddrlen(s, &addrlen))
3321 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 if (!IS_SELECTABLE(s)) {
3324 select_error();
3325 return -1;
3326 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003327
Victor Stinner31bf2d52015-04-01 21:57:09 +02003328 ctx.cbuf = cbuf;
3329 ctx.len = len;
3330 ctx.flags = flags;
3331 ctx.addrbuf = &addrbuf;
3332 ctx.addrlen = &addrlen;
3333 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003335
Victor Stinner31bf2d52015-04-01 21:57:09 +02003336 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3337 s->sock_proto);
3338 if (*addr == NULL)
3339 return -1;
3340
3341 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003342}
3343
3344/* s.recvfrom(nbytes [,flags]) method */
3345
3346static PyObject *
3347sock_recvfrom(PySocketSockObject *s, PyObject *args)
3348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 PyObject *buf = NULL;
3350 PyObject *addr = NULL;
3351 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003352 int flags = 0;
3353 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003354
Antoine Pitrou19467d22010-08-17 19:33:30 +00003355 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 if (recvlen < 0) {
3359 PyErr_SetString(PyExc_ValueError,
3360 "negative buffersize in recvfrom");
3361 return NULL;
3362 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3365 if (buf == NULL)
3366 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3369 recvlen, flags, &addr);
3370 if (outlen < 0) {
3371 goto finally;
3372 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 if (outlen != recvlen) {
3375 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003376 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003378 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 goto finally;
3380 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003383
3384finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 Py_XDECREF(buf);
3386 Py_XDECREF(addr);
3387 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003388}
3389
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003390PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003391"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3392\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003393Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003394
Thomas Wouters477c8d52006-05-27 19:21:47 +00003395
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003396/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397
3398static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003399sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003402
Antoine Pitrou19467d22010-08-17 19:33:30 +00003403 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 Py_buffer pbuf;
3405 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003406 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003409
Antoine Pitrou19467d22010-08-17 19:33:30 +00003410 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 kwlist, &pbuf,
3412 &recvlen, &flags))
3413 return NULL;
3414 buf = pbuf.buf;
3415 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 if (recvlen < 0) {
3418 PyBuffer_Release(&pbuf);
3419 PyErr_SetString(PyExc_ValueError,
3420 "negative buffersize in recvfrom_into");
3421 return NULL;
3422 }
3423 if (recvlen == 0) {
3424 /* If nbytes was not specified, use the buffer's length */
3425 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003426 } else if (recvlen > buflen) {
3427 PyBuffer_Release(&pbuf);
3428 PyErr_SetString(PyExc_ValueError,
3429 "nbytes is greater than the length of the buffer");
3430 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3434 if (readlen < 0) {
3435 PyBuffer_Release(&pbuf);
3436 /* Return an error */
3437 Py_XDECREF(addr);
3438 return NULL;
3439 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 PyBuffer_Release(&pbuf);
3442 /* Return the number of bytes read and the address. Note that we do
3443 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003444 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003445}
3446
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003447PyDoc_STRVAR(recvfrom_into_doc,
3448"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003449\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003450Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003451
Victor Stinner35bee932015-04-02 12:28:07 +02003452/* The sendmsg() and recvmsg[_into]() methods require a working
3453 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3454#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003455struct sock_recvmsg {
3456 struct msghdr *msg;
3457 int flags;
3458 ssize_t result;
3459};
3460
3461static int
3462sock_recvmsg_impl(PySocketSockObject *s, void *data)
3463{
3464 struct sock_recvmsg *ctx = data;
3465
3466 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3467 return (ctx->result >= 0);
3468}
3469
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003470/*
3471 * Call recvmsg() with the supplied iovec structures, flags, and
3472 * ancillary data buffer size (controllen). Returns the tuple return
3473 * value for recvmsg() or recvmsg_into(), with the first item provided
3474 * by the supplied makeval() function. makeval() will be called with
3475 * the length read and makeval_data as arguments, and must return a
3476 * new reference (which will be decrefed if there is a subsequent
3477 * error). On error, closes any file descriptors received via
3478 * SCM_RIGHTS.
3479 */
3480static PyObject *
3481sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3482 int flags, Py_ssize_t controllen,
3483 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3484{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485 sock_addr_t addrbuf;
3486 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003487 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003488 PyObject *cmsg_list = NULL, *retval = NULL;
3489 void *controlbuf = NULL;
3490 struct cmsghdr *cmsgh;
3491 size_t cmsgdatalen = 0;
3492 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003493 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494
3495 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3496 ignored" when the socket is connected (Linux fills them in
3497 anyway for AF_UNIX sockets at least). Normally msg_namelen
3498 seems to be set to 0 if there's no address, but try to
3499 initialize msg_name to something that won't be mistaken for a
3500 real address if that doesn't happen. */
3501 if (!getsockaddrlen(s, &addrbuflen))
3502 return NULL;
3503 memset(&addrbuf, 0, addrbuflen);
3504 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3505
3506 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3507 PyErr_SetString(PyExc_ValueError,
3508 "invalid ancillary data buffer length");
3509 return NULL;
3510 }
3511 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3512 return PyErr_NoMemory();
3513
3514 /* Make the system call. */
3515 if (!IS_SELECTABLE(s)) {
3516 select_error();
3517 goto finally;
3518 }
3519
Victor Stinner31bf2d52015-04-01 21:57:09 +02003520 msg.msg_name = SAS2SA(&addrbuf);
3521 msg.msg_namelen = addrbuflen;
3522 msg.msg_iov = iov;
3523 msg.msg_iovlen = iovlen;
3524 msg.msg_control = controlbuf;
3525 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003526
Victor Stinner31bf2d52015-04-01 21:57:09 +02003527 ctx.msg = &msg;
3528 ctx.flags = flags;
3529 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003530 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003531
3532 /* Make list of (level, type, data) tuples from control messages. */
3533 if ((cmsg_list = PyList_New(0)) == NULL)
3534 goto err_closefds;
3535 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3536 implementations didn't do so. */
3537 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3538 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3539 PyObject *bytes, *tuple;
3540 int tmp;
3541
3542 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3543 if (cmsg_status != 0) {
3544 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3545 "received malformed or improperly-truncated "
3546 "ancillary data", 1) == -1)
3547 goto err_closefds;
3548 }
3549 if (cmsg_status < 0)
3550 break;
3551 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003552 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553 goto err_closefds;
3554 }
3555
3556 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3557 cmsgdatalen);
3558 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3559 (int)cmsgh->cmsg_type, bytes);
3560 if (tuple == NULL)
3561 goto err_closefds;
3562 tmp = PyList_Append(cmsg_list, tuple);
3563 Py_DECREF(tuple);
3564 if (tmp != 0)
3565 goto err_closefds;
3566
3567 if (cmsg_status != 0)
3568 break;
3569 }
3570
3571 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003572 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003573 cmsg_list,
3574 (int)msg.msg_flags,
3575 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3576 ((msg.msg_namelen > addrbuflen) ?
3577 addrbuflen : msg.msg_namelen),
3578 s->sock_proto));
3579 if (retval == NULL)
3580 goto err_closefds;
3581
3582finally:
3583 Py_XDECREF(cmsg_list);
3584 PyMem_Free(controlbuf);
3585 return retval;
3586
3587err_closefds:
3588#ifdef SCM_RIGHTS
3589 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3590 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3591 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3592 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3593 if (cmsg_status < 0)
3594 break;
3595 if (cmsgh->cmsg_level == SOL_SOCKET &&
3596 cmsgh->cmsg_type == SCM_RIGHTS) {
3597 size_t numfds;
3598 int *fdp;
3599
3600 numfds = cmsgdatalen / sizeof(int);
3601 fdp = (int *)CMSG_DATA(cmsgh);
3602 while (numfds-- > 0)
3603 close(*fdp++);
3604 }
3605 if (cmsg_status != 0)
3606 break;
3607 }
3608#endif /* SCM_RIGHTS */
3609 goto finally;
3610}
3611
3612
3613static PyObject *
3614makeval_recvmsg(ssize_t received, void *data)
3615{
3616 PyObject **buf = data;
3617
3618 if (received < PyBytes_GET_SIZE(*buf))
3619 _PyBytes_Resize(buf, received);
3620 Py_XINCREF(*buf);
3621 return *buf;
3622}
3623
3624/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3625
3626static PyObject *
3627sock_recvmsg(PySocketSockObject *s, PyObject *args)
3628{
3629 Py_ssize_t bufsize, ancbufsize = 0;
3630 int flags = 0;
3631 struct iovec iov;
3632 PyObject *buf = NULL, *retval = NULL;
3633
3634 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3635 return NULL;
3636
3637 if (bufsize < 0) {
3638 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3639 return NULL;
3640 }
3641 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3642 return NULL;
3643 iov.iov_base = PyBytes_AS_STRING(buf);
3644 iov.iov_len = bufsize;
3645
3646 /* Note that we're passing a pointer to *our pointer* to the bytes
3647 object here (&buf); makeval_recvmsg() may incref the object, or
3648 deallocate it and set our pointer to NULL. */
3649 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3650 &makeval_recvmsg, &buf);
3651 Py_XDECREF(buf);
3652 return retval;
3653}
3654
3655PyDoc_STRVAR(recvmsg_doc,
3656"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3657\n\
3658Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3659socket. The ancbufsize argument sets the size in bytes of the\n\
3660internal buffer used to receive the ancillary data; it defaults to 0,\n\
3661meaning that no ancillary data will be received. Appropriate buffer\n\
3662sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3663CMSG_LEN(), and items which do not fit into the buffer might be\n\
3664truncated or discarded. The flags argument defaults to 0 and has the\n\
3665same meaning as for recv().\n\
3666\n\
3667The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3668The data item is a bytes object holding the non-ancillary data\n\
3669received. The ancdata item is a list of zero or more tuples\n\
3670(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3671(control messages) received: cmsg_level and cmsg_type are integers\n\
3672specifying the protocol level and protocol-specific type respectively,\n\
3673and cmsg_data is a bytes object holding the associated data. The\n\
3674msg_flags item is the bitwise OR of various flags indicating\n\
3675conditions on the received message; see your system documentation for\n\
3676details. If the receiving socket is unconnected, address is the\n\
3677address of the sending socket, if available; otherwise, its value is\n\
3678unspecified.\n\
3679\n\
3680If recvmsg() raises an exception after the system call returns, it\n\
3681will first attempt to close any file descriptors received via the\n\
3682SCM_RIGHTS mechanism.");
3683
3684
3685static PyObject *
3686makeval_recvmsg_into(ssize_t received, void *data)
3687{
3688 return PyLong_FromSsize_t(received);
3689}
3690
3691/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3692
3693static PyObject *
3694sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3695{
3696 Py_ssize_t ancbufsize = 0;
3697 int flags = 0;
3698 struct iovec *iovs = NULL;
3699 Py_ssize_t i, nitems, nbufs = 0;
3700 Py_buffer *bufs = NULL;
3701 PyObject *buffers_arg, *fast, *retval = NULL;
3702
3703 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3704 &buffers_arg, &ancbufsize, &flags))
3705 return NULL;
3706
3707 if ((fast = PySequence_Fast(buffers_arg,
3708 "recvmsg_into() argument 1 must be an "
3709 "iterable")) == NULL)
3710 return NULL;
3711 nitems = PySequence_Fast_GET_SIZE(fast);
3712 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003713 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003714 goto finally;
3715 }
3716
3717 /* Fill in an iovec for each item, and save the Py_buffer
3718 structs to release afterwards. */
3719 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3720 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3721 PyErr_NoMemory();
3722 goto finally;
3723 }
3724 for (; nbufs < nitems; nbufs++) {
3725 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3726 "w*;recvmsg_into() argument 1 must be an iterable "
3727 "of single-segment read-write buffers",
3728 &bufs[nbufs]))
3729 goto finally;
3730 iovs[nbufs].iov_base = bufs[nbufs].buf;
3731 iovs[nbufs].iov_len = bufs[nbufs].len;
3732 }
3733
3734 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3735 &makeval_recvmsg_into, NULL);
3736finally:
3737 for (i = 0; i < nbufs; i++)
3738 PyBuffer_Release(&bufs[i]);
3739 PyMem_Free(bufs);
3740 PyMem_Free(iovs);
3741 Py_DECREF(fast);
3742 return retval;
3743}
3744
3745PyDoc_STRVAR(recvmsg_into_doc,
3746"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3747\n\
3748Receive normal data and ancillary data from the socket, scattering the\n\
3749non-ancillary data into a series of buffers. The buffers argument\n\
3750must be an iterable of objects that export writable buffers\n\
3751(e.g. bytearray objects); these will be filled with successive chunks\n\
3752of the non-ancillary data until it has all been written or there are\n\
3753no more buffers. The ancbufsize argument sets the size in bytes of\n\
3754the internal buffer used to receive the ancillary data; it defaults to\n\
37550, meaning that no ancillary data will be received. Appropriate\n\
3756buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3757or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3758truncated or discarded. The flags argument defaults to 0 and has the\n\
3759same meaning as for recv().\n\
3760\n\
3761The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3762The nbytes item is the total number of bytes of non-ancillary data\n\
3763written into the buffers. The ancdata item is a list of zero or more\n\
3764tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3765data (control messages) received: cmsg_level and cmsg_type are\n\
3766integers specifying the protocol level and protocol-specific type\n\
3767respectively, and cmsg_data is a bytes object holding the associated\n\
3768data. The msg_flags item is the bitwise OR of various flags\n\
3769indicating conditions on the received message; see your system\n\
3770documentation for details. If the receiving socket is unconnected,\n\
3771address is the address of the sending socket, if available; otherwise,\n\
3772its value is unspecified.\n\
3773\n\
3774If recvmsg_into() raises an exception after the system call returns,\n\
3775it will first attempt to close any file descriptors received via the\n\
3776SCM_RIGHTS mechanism.");
3777#endif /* CMSG_LEN */
3778
3779
Victor Stinner31bf2d52015-04-01 21:57:09 +02003780struct sock_send {
3781 char *buf;
3782 Py_ssize_t len;
3783 int flags;
3784 Py_ssize_t result;
3785};
3786
3787static int
3788sock_send_impl(PySocketSockObject *s, void *data)
3789{
3790 struct sock_send *ctx = data;
3791
3792#ifdef MS_WINDOWS
3793 if (ctx->len > INT_MAX)
3794 ctx->len = INT_MAX;
3795 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3796#else
3797 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3798#endif
3799 return (ctx->result >= 0);
3800}
3801
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003802/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003803
Guido van Rossum73624e91994-10-10 17:59:00 +00003804static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003805sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003806{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003807 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003809 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3812 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 if (!IS_SELECTABLE(s)) {
3815 PyBuffer_Release(&pbuf);
3816 return select_error();
3817 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003818 ctx.buf = pbuf.buf;
3819 ctx.len = pbuf.len;
3820 ctx.flags = flags;
3821 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003822 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 return NULL;
3824 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003825 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003826
3827 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003828}
3829
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003830PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003831"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003832\n\
3833Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003834argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003835sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003836
3837
3838/* s.sendall(data [,flags]) method */
3839
3840static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003841sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003844 Py_ssize_t len, n;
3845 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003847 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003848 int has_timeout = (s->sock_timeout > 0);
3849 _PyTime_t interval = s->sock_timeout;
3850 _PyTime_t deadline = 0;
3851 int deadline_initialized = 0;
3852 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3855 return NULL;
3856 buf = pbuf.buf;
3857 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 if (!IS_SELECTABLE(s)) {
3860 PyBuffer_Release(&pbuf);
3861 return select_error();
3862 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003865 if (has_timeout) {
3866 if (deadline_initialized) {
3867 /* recompute the timeout */
3868 interval = deadline - _PyTime_GetMonotonicClock();
3869 }
3870 else {
3871 deadline_initialized = 1;
3872 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3873 }
3874
3875 if (interval <= 0) {
3876 PyErr_SetString(socket_timeout, "timed out");
3877 goto done;
3878 }
3879 }
3880
Victor Stinner02f32ab2015-04-01 22:53:26 +02003881 ctx.buf = buf;
3882 ctx.len = len;
3883 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003884 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3885 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003886 n = ctx.result;
3887 assert(n >= 0);
3888
3889 buf += n;
3890 len -= n;
3891
3892 /* We must run our signal handlers before looping again.
3893 send() can return a successful partial write when it is
3894 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003895 if (PyErr_CheckSignals())
3896 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003897 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003898 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003899
Victor Stinner8912d142015-04-06 23:16:34 +02003900 Py_INCREF(Py_None);
3901 res = Py_None;
3902
3903done:
3904 PyBuffer_Release(&pbuf);
3905 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003906}
3907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003908PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003909"sendall(data[, flags])\n\
3910\n\
3911Send a data string to the socket. For the optional flags\n\
3912argument, see the Unix manual. This calls send() repeatedly\n\
3913until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003914to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003915
Guido van Rossum30a685f1991-06-27 15:51:29 +00003916
Victor Stinner31bf2d52015-04-01 21:57:09 +02003917struct sock_sendto {
3918 char *buf;
3919 Py_ssize_t len;
3920 int flags;
3921 int addrlen;
3922 sock_addr_t *addrbuf;
3923 Py_ssize_t result;
3924};
3925
3926static int
3927sock_sendto_impl(PySocketSockObject *s, void *data)
3928{
3929 struct sock_sendto *ctx = data;
3930
3931#ifdef MS_WINDOWS
3932 if (ctx->len > INT_MAX)
3933 ctx->len = INT_MAX;
3934 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3935 SAS2SA(ctx->addrbuf), ctx->addrlen);
3936#else
3937 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3938 SAS2SA(ctx->addrbuf), ctx->addrlen);
3939#endif
3940 return (ctx->result >= 0);
3941}
3942
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003943/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003944
Guido van Rossum73624e91994-10-10 17:59:00 +00003945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003946sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 Py_buffer pbuf;
3949 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003950 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003952 int addrlen, flags;
3953 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003955 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003956 arglen = PyTuple_Size(args);
3957 switch (arglen) {
3958 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003959 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3960 return NULL;
3961 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003962 break;
3963 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003964 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3965 &pbuf, &flags, &addro)) {
3966 return NULL;
3967 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003968 break;
3969 default:
3970 PyErr_Format(PyExc_TypeError,
3971 "sendto() takes 2 or 3 arguments (%d given)",
3972 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003973 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 if (!IS_SELECTABLE(s)) {
3977 PyBuffer_Release(&pbuf);
3978 return select_error();
3979 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003981 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3982 PyBuffer_Release(&pbuf);
3983 return NULL;
3984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003985
Victor Stinner31bf2d52015-04-01 21:57:09 +02003986 ctx.buf = pbuf.buf;
3987 ctx.len = pbuf.len;
3988 ctx.flags = flags;
3989 ctx.addrlen = addrlen;
3990 ctx.addrbuf = &addrbuf;
3991 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003992 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 return NULL;
3994 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003995 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003996
3997 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003998}
3999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004000PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004001"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004002\n\
4003Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004004For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004005
Guido van Rossum30a685f1991-06-27 15:51:29 +00004006
Victor Stinner35bee932015-04-02 12:28:07 +02004007/* The sendmsg() and recvmsg[_into]() methods require a working
4008 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4009#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004010struct sock_sendmsg {
4011 struct msghdr *msg;
4012 int flags;
4013 ssize_t result;
4014};
4015
4016static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004017sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4018 struct msghdr *msg,
4019 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4020 Py_ssize_t ndataparts, ndatabufs = 0;
4021 int result = -1;
4022 struct iovec *iovs = NULL;
4023 PyObject *data_fast = NULL;
4024 Py_buffer *databufs = NULL;
4025
4026 /* Fill in an iovec for each message part, and save the Py_buffer
4027 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004028 data_fast = PySequence_Fast(data_arg,
4029 "sendmsg() argument 1 must be an "
4030 "iterable");
4031 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004032 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004033 }
4034
Christian Heimesdffa3942016-09-05 23:54:41 +02004035 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4036 if (ndataparts > INT_MAX) {
4037 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4038 goto finally;
4039 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004040
Christian Heimesdffa3942016-09-05 23:54:41 +02004041 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004042 if (ndataparts > 0) {
4043 iovs = PyMem_New(struct iovec, ndataparts);
4044 if (iovs == NULL) {
4045 PyErr_NoMemory();
4046 goto finally;
4047 }
4048 msg->msg_iov = iovs;
4049
4050 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004051 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004052 PyErr_NoMemory();
4053 goto finally;
4054 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004055 }
4056 for (; ndatabufs < ndataparts; ndatabufs++) {
4057 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4058 "y*;sendmsg() argument 1 must be an iterable of "
4059 "bytes-like objects",
4060 &databufs[ndatabufs]))
4061 goto finally;
4062 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4063 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4064 }
4065 result = 0;
4066 finally:
4067 *databufsout = databufs;
4068 *ndatabufsout = ndatabufs;
4069 Py_XDECREF(data_fast);
4070 return result;
4071}
4072
4073static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004074sock_sendmsg_impl(PySocketSockObject *s, void *data)
4075{
4076 struct sock_sendmsg *ctx = data;
4077
4078 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4079 return (ctx->result >= 0);
4080}
4081
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4083
4084static PyObject *
4085sock_sendmsg(PySocketSockObject *s, PyObject *args)
4086{
Christian Heimesdffa3942016-09-05 23:54:41 +02004087 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004088 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004090 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004091 struct cmsginfo {
4092 int level;
4093 int type;
4094 Py_buffer data;
4095 } *cmsgs = NULL;
4096 void *controlbuf = NULL;
4097 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004098 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004099 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004101 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102
4103 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004104 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004106 }
4107
4108 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004109
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004110 /* Parse destination address. */
4111 if (addr_arg != NULL && addr_arg != Py_None) {
4112 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4113 goto finally;
4114 msg.msg_name = &addrbuf;
4115 msg.msg_namelen = addrlen;
4116 }
4117
4118 /* Fill in an iovec for each message part, and save the Py_buffer
4119 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004120 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004121 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004122 }
4123
4124 if (cmsg_arg == NULL)
4125 ncmsgs = 0;
4126 else {
4127 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4128 "sendmsg() argument 2 must be an "
4129 "iterable")) == NULL)
4130 goto finally;
4131 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4132 }
4133
4134#ifndef CMSG_SPACE
4135 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004136 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004137 "sending multiple control messages is not supported "
4138 "on this system");
4139 goto finally;
4140 }
4141#endif
4142 /* Save level, type and Py_buffer for each control message,
4143 and calculate total size. */
4144 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4145 PyErr_NoMemory();
4146 goto finally;
4147 }
4148 controllen = controllen_last = 0;
4149 while (ncmsgbufs < ncmsgs) {
4150 size_t bufsize, space;
4151
4152 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4153 "(iiy*):[sendmsg() ancillary data items]",
4154 &cmsgs[ncmsgbufs].level,
4155 &cmsgs[ncmsgbufs].type,
4156 &cmsgs[ncmsgbufs].data))
4157 goto finally;
4158 bufsize = cmsgs[ncmsgbufs++].data.len;
4159
4160#ifdef CMSG_SPACE
4161 if (!get_CMSG_SPACE(bufsize, &space)) {
4162#else
4163 if (!get_CMSG_LEN(bufsize, &space)) {
4164#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004165 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004166 goto finally;
4167 }
4168 controllen += space;
4169 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004170 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171 goto finally;
4172 }
4173 controllen_last = controllen;
4174 }
4175
4176 /* Construct ancillary data block from control message info. */
4177 if (ncmsgbufs > 0) {
4178 struct cmsghdr *cmsgh = NULL;
4179
Victor Stinner52d61e42016-09-12 11:41:58 +02004180 controlbuf = PyMem_Malloc(controllen);
4181 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004182 PyErr_NoMemory();
4183 goto finally;
4184 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004185 msg.msg_control = controlbuf;
4186
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004187 msg.msg_controllen = controllen;
4188
4189 /* Need to zero out the buffer as a workaround for glibc's
4190 CMSG_NXTHDR() implementation. After getting the pointer to
4191 the next header, it checks its (uninitialized) cmsg_len
4192 member to see if the "message" fits in the buffer, and
4193 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004194 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004195 memset(controlbuf, 0, controllen);
4196
4197 for (i = 0; i < ncmsgbufs; i++) {
4198 size_t msg_len, data_len = cmsgs[i].data.len;
4199 int enough_space = 0;
4200
4201 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4202 if (cmsgh == NULL) {
4203 PyErr_Format(PyExc_RuntimeError,
4204 "unexpected NULL result from %s()",
4205 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4206 goto finally;
4207 }
4208 if (!get_CMSG_LEN(data_len, &msg_len)) {
4209 PyErr_SetString(PyExc_RuntimeError,
4210 "item size out of range for CMSG_LEN()");
4211 goto finally;
4212 }
4213 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4214 size_t space;
4215
4216 cmsgh->cmsg_len = msg_len;
4217 if (get_cmsg_data_space(&msg, cmsgh, &space))
4218 enough_space = (space >= data_len);
4219 }
4220 if (!enough_space) {
4221 PyErr_SetString(PyExc_RuntimeError,
4222 "ancillary data does not fit in calculated "
4223 "space");
4224 goto finally;
4225 }
4226 cmsgh->cmsg_level = cmsgs[i].level;
4227 cmsgh->cmsg_type = cmsgs[i].type;
4228 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4229 }
4230 }
4231
4232 /* Make the system call. */
4233 if (!IS_SELECTABLE(s)) {
4234 select_error();
4235 goto finally;
4236 }
4237
Victor Stinner31bf2d52015-04-01 21:57:09 +02004238 ctx.msg = &msg;
4239 ctx.flags = flags;
4240 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004242
4243 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004244
4245finally:
4246 PyMem_Free(controlbuf);
4247 for (i = 0; i < ncmsgbufs; i++)
4248 PyBuffer_Release(&cmsgs[i].data);
4249 PyMem_Free(cmsgs);
4250 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004251 PyMem_Free(msg.msg_iov);
4252 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004253 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004254 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004255 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004256 return retval;
4257}
4258
4259PyDoc_STRVAR(sendmsg_doc,
4260"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4261\n\
4262Send normal and ancillary data to the socket, gathering the\n\
4263non-ancillary data from a series of buffers and concatenating it into\n\
4264a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004265data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004266The ancdata argument specifies the ancillary data (control messages)\n\
4267as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4268cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4269protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004270is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004271argument defaults to 0 and has the same meaning as for send(). If\n\
4272address is supplied and not None, it sets a destination address for\n\
4273the message. The return value is the number of bytes of non-ancillary\n\
4274data sent.");
4275#endif /* CMSG_LEN */
4276
Christian Heimesdffa3942016-09-05 23:54:41 +02004277#ifdef HAVE_SOCKADDR_ALG
4278static PyObject*
4279sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4280{
4281 PyObject *retval = NULL;
4282
4283 Py_ssize_t i, ndatabufs = 0;
4284 Py_buffer *databufs = NULL;
4285 PyObject *data_arg = NULL;
4286
4287 Py_buffer iv = {NULL, NULL};
4288
4289 PyObject *opobj = NULL;
4290 int op = -1;
4291
4292 PyObject *assoclenobj = NULL;
4293 int assoclen = -1;
4294
4295 unsigned int *uiptr;
4296 int flags = 0;
4297
4298 struct msghdr msg;
4299 struct cmsghdr *header = NULL;
4300 struct af_alg_iv *alg_iv = NULL;
4301 struct sock_sendmsg ctx;
4302 Py_ssize_t controllen;
4303 void *controlbuf = NULL;
4304 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4305
4306 if (self->sock_family != AF_ALG) {
4307 PyErr_SetString(PyExc_OSError,
4308 "algset is only supported for AF_ALG");
4309 return NULL;
4310 }
4311
4312 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4313 "|O$O!y*O!i:sendmsg_afalg", keywords,
4314 &data_arg,
4315 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004316 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004317 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004318 }
4319
4320 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004321
4322 /* op is a required, keyword-only argument >= 0 */
4323 if (opobj != NULL) {
4324 op = _PyLong_AsInt(opobj);
4325 }
4326 if (op < 0) {
4327 /* override exception from _PyLong_AsInt() */
4328 PyErr_SetString(PyExc_TypeError,
4329 "Invalid or missing argument 'op'");
4330 goto finally;
4331 }
4332 /* assoclen is optional but must be >= 0 */
4333 if (assoclenobj != NULL) {
4334 assoclen = _PyLong_AsInt(assoclenobj);
4335 if (assoclen == -1 && PyErr_Occurred()) {
4336 goto finally;
4337 }
4338 if (assoclen < 0) {
4339 PyErr_SetString(PyExc_TypeError,
4340 "assoclen must be positive");
4341 goto finally;
4342 }
4343 }
4344
4345 controllen = CMSG_SPACE(4);
4346 if (iv.buf != NULL) {
4347 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4348 }
4349 if (assoclen >= 0) {
4350 controllen += CMSG_SPACE(4);
4351 }
4352
4353 controlbuf = PyMem_Malloc(controllen);
4354 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004355 PyErr_NoMemory();
4356 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004357 }
4358 memset(controlbuf, 0, controllen);
4359
Christian Heimesdffa3942016-09-05 23:54:41 +02004360 msg.msg_controllen = controllen;
4361 msg.msg_control = controlbuf;
4362
4363 /* Fill in an iovec for each message part, and save the Py_buffer
4364 structs to release afterwards. */
4365 if (data_arg != NULL) {
4366 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4367 goto finally;
4368 }
4369 }
4370
4371 /* set operation to encrypt or decrypt */
4372 header = CMSG_FIRSTHDR(&msg);
4373 if (header == NULL) {
4374 PyErr_SetString(PyExc_RuntimeError,
4375 "unexpected NULL result from CMSG_FIRSTHDR");
4376 goto finally;
4377 }
4378 header->cmsg_level = SOL_ALG;
4379 header->cmsg_type = ALG_SET_OP;
4380 header->cmsg_len = CMSG_LEN(4);
4381 uiptr = (void*)CMSG_DATA(header);
4382 *uiptr = (unsigned int)op;
4383
4384 /* set initialization vector */
4385 if (iv.buf != NULL) {
4386 header = CMSG_NXTHDR(&msg, header);
4387 if (header == NULL) {
4388 PyErr_SetString(PyExc_RuntimeError,
4389 "unexpected NULL result from CMSG_NXTHDR(iv)");
4390 goto finally;
4391 }
4392 header->cmsg_level = SOL_ALG;
4393 header->cmsg_type = ALG_SET_IV;
4394 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4395 alg_iv = (void*)CMSG_DATA(header);
4396 alg_iv->ivlen = iv.len;
4397 memcpy(alg_iv->iv, iv.buf, iv.len);
4398 }
4399
4400 /* set length of associated data for AEAD */
4401 if (assoclen >= 0) {
4402 header = CMSG_NXTHDR(&msg, header);
4403 if (header == NULL) {
4404 PyErr_SetString(PyExc_RuntimeError,
4405 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4406 goto finally;
4407 }
4408 header->cmsg_level = SOL_ALG;
4409 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4410 header->cmsg_len = CMSG_LEN(4);
4411 uiptr = (void*)CMSG_DATA(header);
4412 *uiptr = (unsigned int)assoclen;
4413 }
4414
4415 ctx.msg = &msg;
4416 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004417 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004418 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004419 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004420
4421 retval = PyLong_FromSsize_t(ctx.result);
4422
4423 finally:
4424 PyMem_Free(controlbuf);
4425 if (iv.buf != NULL) {
4426 PyBuffer_Release(&iv);
4427 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004428 PyMem_Free(msg.msg_iov);
4429 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004430 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004431 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004432 PyMem_Free(databufs);
4433 return retval;
4434}
4435
4436PyDoc_STRVAR(sendmsg_afalg_doc,
4437"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4438\n\
4439Set operation mode, IV and length of associated data for an AF_ALG\n\
4440operation socket.");
4441#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004442
Guido van Rossum30a685f1991-06-27 15:51:29 +00004443/* s.shutdown(how) method */
4444
Guido van Rossum73624e91994-10-10 17:59:00 +00004445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004446sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 int how;
4449 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004450
Serhiy Storchaka78980432013-01-15 01:12:17 +02004451 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 if (how == -1 && PyErr_Occurred())
4453 return NULL;
4454 Py_BEGIN_ALLOW_THREADS
4455 res = shutdown(s->sock_fd, how);
4456 Py_END_ALLOW_THREADS
4457 if (res < 0)
4458 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004459 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004460}
4461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004462PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004463"shutdown(flag)\n\
4464\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004465Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4466of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004467
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004468#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004469static PyObject*
4470sock_ioctl(PySocketSockObject *s, PyObject *arg)
4471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 unsigned long cmd = SIO_RCVALL;
4473 PyObject *argO;
4474 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4477 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 switch (cmd) {
4480 case SIO_RCVALL: {
4481 unsigned int option = RCVALL_ON;
4482 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4483 return NULL;
4484 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4485 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4486 return set_error();
4487 }
4488 return PyLong_FromUnsignedLong(recv); }
4489 case SIO_KEEPALIVE_VALS: {
4490 struct tcp_keepalive ka;
4491 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4492 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4493 return NULL;
4494 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4495 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4496 return set_error();
4497 }
4498 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004499#if defined(SIO_LOOPBACK_FAST_PATH)
4500 case SIO_LOOPBACK_FAST_PATH: {
4501 unsigned int option;
4502 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4503 return NULL;
4504 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4505 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4506 return set_error();
4507 }
4508 return PyLong_FromUnsignedLong(recv); }
4509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 default:
4511 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4512 return NULL;
4513 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004514}
4515PyDoc_STRVAR(sock_ioctl_doc,
4516"ioctl(cmd, option) -> long\n\
4517\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004518Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4519SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004520SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4521SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004522#endif
4523
4524#if defined(MS_WINDOWS)
4525static PyObject*
4526sock_share(PySocketSockObject *s, PyObject *arg)
4527{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004528 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004529 DWORD processId;
4530 int result;
4531
4532 if (!PyArg_ParseTuple(arg, "I", &processId))
4533 return NULL;
4534
4535 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004536 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004537 Py_END_ALLOW_THREADS
4538 if (result == SOCKET_ERROR)
4539 return set_error();
4540 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4541}
4542PyDoc_STRVAR(sock_share_doc,
4543"share(process_id) -> bytes\n\
4544\n\
4545Share the socket with another process. The target process id\n\
4546must be provided and the resulting bytes object passed to the target\n\
4547process. There the shared socket can be instantiated by calling\n\
4548socket.fromshare().");
4549
Christian Heimesfaf2f632008-01-06 16:59:19 +00004550
4551#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004552
4553/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004554
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004555static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4557 accept_doc},
4558 {"bind", (PyCFunction)sock_bind, METH_O,
4559 bind_doc},
4560 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004561 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 {"connect", (PyCFunction)sock_connect, METH_O,
4563 connect_doc},
4564 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4565 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004566 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4567 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4569 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004570#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 {"getpeername", (PyCFunction)sock_getpeername,
4572 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 {"getsockname", (PyCFunction)sock_getsockname,
4575 METH_NOARGS, getsockname_doc},
4576 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4577 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004578#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4580 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004581#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004582#if defined(MS_WINDOWS)
4583 {"share", (PyCFunction)sock_share, METH_VARARGS,
4584 sock_share_doc},
4585#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004586 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 listen_doc},
4588 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4589 recv_doc},
4590 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4591 recv_into_doc},
4592 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4593 recvfrom_doc},
4594 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4595 recvfrom_into_doc},
4596 {"send", (PyCFunction)sock_send, METH_VARARGS,
4597 send_doc},
4598 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4599 sendall_doc},
4600 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4601 sendto_doc},
4602 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4603 setblocking_doc},
4604 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4605 settimeout_doc},
4606 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4607 gettimeout_doc},
4608 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4609 setsockopt_doc},
4610 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4611 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004612#ifdef CMSG_LEN
4613 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4614 recvmsg_doc},
4615 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4616 recvmsg_into_doc,},
4617 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4618 sendmsg_doc},
4619#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004620#ifdef HAVE_SOCKADDR_ALG
4621 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4622 sendmsg_afalg_doc},
4623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004625};
4626
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004627/* SockObject members */
4628static PyMemberDef sock_memberlist[] = {
4629 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4630 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4631 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004632 {0},
4633};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004634
Victor Stinner71694d52015-03-28 01:18:54 +01004635static PyGetSetDef sock_getsetlist[] = {
4636 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4637 {NULL} /* sentinel */
4638};
4639
Guido van Rossum73624e91994-10-10 17:59:00 +00004640/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004641 First close the file description. */
4642
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004643static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004644sock_finalize(PySocketSockObject *s)
4645{
4646 SOCKET_T fd;
4647 PyObject *error_type, *error_value, *error_traceback;
4648
4649 /* Save the current exception, if any. */
4650 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4651
Victor Stinnerd3afb622016-07-22 17:47:09 +02004652 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004653 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4654 /* Spurious errors can appear at shutdown */
4655 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4656 PyErr_WriteUnraisable((PyObject *)s);
4657 }
4658 }
4659
4660 /* Only close the socket *after* logging the ResourceWarning warning
4661 to allow the logger to call socket methods like
4662 socket.getsockname(). If the socket is closed before, socket
4663 methods fails with the EBADF error. */
4664 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004665 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004666
4667 /* We do not want to retry upon EINTR: see sock_close() */
4668 Py_BEGIN_ALLOW_THREADS
4669 (void) SOCKETCLOSE(fd);
4670 Py_END_ALLOW_THREADS
4671 }
4672
4673 /* Restore the saved exception. */
4674 PyErr_Restore(error_type, error_value, error_traceback);
4675}
4676
4677static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004678sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004679{
Victor Stinner19a8e842016-03-21 16:36:48 +01004680 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4681 return;
4682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004684}
4685
Guido van Rossum30a685f1991-06-27 15:51:29 +00004686
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004688sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004689{
Victor Stinnere254e532014-07-26 14:36:55 +02004690 long sock_fd;
4691 /* On Windows, this test is needed because SOCKET_T is unsigned */
4692 if (s->sock_fd == INVALID_SOCKET) {
4693 sock_fd = -1;
4694 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004695#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004696 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 /* this can occur on Win64, and actually there is a special
4698 ugly printf formatter for decimal pointer length integer
4699 printing, only bother if necessary*/
4700 PyErr_SetString(PyExc_OverflowError,
4701 "no printf formatter to display "
4702 "the socket descriptor in decimal");
4703 return NULL;
4704 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004705#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004706 else
4707 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 return PyUnicode_FromFormat(
4709 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004710 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 s->sock_type,
4712 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004713}
4714
4715
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004716/* Create a new, uninitialized socket object. */
4717
4718static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004719sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 new = type->tp_alloc(type, 0);
4724 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004725 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004726 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 ((PySocketSockObject *)new)->errorhandler = &set_error;
4728 }
4729 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004730}
4731
4732
4733/* Initialize a new socket object. */
4734
Victor Stinnerdaf45552013-08-28 00:53:59 +02004735#ifdef SOCK_CLOEXEC
4736/* socket() and socketpair() fail with EINVAL on Linux kernel older
4737 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4738static int sock_cloexec_works = -1;
4739#endif
4740
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004741/*ARGSUSED*/
4742static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004743sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 PySocketSockObject *s = (PySocketSockObject *)self;
4746 PyObject *fdobj = NULL;
4747 SOCKET_T fd = INVALID_SOCKET;
4748 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4749 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004750#ifndef MS_WINDOWS
4751#ifdef SOCK_CLOEXEC
4752 int *atomic_flag_works = &sock_cloexec_works;
4753#else
4754 int *atomic_flag_works = NULL;
4755#endif
4756#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4759 "|iiiO:socket", keywords,
4760 &family, &type, &proto, &fdobj))
4761 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004764#ifdef MS_WINDOWS
4765 /* recreate a socket that was duplicated */
4766 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004767 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004768 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4769 PyErr_Format(PyExc_ValueError,
4770 "socket descriptor string has wrong size, "
4771 "should be %zu bytes.", sizeof(info));
4772 return -1;
4773 }
4774 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4775 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004776 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004777 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4778 Py_END_ALLOW_THREADS
4779 if (fd == INVALID_SOCKET) {
4780 set_error();
4781 return -1;
4782 }
4783 family = info.iAddressFamily;
4784 type = info.iSocketType;
4785 proto = info.iProtocol;
4786 }
4787 else
4788#endif
4789 {
4790 fd = PyLong_AsSocket_t(fdobj);
4791 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4792 return -1;
4793 if (fd == INVALID_SOCKET) {
4794 PyErr_SetString(PyExc_ValueError,
4795 "can't use invalid socket value");
4796 return -1;
4797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 }
4799 }
4800 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004801#ifdef MS_WINDOWS
4802 /* Windows implementation */
4803#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4804#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4805#endif
4806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004808 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004809 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004810 NULL, 0,
4811 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4812 if (fd == INVALID_SOCKET) {
4813 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4814 support_wsa_no_inherit = 0;
4815 fd = socket(family, type, proto);
4816 }
4817 }
4818 else {
4819 fd = socket(family, type, proto);
4820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 if (fd == INVALID_SOCKET) {
4824 set_error();
4825 return -1;
4826 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004827
4828 if (!support_wsa_no_inherit) {
4829 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4830 closesocket(fd);
4831 PyErr_SetFromWindowsErr(0);
4832 return -1;
4833 }
4834 }
4835#else
4836 /* UNIX */
4837 Py_BEGIN_ALLOW_THREADS
4838#ifdef SOCK_CLOEXEC
4839 if (sock_cloexec_works != 0) {
4840 fd = socket(family, type | SOCK_CLOEXEC, proto);
4841 if (sock_cloexec_works == -1) {
4842 if (fd >= 0) {
4843 sock_cloexec_works = 1;
4844 }
4845 else if (errno == EINVAL) {
4846 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4847 sock_cloexec_works = 0;
4848 fd = socket(family, type, proto);
4849 }
4850 }
4851 }
4852 else
4853#endif
4854 {
4855 fd = socket(family, type, proto);
4856 }
4857 Py_END_ALLOW_THREADS
4858
4859 if (fd == INVALID_SOCKET) {
4860 set_error();
4861 return -1;
4862 }
4863
4864 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4865 SOCKETCLOSE(fd);
4866 return -1;
4867 }
4868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004870 if (init_sockobject(s, fd, family, type, proto) == -1) {
4871 SOCKETCLOSE(fd);
4872 return -1;
4873 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004876
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004877}
4878
4879
Guido van Rossumb6775db1994-08-01 11:34:53 +00004880/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004881
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004882static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4884 "_socket.socket", /* tp_name */
4885 sizeof(PySocketSockObject), /* tp_basicsize */
4886 0, /* tp_itemsize */
4887 (destructor)sock_dealloc, /* tp_dealloc */
4888 0, /* tp_print */
4889 0, /* tp_getattr */
4890 0, /* tp_setattr */
4891 0, /* tp_reserved */
4892 (reprfunc)sock_repr, /* tp_repr */
4893 0, /* tp_as_number */
4894 0, /* tp_as_sequence */
4895 0, /* tp_as_mapping */
4896 0, /* tp_hash */
4897 0, /* tp_call */
4898 0, /* tp_str */
4899 PyObject_GenericGetAttr, /* tp_getattro */
4900 0, /* tp_setattro */
4901 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004902 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4903 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 sock_doc, /* tp_doc */
4905 0, /* tp_traverse */
4906 0, /* tp_clear */
4907 0, /* tp_richcompare */
4908 0, /* tp_weaklistoffset */
4909 0, /* tp_iter */
4910 0, /* tp_iternext */
4911 sock_methods, /* tp_methods */
4912 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004913 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 0, /* tp_base */
4915 0, /* tp_dict */
4916 0, /* tp_descr_get */
4917 0, /* tp_descr_set */
4918 0, /* tp_dictoffset */
4919 sock_initobj, /* tp_init */
4920 PyType_GenericAlloc, /* tp_alloc */
4921 sock_new, /* tp_new */
4922 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004923 0, /* tp_is_gc */
4924 0, /* tp_bases */
4925 0, /* tp_mro */
4926 0, /* tp_cache */
4927 0, /* tp_subclasses */
4928 0, /* tp_weaklist */
4929 0, /* tp_del */
4930 0, /* tp_version_tag */
4931 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004932};
4933
Guido van Rossum30a685f1991-06-27 15:51:29 +00004934
Guido van Rossum81194471991-07-27 21:42:02 +00004935/* Python interface to gethostname(). */
4936
4937/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004938static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004939socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004940{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004941#ifdef MS_WINDOWS
4942 /* Don't use winsock's gethostname, as this returns the ANSI
4943 version of the hostname, whereas we need a Unicode string.
4944 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004945 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004946 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004947 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004948 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004949
4950 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004951 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004952
4953 if (GetLastError() != ERROR_MORE_DATA)
4954 return PyErr_SetFromWindowsErr(0);
4955
4956 if (size == 0)
4957 return PyUnicode_New(0, 0);
4958
4959 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4960 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004961 name = PyMem_New(wchar_t, size);
4962 if (!name) {
4963 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004964 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004965 }
Victor Stinner74168972011-11-17 01:11:36 +01004966 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4967 name,
4968 &size))
4969 {
4970 PyMem_Free(name);
4971 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004972 }
Victor Stinner74168972011-11-17 01:11:36 +01004973
4974 result = PyUnicode_FromWideChar(name, size);
4975 PyMem_Free(name);
4976 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004977#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 char buf[1024];
4979 int res;
4980 Py_BEGIN_ALLOW_THREADS
4981 res = gethostname(buf, (int) sizeof buf - 1);
4982 Py_END_ALLOW_THREADS
4983 if (res < 0)
4984 return set_error();
4985 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004986 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004987#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004988}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004990PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004991"gethostname() -> string\n\
4992\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004993Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004994
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004995#ifdef HAVE_SETHOSTNAME
4996PyDoc_STRVAR(sethostname_doc,
4997"sethostname(name)\n\n\
4998Sets the hostname to name.");
4999
5000static PyObject *
5001socket_sethostname(PyObject *self, PyObject *args)
5002{
5003 PyObject *hnobj;
5004 Py_buffer buf;
5005 int res, flag = 0;
5006
Christian Heimesd2774c72013-06-19 02:06:29 +02005007#ifdef _AIX
5008/* issue #18259, not declared in any useful header file */
5009extern int sethostname(const char *, size_t);
5010#endif
5011
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005012 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5013 PyErr_Clear();
5014 if (!PyArg_ParseTuple(args, "O&:sethostname",
5015 PyUnicode_FSConverter, &hnobj))
5016 return NULL;
5017 flag = 1;
5018 }
5019 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5020 if (!res) {
5021 res = sethostname(buf.buf, buf.len);
5022 PyBuffer_Release(&buf);
5023 }
5024 if (flag)
5025 Py_DECREF(hnobj);
5026 if (res)
5027 return set_error();
5028 Py_RETURN_NONE;
5029}
5030#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005031
Guido van Rossum30a685f1991-06-27 15:51:29 +00005032/* Python interface to gethostbyname(name). */
5033
5034/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005035static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005036socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 char *name;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005039 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005040 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005041
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005042 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 return NULL;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005044 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005045 goto finally;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005046 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005047finally:
5048 PyMem_Free(name);
5049 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005050}
5051
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005052PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005053"gethostbyname(host) -> address\n\
5054\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005055Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005056
5057
Victor Stinner72400302016-01-28 15:41:01 +01005058static PyObject*
5059sock_decode_hostname(const char *name)
5060{
5061#ifdef MS_WINDOWS
5062 /* Issue #26227: gethostbyaddr() returns a string encoded
5063 * to the ANSI code page */
5064 return PyUnicode_DecodeFSDefault(name);
5065#else
5066 /* Decode from UTF-8 */
5067 return PyUnicode_FromString(name);
5068#endif
5069}
5070
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005071/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5072
5073static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005074gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 char **pch;
5077 PyObject *rtn_tuple = (PyObject *)NULL;
5078 PyObject *name_list = (PyObject *)NULL;
5079 PyObject *addr_list = (PyObject *)NULL;
5080 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005081 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 if (h == NULL) {
5084 /* Let's get real error message to return */
5085 set_herror(h_errno);
5086 return NULL;
5087 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 if (h->h_addrtype != af) {
5090 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005091 errno = EAFNOSUPPORT;
5092 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 return NULL;
5094 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 case AF_INET:
5099 if (alen < sizeof(struct sockaddr_in))
5100 return NULL;
5101 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005102
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005103#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 case AF_INET6:
5105 if (alen < sizeof(struct sockaddr_in6))
5106 return NULL;
5107 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005108#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 if ((name_list = PyList_New(0)) == NULL)
5113 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 if ((addr_list = PyList_New(0)) == NULL)
5116 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 /* SF #1511317: h_aliases can be NULL */
5119 if (h->h_aliases) {
5120 for (pch = h->h_aliases; *pch != NULL; pch++) {
5121 int status;
5122 tmp = PyUnicode_FromString(*pch);
5123 if (tmp == NULL)
5124 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 status = PyList_Append(name_list, tmp);
5127 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 if (status)
5130 goto err;
5131 }
5132 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5135 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 case AF_INET:
5140 {
5141 struct sockaddr_in sin;
5142 memset(&sin, 0, sizeof(sin));
5143 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005144#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005148 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 if (pch == h->h_addr_list && alen >= sizeof(sin))
5151 memcpy((char *) addr, &sin, sizeof(sin));
5152 break;
5153 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005154
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005155#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 case AF_INET6:
5157 {
5158 struct sockaddr_in6 sin6;
5159 memset(&sin6, 0, sizeof(sin6));
5160 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005161#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005165 tmp = makeipaddr((struct sockaddr *)&sin6,
5166 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5169 memcpy((char *) addr, &sin6, sizeof(sin6));
5170 break;
5171 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005172#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005175 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 "unsupported address family");
5177 return NULL;
5178 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 if (tmp == NULL)
5181 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 status = PyList_Append(addr_list, tmp);
5184 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 if (status)
5187 goto err;
5188 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005189
Victor Stinner72400302016-01-28 15:41:01 +01005190 name = sock_decode_hostname(h->h_name);
5191 if (name == NULL)
5192 goto err;
5193 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005194
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005195 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 Py_XDECREF(name_list);
5197 Py_XDECREF(addr_list);
5198 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005199}
5200
5201
5202/* Python interface to gethostbyname_ex(name). */
5203
5204/*ARGSUSED*/
5205static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005206socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 char *name;
5209 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005210 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005212 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005213#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005215#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005217#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 char buf[16384];
5219 int buf_len = (sizeof buf) - 1;
5220 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005221#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005222#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005224#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005225#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005226
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005227 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005229 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005230 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005232#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005233#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005234 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005236#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005238#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 memset((void *) &data, '\0', sizeof(data));
5240 result = gethostbyname_r(name, &hp_allocated, &data);
5241 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005242#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005243#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005244#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005246#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005247 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005249#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 Py_END_ALLOW_THREADS
5251 /* Some C libraries would require addr.__ss_family instead of
5252 addr.ss_family.
5253 Therefore, we cast the sockaddr_storage into sockaddr to
5254 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005255 sa = SAS2SA(&addr);
5256 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005258#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005260#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005261finally:
5262 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005264}
5265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005266PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005267"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5268\n\
5269Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005270for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005271
5272
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005273/* Python interface to gethostbyaddr(IP). */
5274
5275/*ARGSUSED*/
5276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005277socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005278{
Charles-François Natali8b759652011-12-23 16:44:51 +01005279 sock_addr_t addr;
5280 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 char *ip_num;
5282 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005283 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005284#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005286#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005288#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 /* glibcs up to 2.10 assume that the buf argument to
5290 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5291 does not ensure. The attribute below instructs the compiler
5292 to maintain this alignment. */
5293 char buf[16384] Py_ALIGNED(8);
5294 int buf_len = (sizeof buf) - 1;
5295 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005296#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005297#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005299#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005300#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005301 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 int al;
5303 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005304
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005305 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 return NULL;
5307 af = AF_UNSPEC;
5308 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005309 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 af = sa->sa_family;
5311 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005312 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 switch (af) {
5314 case AF_INET:
5315 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5316 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5317 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005318#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 case AF_INET6:
5320 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5321 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5322 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005325 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005326 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 }
5328 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005329#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005330#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005331 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 &hp_allocated, buf, buf_len,
5333 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005334#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 h = gethostbyaddr_r(ap, al, af,
5336 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005337#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 memset((void *) &data, '\0', sizeof(data));
5339 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5340 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005341#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005342#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005343#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005345#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005346 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005348#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005350 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005351#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005353#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005354finally:
5355 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005357}
5358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005359PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005360"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5361\n\
5362Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005363for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005364
Guido van Rossum30a685f1991-06-27 15:51:29 +00005365
5366/* Python interface to getservbyname(name).
5367 This only returns the port number, since the other info is already
5368 known or not useful (like the list of aliases). */
5369
5370/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005371static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005372socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005373{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005374 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 struct servent *sp;
5376 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5377 return NULL;
5378 Py_BEGIN_ALLOW_THREADS
5379 sp = getservbyname(name, proto);
5380 Py_END_ALLOW_THREADS
5381 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005382 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 return NULL;
5384 }
5385 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005386}
5387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005388PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005389"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005390\n\
5391Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005392The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5393otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005394
Guido van Rossum30a685f1991-06-27 15:51:29 +00005395
Barry Warsaw11b91a02004-06-28 00:50:43 +00005396/* Python interface to getservbyport(port).
5397 This only returns the service name, since the other info is already
5398 known or not useful (like the list of aliases). */
5399
5400/*ARGSUSED*/
5401static PyObject *
5402socket_getservbyport(PyObject *self, PyObject *args)
5403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005405 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 struct servent *sp;
5407 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5408 return NULL;
5409 if (port < 0 || port > 0xffff) {
5410 PyErr_SetString(
5411 PyExc_OverflowError,
5412 "getservbyport: port must be 0-65535.");
5413 return NULL;
5414 }
5415 Py_BEGIN_ALLOW_THREADS
5416 sp = getservbyport(htons((short)port), proto);
5417 Py_END_ALLOW_THREADS
5418 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005419 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 return NULL;
5421 }
5422 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005423}
5424
5425PyDoc_STRVAR(getservbyport_doc,
5426"getservbyport(port[, protocolname]) -> string\n\
5427\n\
5428Return the service name from a port number and protocol name.\n\
5429The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5430otherwise any protocol will match.");
5431
Guido van Rossum3901d851996-12-19 16:35:04 +00005432/* Python interface to getprotobyname(name).
5433 This only returns the protocol number, since the other info is
5434 already known or not useful (like the list of aliases). */
5435
5436/*ARGSUSED*/
5437static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005438socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005439{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005440 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 struct protoent *sp;
5442 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5443 return NULL;
5444 Py_BEGIN_ALLOW_THREADS
5445 sp = getprotobyname(name);
5446 Py_END_ALLOW_THREADS
5447 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005448 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005449 return NULL;
5450 }
5451 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005452}
5453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005454PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005455"getprotobyname(name) -> integer\n\
5456\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005457Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005458
Christian Heimesd0e31b92018-01-27 09:54:13 +01005459static PyObject *
5460socket_close(PyObject *self, PyObject *fdobj)
5461{
5462 SOCKET_T fd;
5463 int res;
5464
5465 fd = PyLong_AsSocket_t(fdobj);
5466 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5467 return NULL;
5468 Py_BEGIN_ALLOW_THREADS
5469 res = SOCKETCLOSE(fd);
5470 Py_END_ALLOW_THREADS
5471 /* bpo-30319: The peer can already have closed the connection.
5472 Python ignores ECONNRESET on close(). */
5473 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5474 return set_error();
5475 }
5476 Py_RETURN_NONE;
5477}
5478
5479PyDoc_STRVAR(close_doc,
5480"close(integer) -> None\n\
5481\n\
5482Close an integer socket file descriptor. This is like os.close(), but for\n\
5483sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005484
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005485#ifndef NO_DUP
5486/* dup() function for socket fds */
5487
5488static PyObject *
5489socket_dup(PyObject *self, PyObject *fdobj)
5490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 SOCKET_T fd, newfd;
5492 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005493#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005494 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005495#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 fd = PyLong_AsSocket_t(fdobj);
5498 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5499 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005500
Victor Stinnerdaf45552013-08-28 00:53:59 +02005501#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005502 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005503 return set_error();
5504
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005505 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005506 FROM_PROTOCOL_INFO,
5507 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 if (newfd == INVALID_SOCKET)
5509 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005510
Victor Stinnerdaf45552013-08-28 00:53:59 +02005511 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5512 closesocket(newfd);
5513 PyErr_SetFromWindowsErr(0);
5514 return NULL;
5515 }
5516#else
5517 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5518 newfd = _Py_dup(fd);
5519 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005520 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005521#endif
5522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 newfdobj = PyLong_FromSocket_t(newfd);
5524 if (newfdobj == NULL)
5525 SOCKETCLOSE(newfd);
5526 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005527}
5528
5529PyDoc_STRVAR(dup_doc,
5530"dup(integer) -> integer\n\
5531\n\
5532Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5533sockets; on some platforms os.dup() won't work for socket file descriptors.");
5534#endif
5535
5536
Dave Cole331708b2004-08-09 04:51:41 +00005537#ifdef HAVE_SOCKETPAIR
5538/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005539 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005540 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005541
5542/*ARGSUSED*/
5543static PyObject *
5544socket_socketpair(PyObject *self, PyObject *args)
5545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 PySocketSockObject *s0 = NULL, *s1 = NULL;
5547 SOCKET_T sv[2];
5548 int family, type = SOCK_STREAM, proto = 0;
5549 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005550#ifdef SOCK_CLOEXEC
5551 int *atomic_flag_works = &sock_cloexec_works;
5552#else
5553 int *atomic_flag_works = NULL;
5554#endif
5555 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005556
5557#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5563 &family, &type, &proto))
5564 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005567 Py_BEGIN_ALLOW_THREADS
5568#ifdef SOCK_CLOEXEC
5569 if (sock_cloexec_works != 0) {
5570 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5571 if (sock_cloexec_works == -1) {
5572 if (ret >= 0) {
5573 sock_cloexec_works = 1;
5574 }
5575 else if (errno == EINVAL) {
5576 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5577 sock_cloexec_works = 0;
5578 ret = socketpair(family, type, proto, sv);
5579 }
5580 }
5581 }
5582 else
5583#endif
5584 {
5585 ret = socketpair(family, type, proto, sv);
5586 }
5587 Py_END_ALLOW_THREADS
5588
5589 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005591
5592 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5593 goto finally;
5594 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5595 goto finally;
5596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 s0 = new_sockobject(sv[0], family, type, proto);
5598 if (s0 == NULL)
5599 goto finally;
5600 s1 = new_sockobject(sv[1], family, type, proto);
5601 if (s1 == NULL)
5602 goto finally;
5603 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005604
5605finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 if (res == NULL) {
5607 if (s0 == NULL)
5608 SOCKETCLOSE(sv[0]);
5609 if (s1 == NULL)
5610 SOCKETCLOSE(sv[1]);
5611 }
5612 Py_XDECREF(s0);
5613 Py_XDECREF(s1);
5614 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005615}
5616
5617PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005618"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005619\n\
5620Create a pair of socket objects from the sockets returned by the platform\n\
5621socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005622The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005623AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005624
5625#endif /* HAVE_SOCKETPAIR */
5626
5627
Guido van Rossum006bf911996-06-12 04:04:55 +00005628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005629socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005630{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005631 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005632
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005633 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 return NULL;
5635 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005636 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005638 "ntohs: can't convert negative Python int to C "
5639 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 return NULL;
5641 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005642 if (x > 0xffff) {
5643 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5644 "ntohs: Python int too large to convert to C "
5645 "16-bit unsigned integer (The silent truncation "
5646 "is deprecated)",
5647 1)) {
5648 return NULL;
5649 }
5650 }
5651 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005652}
5653
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005654PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005655"ntohs(integer) -> integer\n\
5656\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005657Convert a 16-bit unsigned integer from network to host byte order.\n\
5658Note that in case the received integer does not fit in 16-bit unsigned\n\
5659integer, but does fit in a positive C int, it is silently truncated to\n\
566016-bit unsigned integer.\n\
5661However, this silent truncation feature is deprecated, and will raise an \n\
5662exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005663
5664
Guido van Rossum006bf911996-06-12 04:04:55 +00005665static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005666socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 if (PyLong_Check(arg)) {
5671 x = PyLong_AsUnsignedLong(arg);
5672 if (x == (unsigned long) -1 && PyErr_Occurred())
5673 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005674#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 {
5676 unsigned long y;
5677 /* only want the trailing 32 bits */
5678 y = x & 0xFFFFFFFFUL;
5679 if (y ^ x)
5680 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005681 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 x = y;
5683 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 }
5686 else
5687 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005688 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005691}
5692
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005693PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005694"ntohl(integer) -> integer\n\
5695\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005696Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005697
5698
Guido van Rossum006bf911996-06-12 04:04:55 +00005699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005700socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005701{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005702 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005703
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005704 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 return NULL;
5706 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005707 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005709 "htons: can't convert negative Python int to C "
5710 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 return NULL;
5712 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005713 if (x > 0xffff) {
5714 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5715 "htons: Python int too large to convert to C "
5716 "16-bit unsigned integer (The silent truncation "
5717 "is deprecated)",
5718 1)) {
5719 return NULL;
5720 }
5721 }
5722 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005723}
5724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005725PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005726"htons(integer) -> integer\n\
5727\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005728Convert a 16-bit unsigned integer from host to network byte order.\n\
5729Note that in case the received integer does not fit in 16-bit unsigned\n\
5730integer, but does fit in a positive C int, it is silently truncated to\n\
573116-bit unsigned integer.\n\
5732However, this silent truncation feature is deprecated, and will raise an \n\
5733exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005734
5735
Guido van Rossum006bf911996-06-12 04:04:55 +00005736static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005737socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 if (PyLong_Check(arg)) {
5742 x = PyLong_AsUnsignedLong(arg);
5743 if (x == (unsigned long) -1 && PyErr_Occurred())
5744 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005745#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 {
5747 unsigned long y;
5748 /* only want the trailing 32 bits */
5749 y = x & 0xFFFFFFFFUL;
5750 if (y ^ x)
5751 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005752 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 x = y;
5754 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 }
5757 else
5758 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005759 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 Py_TYPE(arg)->tp_name);
5761 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005762}
5763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005764PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005765"htonl(integer) -> integer\n\
5766\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005767Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005768
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005769/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005771PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005772"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005773\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005774Convert 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 +00005775binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005776
5777static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005778socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005779{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005780#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005782#endif
5783
5784#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005785#if (SIZEOF_INT != 4)
5786#error "Not sure if in_addr_t exists and int is not 32-bits."
5787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 /* Have to use inet_addr() instead */
5789 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005790#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005791 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5794 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005795
Tim Peters1df9fdd2003-02-13 03:13:40 +00005796
5797#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005798
5799#ifdef USE_INET_ATON_WEAKLINK
5800 if (inet_aton != NULL) {
5801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 if (inet_aton(ip_addr, &buf))
5803 return PyBytes_FromStringAndSize((char *)(&buf),
5804 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005805
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005806 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 "illegal IP address string passed to inet_aton");
5808 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005809
Thomas Wouters477c8d52006-05-27 19:21:47 +00005810#ifdef USE_INET_ATON_WEAKLINK
5811 } else {
5812#endif
5813
5814#endif
5815
5816#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 /* special-case this address as inet_addr might return INADDR_NONE
5819 * for this */
5820 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005821 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005823
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005824 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005828 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 "illegal IP address string passed to inet_aton");
5830 return NULL;
5831 }
5832 }
5833 return PyBytes_FromStringAndSize((char *) &packed_addr,
5834 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005835
5836#ifdef USE_INET_ATON_WEAKLINK
5837 }
5838#endif
5839
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005840#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005841}
5842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005843PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005844"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005845\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005846Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005847
5848static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005849socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005850{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005851 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005853
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005854 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 return NULL;
5856 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005857
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005858 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005859 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005861 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 return NULL;
5863 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005864
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005865 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5866 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005867
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005868 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005870}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005871
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005872#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005873
5874PyDoc_STRVAR(inet_pton_doc,
5875"inet_pton(af, ip) -> packed IP address string\n\
5876\n\
5877Convert an IP address from string format to a packed string suitable\n\
5878for use with low-level network functions.");
5879
5880static PyObject *
5881socket_inet_pton(PyObject *self, PyObject *args)
5882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005884 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005886#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005887 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005888#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5892 return NULL;
5893 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005894
Martin v. Löwis04697e82004-06-02 12:35:29 +00005895#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005897 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 "can't use AF_INET6, IPv6 is disabled");
5899 return NULL;
5900 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005901#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 retval = inet_pton(af, ip, packed);
5904 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005905 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 return NULL;
5907 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005908 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 "illegal IP address string passed to inet_pton");
5910 return NULL;
5911 } else if (af == AF_INET) {
5912 return PyBytes_FromStringAndSize(packed,
5913 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005914#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 } else if (af == AF_INET6) {
5916 return PyBytes_FromStringAndSize(packed,
5917 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005920 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 return NULL;
5922 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005923}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005924
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005925PyDoc_STRVAR(inet_ntop_doc,
5926"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5927\n\
5928Convert a packed IP address of the given family to string format.");
5929
5930static PyObject *
5931socket_inet_ntop(PyObject *self, PyObject *args)
5932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005934 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005936#ifdef ENABLE_IPV6
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005937 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005938#else
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005939 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005940#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005941
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005942 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5943 memset((void *) &ip[0], '\0', sizeof(ip));
5944
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005945 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 return NULL;
5947 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005950 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 PyErr_SetString(PyExc_ValueError,
5952 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005953 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 return NULL;
5955 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005956#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005958 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 PyErr_SetString(PyExc_ValueError,
5960 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005961 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 return NULL;
5963 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 } else {
5966 PyErr_Format(PyExc_ValueError,
5967 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005968 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 return NULL;
5970 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005971
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005972 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5973 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005975 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 return NULL;
5977 } else {
5978 return PyUnicode_FromString(retval);
5979 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005980}
5981
5982#endif /* HAVE_INET_PTON */
5983
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005984/* Python interface to getaddrinfo(host, port). */
5985
5986/*ARGSUSED*/
5987static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005988socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005989{
Victor Stinner77af1722011-05-26 14:05:59 +02005990 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005991 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 struct addrinfo hints, *res;
5993 struct addrinfo *res0 = NULL;
5994 PyObject *hobj = NULL;
5995 PyObject *pobj = (PyObject *)NULL;
5996 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005997 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 int family, socktype, protocol, flags;
5999 int error;
6000 PyObject *all = (PyObject *)NULL;
6001 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006002
Georg Brandl6083a4b2013-10-14 06:51:46 +02006003 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006005 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006006 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 &protocol, &flags)) {
6008 return NULL;
6009 }
6010 if (hobj == Py_None) {
6011 hptr = NULL;
6012 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006013 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if (!idna)
6015 return NULL;
6016 assert(PyBytes_Check(idna));
6017 hptr = PyBytes_AS_STRING(idna);
6018 } else if (PyBytes_Check(hobj)) {
6019 hptr = PyBytes_AsString(hobj);
6020 } else {
6021 PyErr_SetString(PyExc_TypeError,
6022 "getaddrinfo() argument 1 must be string or None");
6023 return NULL;
6024 }
6025 if (PyLong_CheckExact(pobj)) {
6026 long value = PyLong_AsLong(pobj);
6027 if (value == -1 && PyErr_Occurred())
6028 goto err;
6029 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6030 pptr = pbuf;
6031 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006032 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006033 if (pptr == NULL)
6034 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006036 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 } else if (pobj == Py_None) {
6038 pptr = (char *)NULL;
6039 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006040 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 goto err;
6042 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006043#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006044 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6045 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006046 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6047 * This workaround avoids a segfault in libsystem.
6048 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006049 pptr = "00";
6050 }
6051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 memset(&hints, 0, sizeof(hints));
6053 hints.ai_family = family;
6054 hints.ai_socktype = socktype;
6055 hints.ai_protocol = protocol;
6056 hints.ai_flags = flags;
6057 Py_BEGIN_ALLOW_THREADS
6058 ACQUIRE_GETADDRINFO_LOCK
6059 error = getaddrinfo(hptr, pptr, &hints, &res0);
6060 Py_END_ALLOW_THREADS
6061 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6062 if (error) {
6063 set_gaierror(error);
6064 goto err;
6065 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006066
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006067 all = PyList_New(0);
6068 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 goto err;
6070 for (res = res0; res; res = res->ai_next) {
6071 PyObject *single;
6072 PyObject *addr =
6073 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6074 if (addr == NULL)
6075 goto err;
6076 single = Py_BuildValue("iiisO", res->ai_family,
6077 res->ai_socktype, res->ai_protocol,
6078 res->ai_canonname ? res->ai_canonname : "",
6079 addr);
6080 Py_DECREF(addr);
6081 if (single == NULL)
6082 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 if (PyList_Append(all, single))
6085 goto err;
6086 Py_XDECREF(single);
6087 }
6088 Py_XDECREF(idna);
6089 if (res0)
6090 freeaddrinfo(res0);
6091 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006092 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 Py_XDECREF(all);
6094 Py_XDECREF(idna);
6095 if (res0)
6096 freeaddrinfo(res0);
6097 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006098}
6099
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006100PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006101"getaddrinfo(host, port [, family, type, proto, flags])\n\
6102 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006103\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006104Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006105
6106/* Python interface to getnameinfo(sa, flags). */
6107
6108/*ARGSUSED*/
6109static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006110socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 PyObject *sa = (PyObject *)NULL;
6113 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006114 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006115 int port;
6116 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6118 struct addrinfo hints, *res = NULL;
6119 int error;
6120 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006121 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 flags = flowinfo = scope_id = 0;
6124 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6125 return NULL;
6126 if (!PyTuple_Check(sa)) {
6127 PyErr_SetString(PyExc_TypeError,
6128 "getnameinfo() argument 1 must be a tuple");
6129 return NULL;
6130 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006131 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006133 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006135 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006136 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006137 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006138 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006139 return NULL;
6140 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6142 memset(&hints, 0, sizeof(hints));
6143 hints.ai_family = AF_UNSPEC;
6144 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006145 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 Py_BEGIN_ALLOW_THREADS
6147 ACQUIRE_GETADDRINFO_LOCK
6148 error = getaddrinfo(hostp, pbuf, &hints, &res);
6149 Py_END_ALLOW_THREADS
6150 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6151 if (error) {
6152 set_gaierror(error);
6153 goto fail;
6154 }
6155 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006156 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 "sockaddr resolved to multiple addresses");
6158 goto fail;
6159 }
6160 switch (res->ai_family) {
6161 case AF_INET:
6162 {
6163 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006164 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 "IPv4 sockaddr must be 2 tuple");
6166 goto fail;
6167 }
6168 break;
6169 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006170#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 case AF_INET6:
6172 {
6173 struct sockaddr_in6 *sin6;
6174 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006175 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 sin6->sin6_scope_id = scope_id;
6177 break;
6178 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006181 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6183 if (error) {
6184 set_gaierror(error);
6185 goto fail;
6186 }
Victor Stinner72400302016-01-28 15:41:01 +01006187
6188 name = sock_decode_hostname(hbuf);
6189 if (name == NULL)
6190 goto fail;
6191 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006192
6193fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 if (res)
6195 freeaddrinfo(res);
6196 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006197}
6198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006199PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006200"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006201\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006202Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006203
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006204
6205/* Python API to getting and setting the default timeout value. */
6206
6207static PyObject *
6208socket_getdefaulttimeout(PyObject *self)
6209{
Victor Stinner71694d52015-03-28 01:18:54 +01006210 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006211 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 }
Victor Stinner71694d52015-03-28 01:18:54 +01006213 else {
6214 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6215 return PyFloat_FromDouble(seconds);
6216 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006217}
6218
6219PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006220"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006221\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006222Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006223A value of None indicates that new socket objects have no timeout.\n\
6224When the socket module is first imported, the default is None.");
6225
6226static PyObject *
6227socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6228{
Victor Stinner71694d52015-03-28 01:18:54 +01006229 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006230
Victor Stinner71694d52015-03-28 01:18:54 +01006231 if (socket_parse_timeout(&timeout, arg) < 0)
6232 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006235
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006236 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006237}
6238
6239PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006240"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006241\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006242Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006243A value of None indicates that new socket objects have no timeout.\n\
6244When the socket module is first imported, the default is None.");
6245
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006246#ifdef HAVE_IF_NAMEINDEX
6247/* Python API for getting interface indices and names */
6248
6249static PyObject *
6250socket_if_nameindex(PyObject *self, PyObject *arg)
6251{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006252 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006253 int i;
6254 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006255
Charles-François Natali60713592011-05-20 16:55:06 +02006256 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006257 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006258 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006259 return NULL;
6260 }
6261
6262 list = PyList_New(0);
6263 if (list == NULL) {
6264 if_freenameindex(ni);
6265 return NULL;
6266 }
6267
Charles-François Natali60713592011-05-20 16:55:06 +02006268 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6269 PyObject *ni_tuple = Py_BuildValue("IO&",
6270 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006271
6272 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6273 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006274 Py_DECREF(list);
6275 if_freenameindex(ni);
6276 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006277 }
6278 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006279 }
6280
6281 if_freenameindex(ni);
6282 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006283}
6284
6285PyDoc_STRVAR(if_nameindex_doc,
6286"if_nameindex()\n\
6287\n\
6288Returns a list of network interface information (index, name) tuples.");
6289
Charles-François Natali60713592011-05-20 16:55:06 +02006290static PyObject *
6291socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006292{
Charles-François Natali60713592011-05-20 16:55:06 +02006293 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006294 unsigned long index;
6295
Charles-François Natali60713592011-05-20 16:55:06 +02006296 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6297 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006298 return NULL;
6299
Charles-François Natali60713592011-05-20 16:55:06 +02006300 index = if_nametoindex(PyBytes_AS_STRING(oname));
6301 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006302 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006303 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006304 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006305 return NULL;
6306 }
6307
6308 return PyLong_FromUnsignedLong(index);
6309}
6310
6311PyDoc_STRVAR(if_nametoindex_doc,
6312"if_nametoindex(if_name)\n\
6313\n\
6314Returns the interface index corresponding to the interface name if_name.");
6315
Charles-François Natali60713592011-05-20 16:55:06 +02006316static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006317socket_if_indextoname(PyObject *self, PyObject *arg)
6318{
Charles-François Natali60713592011-05-20 16:55:06 +02006319 unsigned long index;
6320 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006321
Charles-François Natali60713592011-05-20 16:55:06 +02006322 index = PyLong_AsUnsignedLong(arg);
6323 if (index == (unsigned long) -1)
6324 return NULL;
6325
6326 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006327 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006328 return NULL;
6329 }
6330
Charles-François Natali60713592011-05-20 16:55:06 +02006331 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006332}
6333
6334PyDoc_STRVAR(if_indextoname_doc,
6335"if_indextoname(if_index)\n\
6336\n\
6337Returns the interface name corresponding to the interface index if_index.");
6338
6339#endif /* HAVE_IF_NAMEINDEX */
6340
6341
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006342#ifdef CMSG_LEN
6343/* Python interface to CMSG_LEN(length). */
6344
6345static PyObject *
6346socket_CMSG_LEN(PyObject *self, PyObject *args)
6347{
6348 Py_ssize_t length;
6349 size_t result;
6350
6351 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6352 return NULL;
6353 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6354 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6355 return NULL;
6356 }
6357 return PyLong_FromSize_t(result);
6358}
6359
6360PyDoc_STRVAR(CMSG_LEN_doc,
6361"CMSG_LEN(length) -> control message length\n\
6362\n\
6363Return the total length, without trailing padding, of an ancillary\n\
6364data item with associated data of the given length. This value can\n\
6365often be used as the buffer size for recvmsg() to receive a single\n\
6366item of ancillary data, but RFC 3542 requires portable applications to\n\
6367use CMSG_SPACE() and thus include space for padding, even when the\n\
6368item will be the last in the buffer. Raises OverflowError if length\n\
6369is outside the permissible range of values.");
6370
6371
6372#ifdef CMSG_SPACE
6373/* Python interface to CMSG_SPACE(length). */
6374
6375static PyObject *
6376socket_CMSG_SPACE(PyObject *self, PyObject *args)
6377{
6378 Py_ssize_t length;
6379 size_t result;
6380
6381 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6382 return NULL;
6383 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6384 PyErr_SetString(PyExc_OverflowError,
6385 "CMSG_SPACE() argument out of range");
6386 return NULL;
6387 }
6388 return PyLong_FromSize_t(result);
6389}
6390
6391PyDoc_STRVAR(CMSG_SPACE_doc,
6392"CMSG_SPACE(length) -> buffer size\n\
6393\n\
6394Return the buffer size needed for recvmsg() to receive an ancillary\n\
6395data item with associated data of the given length, along with any\n\
6396trailing padding. The buffer space needed to receive multiple items\n\
6397is the sum of the CMSG_SPACE() values for their associated data\n\
6398lengths. Raises OverflowError if length is outside the permissible\n\
6399range of values.");
6400#endif /* CMSG_SPACE */
6401#endif /* CMSG_LEN */
6402
6403
Guido van Rossum30a685f1991-06-27 15:51:29 +00006404/* List of functions exported by this module. */
6405
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006406static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 {"gethostbyname", socket_gethostbyname,
6408 METH_VARARGS, gethostbyname_doc},
6409 {"gethostbyname_ex", socket_gethostbyname_ex,
6410 METH_VARARGS, ghbn_ex_doc},
6411 {"gethostbyaddr", socket_gethostbyaddr,
6412 METH_VARARGS, gethostbyaddr_doc},
6413 {"gethostname", socket_gethostname,
6414 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006415#ifdef HAVE_SETHOSTNAME
6416 {"sethostname", socket_sethostname,
6417 METH_VARARGS, sethostname_doc},
6418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 {"getservbyname", socket_getservbyname,
6420 METH_VARARGS, getservbyname_doc},
6421 {"getservbyport", socket_getservbyport,
6422 METH_VARARGS, getservbyport_doc},
6423 {"getprotobyname", socket_getprotobyname,
6424 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006425 {"close", socket_close,
6426 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006427#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 {"dup", socket_dup,
6429 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006430#endif
Dave Cole331708b2004-08-09 04:51:41 +00006431#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 {"socketpair", socket_socketpair,
6433 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 {"ntohs", socket_ntohs,
6436 METH_VARARGS, ntohs_doc},
6437 {"ntohl", socket_ntohl,
6438 METH_O, ntohl_doc},
6439 {"htons", socket_htons,
6440 METH_VARARGS, htons_doc},
6441 {"htonl", socket_htonl,
6442 METH_O, htonl_doc},
6443 {"inet_aton", socket_inet_aton,
6444 METH_VARARGS, inet_aton_doc},
6445 {"inet_ntoa", socket_inet_ntoa,
6446 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006447#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 {"inet_pton", socket_inet_pton,
6449 METH_VARARGS, inet_pton_doc},
6450 {"inet_ntop", socket_inet_ntop,
6451 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006452#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006453 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6454 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 {"getnameinfo", socket_getnameinfo,
6456 METH_VARARGS, getnameinfo_doc},
6457 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6458 METH_NOARGS, getdefaulttimeout_doc},
6459 {"setdefaulttimeout", socket_setdefaulttimeout,
6460 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006461#ifdef HAVE_IF_NAMEINDEX
6462 {"if_nameindex", socket_if_nameindex,
6463 METH_NOARGS, if_nameindex_doc},
6464 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006465 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006466 {"if_indextoname", socket_if_indextoname,
6467 METH_O, if_indextoname_doc},
6468#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006469#ifdef CMSG_LEN
6470 {"CMSG_LEN", socket_CMSG_LEN,
6471 METH_VARARGS, CMSG_LEN_doc},
6472#ifdef CMSG_SPACE
6473 {"CMSG_SPACE", socket_CMSG_SPACE,
6474 METH_VARARGS, CMSG_SPACE_doc},
6475#endif
6476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006478};
6479
Guido van Rossum30a685f1991-06-27 15:51:29 +00006480
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006481#ifdef MS_WINDOWS
6482#define OS_INIT_DEFINED
6483
6484/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006485
6486static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006487os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006490}
6491
6492static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006493os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 WSADATA WSAData;
6496 int ret;
6497 ret = WSAStartup(0x0101, &WSAData);
6498 switch (ret) {
6499 case 0: /* No error */
6500 Py_AtExit(os_cleanup);
6501 return 1; /* Success */
6502 case WSASYSNOTREADY:
6503 PyErr_SetString(PyExc_ImportError,
6504 "WSAStartup failed: network not ready");
6505 break;
6506 case WSAVERNOTSUPPORTED:
6507 case WSAEINVAL:
6508 PyErr_SetString(
6509 PyExc_ImportError,
6510 "WSAStartup failed: requested version not supported");
6511 break;
6512 default:
6513 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6514 break;
6515 }
6516 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006517}
6518
Guido van Rossum8d665e61996-06-26 18:22:49 +00006519#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006520
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006521
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006522
6523#ifndef OS_INIT_DEFINED
6524static int
6525os_init(void)
6526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006528}
6529#endif
6530
6531
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006532/* C API table - always add new things to the end for binary
6533 compatibility. */
6534static
6535PySocketModule_APIObject PySocketModuleAPI =
6536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006538 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006540};
6541
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006542
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006543/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006544
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006545 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006546 "socket.py" which implements some additional functionality.
6547 The import of "_socket" may fail with an ImportError exception if
6548 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006549 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006550 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006551*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006553PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006554"Implementation module for socket operations.\n\
6555\n\
6556See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006557
Martin v. Löwis1a214512008-06-11 05:26:20 +00006558static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 PyModuleDef_HEAD_INIT,
6560 PySocket_MODULE_NAME,
6561 socket_doc,
6562 -1,
6563 socket_methods,
6564 NULL,
6565 NULL,
6566 NULL,
6567 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006568};
6569
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006570PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006571PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 if (!os_init())
6576 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006577
Victor Stinnerdaf45552013-08-28 00:53:59 +02006578#ifdef MS_WINDOWS
6579 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006580 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006581 }
6582#endif
6583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 Py_TYPE(&sock_type) = &PyType_Type;
6585 m = PyModule_Create(&socketmodule);
6586 if (m == NULL)
6587 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006588
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006589 Py_INCREF(PyExc_OSError);
6590 PySocketModuleAPI.error = PyExc_OSError;
6591 Py_INCREF(PyExc_OSError);
6592 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006594 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 if (socket_herror == NULL)
6596 return NULL;
6597 Py_INCREF(socket_herror);
6598 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006599 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 NULL);
6601 if (socket_gaierror == NULL)
6602 return NULL;
6603 Py_INCREF(socket_gaierror);
6604 PyModule_AddObject(m, "gaierror", socket_gaierror);
6605 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006606 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 if (socket_timeout == NULL)
6608 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006609 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 Py_INCREF(socket_timeout);
6611 PyModule_AddObject(m, "timeout", socket_timeout);
6612 Py_INCREF((PyObject *)&sock_type);
6613 if (PyModule_AddObject(m, "SocketType",
6614 (PyObject *)&sock_type) != 0)
6615 return NULL;
6616 Py_INCREF((PyObject *)&sock_type);
6617 if (PyModule_AddObject(m, "socket",
6618 (PyObject *)&sock_type) != 0)
6619 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006620
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006621#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006623#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 Py_INCREF(has_ipv6);
6627 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 /* Export C API */
6630 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6631 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6632 ) != 0)
6633 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006636#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006638#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006640#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006642#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006643#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006646#endif
6647#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#endif
6650#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006653#endif
6654#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006657#endif
6658#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006661#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006662#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006665#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006666#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006669#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006670#ifdef HAVE_SOCKADDR_ALG
6671 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6672#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006673#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006676#endif
6677#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006679#endif
6680#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006683#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006684#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006687#endif
6688#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006691#endif
6692#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006695#endif
6696#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006699#endif
6700#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, AF_NETLINK);
6703 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006704#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006706#endif
6707#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006709#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6711 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006712#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006714#endif
6715#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006717#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006718#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006720#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006721#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006723#endif
6724#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006726#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006728#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006730#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006731#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006733#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006734#ifdef NETLINK_CRYPTO
6735 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6736#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006737#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006738
6739#ifdef AF_VSOCK
6740 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6741 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6742 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6743 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6744 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6745 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6746 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6747 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6748 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6749#endif
6750
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006751#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006754#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006755#ifdef AF_LINK
6756 PyModule_AddIntMacro(m, AF_LINK);
6757#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006758#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006761#endif
6762#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006765#endif
6766#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006769#endif
6770#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006771 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006773#endif
6774#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006777#endif
6778#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006781#endif
6782#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006785#endif
6786#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006789#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006790
Hye-Shik Chang81268602004-02-02 06:05:24 +00006791#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6793 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6794 PyModule_AddIntMacro(m, BTPROTO_HCI);
6795 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006796#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006798#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006799#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006800#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006802#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6804 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006805#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6808 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006809#endif
6810
Charles-François Natali47413c12011-10-06 19:47:44 +02006811#ifdef AF_CAN
6812 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006814#endif
6815#ifdef PF_CAN
6816 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006818#endif
6819
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006820/* Reliable Datagram Sockets */
6821#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006823#endif
6824#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006826#endif
6827
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006828/* Kernel event messages */
6829#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006831#endif
6832#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006834#endif
6835
Antoine Pitroub156a462010-10-27 20:13:57 +00006836#ifdef AF_PACKET
6837 PyModule_AddIntMacro(m, AF_PACKET);
6838#endif
6839#ifdef PF_PACKET
6840 PyModule_AddIntMacro(m, PF_PACKET);
6841#endif
6842#ifdef PACKET_HOST
6843 PyModule_AddIntMacro(m, PACKET_HOST);
6844#endif
6845#ifdef PACKET_BROADCAST
6846 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6847#endif
6848#ifdef PACKET_MULTICAST
6849 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6850#endif
6851#ifdef PACKET_OTHERHOST
6852 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6853#endif
6854#ifdef PACKET_OUTGOING
6855 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6856#endif
6857#ifdef PACKET_LOOPBACK
6858 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6859#endif
6860#ifdef PACKET_FASTROUTE
6861 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006862#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006863
Christian Heimes043d6f62008-01-07 17:19:16 +00006864#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6869 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6870 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006871
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6873 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6874 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, SOL_TIPC);
6878 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6879 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6880 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6881 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006882
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6884 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6885 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6886 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6890 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006891#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006894#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6896 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6897 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6898 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6899 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6900 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006901#endif
6902
Christian Heimesdffa3942016-09-05 23:54:41 +02006903#ifdef HAVE_SOCKADDR_ALG
6904 /* Socket options */
6905 PyModule_AddIntMacro(m, ALG_SET_KEY);
6906 PyModule_AddIntMacro(m, ALG_SET_IV);
6907 PyModule_AddIntMacro(m, ALG_SET_OP);
6908 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6909 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6910 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6911
6912 /* Operations */
6913 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6914 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6915 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6916 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6917#endif
6918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SOCK_STREAM);
6921 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006922/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006923#ifdef SOCK_RAW
6924 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006926#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006928#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006930#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006931#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006933#endif
6934#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006936#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006946#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006947#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006948 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006949#endif
6950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006969#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006972#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006983#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006986#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006995#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007000#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007001#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007003#endif
7004#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007006#endif
7007#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007009#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007010#ifdef SO_PASSSEC
7011 PyModule_AddIntMacro(m, SO_PASSSEC);
7012#endif
7013#ifdef SO_PEERSEC
7014 PyModule_AddIntMacro(m, SO_PEERSEC);
7015#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007016#ifdef SO_BINDTODEVICE
7017 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7018#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007019#ifdef SO_PRIORITY
7020 PyModule_AddIntMacro(m, SO_PRIORITY);
7021#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007022#ifdef SO_MARK
7023 PyModule_AddIntMacro(m, SO_MARK);
7024#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007025#ifdef SO_DOMAIN
7026 PyModule_AddIntMacro(m, SO_DOMAIN);
7027#endif
7028#ifdef SO_PROTOCOL
7029 PyModule_AddIntMacro(m, SO_PROTOCOL);
7030#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032 /* Maximum number of connections for "listen" */
7033#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007035#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007037#endif
7038
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007039 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007040#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007042#endif
7043#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007045#endif
7046#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007048#endif
7049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050 /* Flags for send, recv */
7051#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007057#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007060#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007066#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007080#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007081#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007083#endif
7084#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007086#endif
7087#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007089#endif
7090#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007092#endif
7093#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007094 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007095#endif
7096#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007098#endif
7099#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007101#endif
7102#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007104#endif
7105#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007107#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007108#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007110#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112 /* Protocol level and numbers, usable for [gs]etsockopt */
7113#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007121#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007124#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007143#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007145#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007146#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007148#endif
7149#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7151 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007152#endif
7153#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7155 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7156 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007157
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7159 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7160 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007161#ifdef CAN_ISOTP
7162 PyModule_AddIntMacro(m, CAN_ISOTP);
7163#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007164#endif
7165#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7167 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7168 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7169 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007170#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007171#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7172 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7173#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007174#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007176 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7177 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7178 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7179 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7180 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7181 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7182 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7183 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7184 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7185 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7186 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7187 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7188#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007189#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007191#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007192#ifdef HAVE_SOCKADDR_ALG
7193 PyModule_AddIntMacro(m, SOL_ALG);
7194#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007195#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007197#endif
7198#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007200#endif
7201#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007203#endif
7204#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007206#endif
7207#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007209#endif
7210#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007215#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007243#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007254#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007284#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007313#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007314#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007319#endif
7320/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007328#endif
7329
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007330#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007332#endif
7333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 /* Some port configuration */
7335#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007344#endif
7345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346 /* Some reserved IP v.4 addresses */
7347#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007354#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007359#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007364#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef INADDR_ALLHOSTS_GROUP
7368 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7369 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007370#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007375#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007376 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007380#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007382#endif
7383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384 /* IPv4 [gs]etsockopt options */
7385#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007391#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007394#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007432#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007433#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007435#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7438#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007441#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007456 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007457#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007463#endif
7464#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007466#endif
7467#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007469#endif
7470#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007472#endif
7473#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007475#endif
7476#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007478#endif
7479#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007481#endif
7482#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007484#endif
7485#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007487#endif
7488#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007490#endif
7491#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007493#endif
7494#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007496#endif
7497#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007499#endif
7500#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007502#endif
7503#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007505#endif
7506#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007508#endif
7509#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007511#endif
7512#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007514#endif
7515#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007517#endif
7518#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007520#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522 /* TCP options */
7523#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007541#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007553#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007558#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007559#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007561#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007562#ifdef TCP_CONGESTION
7563 PyModule_AddIntMacro(m, TCP_CONGESTION);
7564#endif
7565#ifdef TCP_USER_TIMEOUT
7566 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7567#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007568#ifdef TCP_NOTSENT_LOWAT
7569 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7570#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007572 /* IPX options */
7573#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007575#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007576
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007577/* Reliable Datagram Sockets */
7578#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007580#endif
7581#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007583#endif
7584#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007586#endif
7587#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007589#endif
7590#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007592#endif
7593#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007595#endif
7596#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007598#endif
7599#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007601#endif
7602#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007604#endif
7605#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007607#endif
7608#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007610#endif
7611#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007613#endif
7614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007618#endif
7619#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007621#endif
7622#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007624#endif
7625#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007627#endif
7628#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007630#endif
7631#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007633#endif
7634#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007636#endif
7637#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007639#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007640#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007642#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007643#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007645#endif
7646#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007648#endif
7649#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007651#endif
7652#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007654#endif
7655#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007657#endif
7658#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007660#endif
7661#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007663#endif
7664#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007666#endif
7667#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007669#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007670#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007672#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007675#endif
7676#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007678#endif
7679#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007681#endif
7682#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007684#endif
7685#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007687#endif
7688#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007690#endif
7691#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007693#endif
7694#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007696#endif
7697#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007699#endif
7700#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007702#endif
7703#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007705#endif
7706#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007708#endif
7709#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007711#endif
7712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007713 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007714#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007716#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007718#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007719 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007720#endif
7721#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007723#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007725#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007727#endif
7728#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007729 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007730#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007731 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007732#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007734#endif
7735
Christian Heimesfaf2f632008-01-06 16:59:19 +00007736#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007737 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007738 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7739#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007740 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007741#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007742 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007743 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7744#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007745 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007746#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007747 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007749 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007750 PyObject *tmp;
7751 tmp = PyLong_FromUnsignedLong(codes[i]);
7752 if (tmp == NULL)
7753 return NULL;
7754 PyModule_AddObject(m, names[i], tmp);
7755 }
7756 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007757 PyModule_AddIntMacro(m, RCVALL_OFF);
7758 PyModule_AddIntMacro(m, RCVALL_ON);
7759 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007760#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007761 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007762#endif
7763#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007765#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007766#endif /* _MSTCPIP_ */
7767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007768 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007769#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007770 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007772 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007773}