blob: d52d9db743a67ff59c6e676e7ee7f303675408a6 [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#if defined(_MSC_VER) && _MSC_VER >= 1800
301/* Provides the IsWindows7SP1OrGreater() function */
302#include <VersionHelpers.h>
303#endif
304
Jeremy Hylton22308652001-02-02 03:23:09 +0000305#endif
306
Skip Montanaro7befb992004-02-10 16:50:21 +0000307#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000308
Neal Norwitz39d22e52002-11-02 19:55:21 +0000309#ifndef O_NONBLOCK
310# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000311#endif
312
Trent Micka708d6e2004-09-07 17:48:26 +0000313/* include Python's addrinfo.h unless it causes trouble */
314#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
315 /* Do not include addinfo.h on some newer IRIX versions.
316 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
317 * for example, but not by 6.5.10.
318 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000319#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000320 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
321 * EAI_* constants are defined in (the already included) ws2tcpip.h.
322 */
323#else
324# include "addrinfo.h"
325#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000326
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#ifdef __APPLE__
328/* On OS X, getaddrinfo returns no error indication of lookup
329 failure, so we must use the emulation instead of the libinfo
330 implementation. Unfortunately, performing an autoconf test
331 for this bug would require DNS access for the machine performing
332 the configuration, which is not acceptable. Therefore, we
333 determine the bug just by checking for __APPLE__. If this bug
334 gets ever fixed, perhaps checking for sys/version.h would be
335 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600337/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000338 Find to check for Jaguar is that it has getnameinfo(), which
339 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000342
343#ifdef HAVE_INET_ATON
344#define USE_INET_ATON_WEAKLINK
345#endif
346
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000351/* avoid clashes with the C library definition of the symbol. */
352#define getaddrinfo fake_getaddrinfo
353#define gai_strerror fake_gai_strerror
354#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355#include "getaddrinfo.c"
356#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359#include "getnameinfo.c"
360#endif
361
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000362#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000363#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000364#endif
365
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000366#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000367#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000368#define EAFNOSUPPORT WSAEAFNOSUPPORT
369#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000370#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000371
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000372#ifndef SOCKETCLOSE
373#define SOCKETCLOSE close
374#endif
375
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000376#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000377#define USE_BLUETOOTH 1
378#if defined(__FreeBSD__)
379#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
380#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000381#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000382#define SOL_HCI SOL_HCI_RAW
383#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define sockaddr_l2 sockaddr_l2cap
385#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000386#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000387#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
388#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000389#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000390#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define sockaddr_l2 sockaddr_bt
392#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000395#define SOL_HCI BTPROTO_HCI
396#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
398#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000399#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000401#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
403#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000405#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
406#endif
407#endif
408
Charles-François Natali8b759652011-12-23 16:44:51 +0100409/* Convert "sock_addr_t *" to "struct sockaddr *". */
410#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000411
Martin v. Löwise9416172003-05-03 10:12:45 +0000412/*
413 * Constants for getnameinfo()
414 */
415#if !defined(NI_MAXHOST)
416#define NI_MAXHOST 1025
417#endif
418#if !defined(NI_MAXSERV)
419#define NI_MAXSERV 32
420#endif
421
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000422#ifndef INVALID_SOCKET /* MS defines this */
423#define INVALID_SOCKET (-1)
424#endif
425
Charles-François Natali0cc86852013-09-13 19:53:08 +0200426#ifndef INADDR_NONE
427#define INADDR_NONE (-1)
428#endif
429
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000430/* XXX There's a problem here: *static* functions are not supposed to have
431 a Py prefix (or use CapitalizedWords). Later... */
432
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433/* Global variable holding the exception type for errors detected
434 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000435static PyObject *socket_herror;
436static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000437static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438
Tim Peters643a7fc2002-02-17 04:13:21 +0000439/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000440 The sock_type variable contains pointers to various functions,
441 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000442 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000443static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000444
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000445#if defined(HAVE_POLL_H)
446#include <poll.h>
447#elif defined(HAVE_SYS_POLL_H)
448#include <sys/poll.h>
449#endif
450
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451/* Largest value to try to store in a socklen_t (used when handling
452 ancillary data). POSIX requires socklen_t to hold at least
453 (2**31)-1 and recommends against storing larger values, but
454 socklen_t was originally int in the BSD interface, so to be on the
455 safe side we use the smaller of (2**31)-1 and INT_MAX. */
456#if INT_MAX > 0x7fffffff
457#define SOCKLEN_T_LIMIT 0x7fffffff
458#else
459#define SOCKLEN_T_LIMIT INT_MAX
460#endif
461
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200462#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463/* Instead of select(), we'll use poll() since poll() works on any fd. */
464#define IS_SELECTABLE(s) 1
465/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000466#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200467/* If there's no timeout left, we don't have to call select, so it's a safe,
468 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100469#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000470#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471
472static PyObject*
473select_error(void)
474{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200475 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000477}
478
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000479#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000480#ifndef WSAEAGAIN
481#define WSAEAGAIN WSAEWOULDBLOCK
482#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000483#define CHECK_ERRNO(expected) \
484 (WSAGetLastError() == WSA ## expected)
485#else
486#define CHECK_ERRNO(expected) \
487 (errno == expected)
488#endif
489
Victor Stinnerdaf45552013-08-28 00:53:59 +0200490#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200491# define GET_SOCK_ERROR WSAGetLastError()
492# define SET_SOCK_ERROR(err) WSASetLastError(err)
493# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
494# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300495# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200496#else
497# define GET_SOCK_ERROR errno
498# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
499# define SOCK_TIMEOUT_ERR EWOULDBLOCK
500# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300501# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200502#endif
503
504
505#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200506/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
507static int support_wsa_no_inherit = -1;
508#endif
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510/* Convenience function to raise an error according to errno
511 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512
Guido van Rossum73624e91994-10-10 17:59:00 +0000513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000514set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000515{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000516#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 int err_no = WSAGetLastError();
518 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
519 recognizes the error codes used by both GetLastError() and
520 WSAGetLastError */
521 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200522 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000523#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000524
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200525 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526}
527
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000530set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000533
534#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 if (v != NULL) {
540 PyErr_SetObject(socket_herror, v);
541 Py_DECREF(v);
542 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545}
546
547
548static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000549set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552
Martin v. Löwis272cb402002-03-01 08:31:07 +0000553#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* EAI_SYSTEM is not available on Windows XP. */
555 if (error == EAI_SYSTEM)
556 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000557#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000559#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 if (v != NULL) {
565 PyErr_SetObject(socket_gaierror, v);
566 Py_DECREF(v);
567 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570}
571
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000572/* Function to perform the setting of socket blocking mode
573 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000574static int
575internal_setblocking(PySocketSockObject *s, int block)
576{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400577 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200578#ifdef MS_WINDOWS
579 u_long arg;
580#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100581#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100582 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100583 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100588#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200590 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400591 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100592#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200594 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400595 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100597 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 else
Victor Stinner9a954832013-12-04 00:41:24 +0100599 new_delay_flag = delay_flag | O_NONBLOCK;
600 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200601 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400602 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100603#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200605 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200606 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400607 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400609
610 result = 0;
611
612 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614
Yury Selivanovfa22b292016-10-18 16:03:52 -0400615 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200616#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400617 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200618#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400619 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200620#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400621 }
622
623 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624}
625
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000626static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200627internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
628 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100631#ifdef HAVE_POLL
632 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200633 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100634#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200635 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200636 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100637#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000638
Victor Stinnerb7df3142015-03-27 22:59:32 +0100639 /* must be called with the GIL held */
640 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100641
Victor Stinner416f2e62015-03-31 13:56:29 +0200642 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200643 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200646 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 /* Prefer poll, if available, since you can poll() any fd
650 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000651#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100652 pollfd.fd = s->sock_fd;
653 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200654 if (connect) {
655 /* On Windows, the socket becomes writable on connection success,
656 but a connection failure is notified as an error. On POSIX, the
657 socket becomes writable on connection success or on connection
658 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200659 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200660 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661
Victor Stinner71694d52015-03-28 01:18:54 +0100662 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200663 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200664 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665
Victor Stinner71694d52015-03-28 01:18:54 +0100666 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200667 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100668 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000669#else
Victor Stinnerced11742015-04-09 10:27:25 +0200670 if (interval >= 0) {
671 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
672 tvp = &tv;
673 }
674 else
675 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000676
Victor Stinner71694d52015-03-28 01:18:54 +0100677 FD_ZERO(&fds);
678 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200679 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200680 if (connect) {
681 /* On Windows, the socket becomes writable on connection success,
682 but a connection failure is notified as an error. On POSIX, the
683 socket becomes writable on connection success or on connection
684 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200685 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200686 }
Victor Stinner71694d52015-03-28 01:18:54 +0100687
688 /* See if the socket is ready */
689 Py_BEGIN_ALLOW_THREADS;
690 if (writing)
691 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200692 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100693 else
694 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200695 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100696 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000697#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 if (n < 0)
700 return -1;
701 if (n == 0)
702 return 1;
703 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000704}
705
Victor Stinner31bf2d52015-04-01 21:57:09 +0200706/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000707
Victor Stinner81c41db2015-04-02 11:50:57 +0200708 On error, raise an exception and return -1 if err is set, or fill err and
709 return -1 otherwise. If a signal was received and the signal handler raised
710 an exception, return -1, and set err to -1 if err is set.
711
712 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100713
Victor Stinner31bf2d52015-04-01 21:57:09 +0200714 If the socket has a timeout, wait until the socket is ready before calling
715 the function: wait until the socket is writable if writing is nonzero, wait
716 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100717
Victor Stinner81c41db2015-04-02 11:50:57 +0200718 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200719 the function, except if the signal handler raised an exception (PEP 475).
720
721 When the function is retried, recompute the timeout using a monotonic clock.
722
Victor Stinner81c41db2015-04-02 11:50:57 +0200723 sock_call_ex() must be called with the GIL held. The socket function is
724 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200725static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200726sock_call_ex(PySocketSockObject *s,
727 int writing,
728 int (*sock_func) (PySocketSockObject *s, void *data),
729 void *data,
730 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200731 int *err,
732 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200733{
Victor Stinner8912d142015-04-06 23:16:34 +0200734 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200735 _PyTime_t deadline = 0;
736 int deadline_initialized = 0;
737 int res;
738
739 /* sock_call() must be called with the GIL held. */
740 assert(PyGILState_Check());
741
742 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200743 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200744 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200745 /* For connect(), poll even for blocking socket. The connection
746 runs asynchronously. */
747 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200748 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200749 _PyTime_t interval;
750
Victor Stinner81c41db2015-04-02 11:50:57 +0200751 if (deadline_initialized) {
752 /* recompute the timeout */
753 interval = deadline - _PyTime_GetMonotonicClock();
754 }
755 else {
756 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200757 deadline = _PyTime_GetMonotonicClock() + timeout;
758 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200759 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200760
Victor Stinner10550cd2015-04-03 13:22:27 +0200761 if (interval >= 0)
762 res = internal_select(s, writing, interval, connect);
763 else
764 res = 1;
765 }
766 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200767 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200768 }
769
Victor Stinner31bf2d52015-04-01 21:57:09 +0200770 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 if (err)
772 *err = GET_SOCK_ERROR;
773
Victor Stinner31bf2d52015-04-01 21:57:09 +0200774 if (CHECK_ERRNO(EINTR)) {
775 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200776 if (PyErr_CheckSignals()) {
777 if (err)
778 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200779 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781
782 /* retry select() */
783 continue;
784 }
785
786 /* select() failed */
787 s->errorhandler();
788 return -1;
789 }
790
791 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200792 if (err)
793 *err = SOCK_TIMEOUT_ERR;
794 else
795 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 return -1;
797 }
798
799 /* the socket is ready */
800 }
801
Victor Stinner81c41db2015-04-02 11:50:57 +0200802 /* inner loop to retry sock_func() when sock_func() is interrupted
803 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200804 while (1) {
805 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 Py_END_ALLOW_THREADS
808
809 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200810 /* sock_func() succeeded */
811 if (err)
812 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 return 0;
814 }
815
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 if (err)
817 *err = GET_SOCK_ERROR;
818
Victor Stinner31bf2d52015-04-01 21:57:09 +0200819 if (!CHECK_ERRNO(EINTR))
820 break;
821
Victor Stinner81c41db2015-04-02 11:50:57 +0200822 /* sock_func() was interrupted by a signal */
823 if (PyErr_CheckSignals()) {
824 if (err)
825 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200827 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830 }
831
832 if (s->sock_timeout > 0
833 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200834 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835
836 For example, select() could indicate a socket is ready for
837 reading, but the data then discarded by the OS because of a
838 wrong checksum.
839
840 Loop on select() to recheck for socket readyness. */
841 continue;
842 }
843
Victor Stinner81c41db2015-04-02 11:50:57 +0200844 /* sock_func() failed */
845 if (!err)
846 s->errorhandler();
847 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000848 return -1;
849 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000851
Victor Stinner81c41db2015-04-02 11:50:57 +0200852static int
853sock_call(PySocketSockObject *s,
854 int writing,
855 int (*func) (PySocketSockObject *s, void *data),
856 void *data)
857{
Victor Stinner8912d142015-04-06 23:16:34 +0200858 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200859}
860
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000861
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000862/* Initialize a new socket object. */
863
Victor Stinner88ed6402015-04-09 10:23:12 +0200864/* Default timeout for new sockets */
865static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000866
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200867static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000868init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 s->sock_fd = fd;
872 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500875
876 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
877 on some OSes as part of socket.type. We want to reset them here,
878 to make socket.type be set to the same value on all platforms.
879 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
880 not portable.
881 */
882#ifdef SOCK_NONBLOCK
883 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
884#endif
885#ifdef SOCK_CLOEXEC
886 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
887#endif
888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000892#ifdef SOCK_NONBLOCK
893 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100894 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000895 else
896#endif
897 {
898 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200899 if (defaulttimeout >= 0) {
900 if (internal_setblocking(s, 0) == -1) {
901 return -1;
902 }
903 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000904 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200905 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000906}
907
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909/* Create a new socket object.
910 This just creates the object and initializes it.
911 If the creation fails, return NULL and set an exception (implicit
912 in NEWOBJ()). */
913
Guido van Rossum73624e91994-10-10 17:59:00 +0000914static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000915new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PySocketSockObject *s;
918 s = (PySocketSockObject *)
919 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200920 if (s == NULL)
921 return NULL;
922 if (init_sockobject(s, fd, family, type, proto) == -1) {
923 Py_DECREF(s);
924 return NULL;
925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927}
928
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929
Guido van Rossum48a680c2001-03-02 06:34:14 +0000930/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000931 thread to be in gethostbyname or getaddrinfo */
932#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200933static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000934#endif
935
936
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937/* Convert a string specifying a host name or one of a few symbolic
938 names to a numeric IP address. This usually calls gethostbyname()
939 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000940 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941 an error occurred; then an exception is raised. */
942
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200944setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 struct addrinfo hints, *res;
947 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
950 if (name[0] == '\0') {
951 int siz;
952 memset(&hints, 0, sizeof(hints));
953 hints.ai_family = af;
954 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
955 hints.ai_flags = AI_PASSIVE;
956 Py_BEGIN_ALLOW_THREADS
957 ACQUIRE_GETADDRINFO_LOCK
958 error = getaddrinfo(NULL, "0", &hints, &res);
959 Py_END_ALLOW_THREADS
960 /* We assume that those thread-unsafe getaddrinfo() versions
961 *are* safe regarding their return value, ie. that a
962 subsequent call to getaddrinfo() does not destroy the
963 outcome of the first call. */
964 RELEASE_GETADDRINFO_LOCK
965 if (error) {
966 set_gaierror(error);
967 return -1;
968 }
969 switch (res->ai_family) {
970 case AF_INET:
971 siz = 4;
972 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000973#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case AF_INET6:
975 siz = 16;
976 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 default:
979 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200980 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 "unsupported address family");
982 return -1;
983 }
984 if (res->ai_next) {
985 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200986 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 "wildcard resolved to multiple address");
988 return -1;
989 }
990 if (res->ai_addrlen < addr_ret_size)
991 addr_ret_size = res->ai_addrlen;
992 memcpy(addr_ret, res->ai_addr, addr_ret_size);
993 freeaddrinfo(res);
994 return siz;
995 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200996 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100997 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200998 if (strcmp(name, "255.255.255.255") == 0 ||
999 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 struct sockaddr_in *sin;
1001 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001002 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 "address family mismatched");
1004 return -1;
1005 }
1006 sin = (struct sockaddr_in *)addr_ret;
1007 memset((void *) sin, '\0', sizeof(*sin));
1008 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001009#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 sin->sin_addr.s_addr = INADDR_BROADCAST;
1013 return sizeof(sin->sin_addr);
1014 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001015
1016 /* avoid a name resolution in case of numeric address */
1017#ifdef HAVE_INET_PTON
1018 /* check for an IPv4 address */
1019 if (af == AF_UNSPEC || af == AF_INET) {
1020 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1021 memset(sin, 0, sizeof(*sin));
1022 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1023 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001024#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001025 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001026#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001027 return 4;
1028 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001030#ifdef ENABLE_IPV6
1031 /* check for an IPv6 address - if the address contains a scope ID, we
1032 * fallback to getaddrinfo(), which can handle translation from interface
1033 * name to interface index */
1034 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1035 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1036 memset(sin, 0, sizeof(*sin));
1037 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1038 sin->sin6_family = AF_INET6;
1039#ifdef HAVE_SOCKADDR_SA_LEN
1040 sin->sin6_len = sizeof(*sin);
1041#endif
1042 return 16;
1043 }
1044 }
1045#endif /* ENABLE_IPV6 */
1046#else /* HAVE_INET_PTON */
1047 /* check for an IPv4 address */
1048 if (af == AF_INET || af == AF_UNSPEC) {
1049 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1050 memset(sin, 0, sizeof(*sin));
1051 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1052 sin->sin_family = AF_INET;
1053#ifdef HAVE_SOCKADDR_SA_LEN
1054 sin->sin_len = sizeof(*sin);
1055#endif
1056 return 4;
1057 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001058 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001059#endif /* HAVE_INET_PTON */
1060
1061 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 memset(&hints, 0, sizeof(hints));
1063 hints.ai_family = af;
1064 Py_BEGIN_ALLOW_THREADS
1065 ACQUIRE_GETADDRINFO_LOCK
1066 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001067#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (error == EAI_NONAME && af == AF_UNSPEC) {
1069 /* On Tru64 V5.1, numeric-to-addr conversion fails
1070 if no address family is given. Assume IPv4 for now.*/
1071 hints.ai_family = AF_INET;
1072 error = getaddrinfo(name, NULL, &hints, &res);
1073 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 Py_END_ALLOW_THREADS
1076 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1077 if (error) {
1078 set_gaierror(error);
1079 return -1;
1080 }
1081 if (res->ai_addrlen < addr_ret_size)
1082 addr_ret_size = res->ai_addrlen;
1083 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1084 freeaddrinfo(res);
1085 switch (addr_ret->sa_family) {
1086 case AF_INET:
1087 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001088#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 case AF_INET6:
1090 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001093 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 return -1;
1095 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096}
1097
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099/* Create a string object representing an IP address.
1100 This is always a string of the form 'dd.dd.dd.dd' (with variable
1101 size numbers). */
1102
Guido van Rossum73624e91994-10-10 17:59:00 +00001103static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001104makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 char buf[NI_MAXHOST];
1107 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1110 NI_NUMERICHOST);
1111 if (error) {
1112 set_gaierror(error);
1113 return NULL;
1114 }
1115 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116}
1117
1118
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001119#ifdef USE_BLUETOOTH
1120/* Convert a string representation of a Bluetooth address into a numeric
1121 address. Returns the length (6), or raises an exception and returns -1 if
1122 an error occurred. */
1123
1124static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001125setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 unsigned int b0, b1, b2, b3, b4, b5;
1128 char ch;
1129 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1132 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1133 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1134 bdaddr->b[0] = b0;
1135 bdaddr->b[1] = b1;
1136 bdaddr->b[2] = b2;
1137 bdaddr->b[3] = b3;
1138 bdaddr->b[4] = b4;
1139 bdaddr->b[5] = b5;
1140 return 6;
1141 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001142 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 return -1;
1144 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001145}
1146
1147/* Create a string representation of the Bluetooth address. This is always a
1148 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1149 value (zero padded if necessary). */
1150
1151static PyObject *
1152makebdaddr(bdaddr_t *bdaddr)
1153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1157 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1158 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1159 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001160}
1161#endif
1162
1163
Guido van Rossum30a685f1991-06-27 15:51:29 +00001164/* Create an object representing the given socket address,
1165 suitable for passing it back to bind(), connect() etc.
1166 The family field of the sockaddr structure is inspected
1167 to determine what kind of address it really is. */
1168
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001170static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001171makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 if (addrlen == 0) {
1174 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001175 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case AF_INET:
1181 {
1182 struct sockaddr_in *a;
1183 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1184 PyObject *ret = NULL;
1185 if (addrobj) {
1186 a = (struct sockaddr_in *)addr;
1187 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1188 Py_DECREF(addrobj);
1189 }
1190 return ret;
1191 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001192
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001193#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 case AF_UNIX:
1195 {
1196 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001197#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001198 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1199 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1200 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 }
1202 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001203#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 {
1205 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001206 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 }
1208 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001209#endif /* AF_UNIX */
1210
Martin v. Löwis11017b12006-01-14 18:12:57 +00001211#if defined(AF_NETLINK)
1212 case AF_NETLINK:
1213 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1215 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001216 }
1217#endif /* AF_NETLINK */
1218
caaveryeffc12f2017-09-06 18:18:10 -04001219#if defined(AF_VSOCK)
1220 case AF_VSOCK:
1221 {
1222 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1223 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1224 }
1225#endif /* AF_VSOCK */
1226
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001227#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 case AF_INET6:
1229 {
1230 struct sockaddr_in6 *a;
1231 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1232 PyObject *ret = NULL;
1233 if (addrobj) {
1234 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001235 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 addrobj,
1237 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001238 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 a->sin6_scope_id);
1240 Py_DECREF(addrobj);
1241 }
1242 return ret;
1243 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001244#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001246#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 case AF_BLUETOOTH:
1248 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 case BTPROTO_L2CAP:
1251 {
1252 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1253 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1254 PyObject *ret = NULL;
1255 if (addrobj) {
1256 ret = Py_BuildValue("Oi",
1257 addrobj,
1258 _BT_L2_MEMB(a, psm));
1259 Py_DECREF(addrobj);
1260 }
1261 return ret;
1262 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 case BTPROTO_RFCOMM:
1265 {
1266 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1267 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1268 PyObject *ret = NULL;
1269 if (addrobj) {
1270 ret = Py_BuildValue("Oi",
1271 addrobj,
1272 _BT_RC_MEMB(a, channel));
1273 Py_DECREF(addrobj);
1274 }
1275 return ret;
1276 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 case BTPROTO_HCI:
1279 {
1280 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001281#if defined(__NetBSD__) || defined(__DragonFly__)
1282 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001283#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 PyObject *ret = NULL;
1285 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1286 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001287#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001289
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001290#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 case BTPROTO_SCO:
1292 {
1293 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1294 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1295 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001296#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 default:
1299 PyErr_SetString(PyExc_ValueError,
1300 "Unknown Bluetooth protocol");
1301 return NULL;
1302 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001303#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001304
Antoine Pitroub156a462010-10-27 20:13:57 +00001305#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 case AF_PACKET:
1307 {
1308 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001309 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 struct ifreq ifr;
1311 /* need to look up interface name give index */
1312 if (a->sll_ifindex) {
1313 ifr.ifr_ifindex = a->sll_ifindex;
1314 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1315 ifname = ifr.ifr_name;
1316 }
1317 return Py_BuildValue("shbhy#",
1318 ifname,
1319 ntohs(a->sll_protocol),
1320 a->sll_pkttype,
1321 a->sll_hatype,
1322 a->sll_addr,
1323 a->sll_halen);
1324 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001325#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001326
Christian Heimes043d6f62008-01-07 17:19:16 +00001327#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 case AF_TIPC:
1329 {
1330 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1331 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1332 return Py_BuildValue("IIIII",
1333 a->addrtype,
1334 a->addr.nameseq.type,
1335 a->addr.nameseq.lower,
1336 a->addr.nameseq.upper,
1337 a->scope);
1338 } else if (a->addrtype == TIPC_ADDR_NAME) {
1339 return Py_BuildValue("IIIII",
1340 a->addrtype,
1341 a->addr.name.name.type,
1342 a->addr.name.name.instance,
1343 a->addr.name.name.instance,
1344 a->scope);
1345 } else if (a->addrtype == TIPC_ADDR_ID) {
1346 return Py_BuildValue("IIIII",
1347 a->addrtype,
1348 a->addr.id.node,
1349 a->addr.id.ref,
1350 0,
1351 a->scope);
1352 } else {
1353 PyErr_SetString(PyExc_ValueError,
1354 "Invalid address type");
1355 return NULL;
1356 }
1357 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001358#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001359
Serhiy Storchakad3187152017-11-09 18:00:38 +02001360#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001361 case AF_CAN:
1362 {
1363 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001364 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001365 struct ifreq ifr;
1366 /* need to look up interface name given index */
1367 if (a->can_ifindex) {
1368 ifr.ifr_ifindex = a->can_ifindex;
1369 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1370 ifname = ifr.ifr_name;
1371 }
1372
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001373 switch (proto) {
1374#ifdef CAN_ISOTP
1375 case CAN_ISOTP:
1376 {
1377 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1378 ifname,
1379 a->can_addr.tp.rx_id,
1380 a->can_addr.tp.tx_id);
1381 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001382#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001383 default:
1384 {
1385 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1386 ifname);
1387 }
1388 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001389 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001390#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001391
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001392#ifdef PF_SYSTEM
1393 case PF_SYSTEM:
1394 switch(proto) {
1395#ifdef SYSPROTO_CONTROL
1396 case SYSPROTO_CONTROL:
1397 {
1398 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1399 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1400 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001401#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001402 default:
1403 PyErr_SetString(PyExc_ValueError,
1404 "Invalid address type");
1405 return 0;
1406 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001407#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001408
Christian Heimesdffa3942016-09-05 23:54:41 +02001409#ifdef HAVE_SOCKADDR_ALG
1410 case AF_ALG:
1411 {
1412 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1413 return Py_BuildValue("s#s#HH",
1414 a->salg_type,
1415 strnlen((const char*)a->salg_type,
1416 sizeof(a->salg_type)),
1417 a->salg_name,
1418 strnlen((const char*)a->salg_name,
1419 sizeof(a->salg_name)),
1420 a->salg_feat,
1421 a->salg_mask);
1422 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001423#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 default:
1428 /* If we don't know the address family, don't raise an
1429 exception -- return it as an (int, bytes) tuple. */
1430 return Py_BuildValue("iy#",
1431 addr->sa_family,
1432 addr->sa_data,
1433 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001436}
1437
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001438/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1439 (in particular, numeric IP addresses). */
1440struct maybe_idna {
1441 PyObject *obj;
1442 char *buf;
1443};
1444
1445static void
1446idna_cleanup(struct maybe_idna *data)
1447{
1448 Py_CLEAR(data->obj);
1449}
1450
1451static int
1452idna_converter(PyObject *obj, struct maybe_idna *data)
1453{
1454 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001455 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001456 if (obj == NULL) {
1457 idna_cleanup(data);
1458 return 1;
1459 }
1460 data->obj = NULL;
1461 len = -1;
1462 if (PyBytes_Check(obj)) {
1463 data->buf = PyBytes_AsString(obj);
1464 len = PyBytes_Size(obj);
1465 }
1466 else if (PyByteArray_Check(obj)) {
1467 data->buf = PyByteArray_AsString(obj);
1468 len = PyByteArray_Size(obj);
1469 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001470 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001471 if (PyUnicode_READY(obj) == -1) {
1472 return 0;
1473 }
1474 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001475 data->buf = PyUnicode_DATA(obj);
1476 len = PyUnicode_GET_LENGTH(obj);
1477 }
1478 else {
1479 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1480 if (!obj2) {
1481 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1482 return 0;
1483 }
1484 assert(PyBytes_Check(obj2));
1485 data->obj = obj2;
1486 data->buf = PyBytes_AS_STRING(obj2);
1487 len = PyBytes_GET_SIZE(obj2);
1488 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001489 }
1490 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001491 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1492 obj->ob_type->tp_name);
1493 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001494 }
1495 if (strlen(data->buf) != len) {
1496 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001497 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001498 return 0;
1499 }
1500 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001501}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001502
1503/* Parse a socket address argument according to the socket object's
1504 address family. Return 1 if the address was in the proper format,
1505 0 of not. The address is returned through addr_ret, its length
1506 through len_ret. */
1507
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001509getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001513
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001514#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 case AF_UNIX:
1516 {
1517 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001518 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001519 int retval = 0;
1520
1521 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1522 allow embedded nulls on Linux. */
1523 if (PyUnicode_Check(args)) {
1524 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1525 return 0;
1526 }
1527 else
1528 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001529 if (!PyArg_Parse(args, "y*", &path)) {
1530 Py_DECREF(args);
1531 return retval;
1532 }
1533 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001536#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001537 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001539 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001540 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001542 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 }
1544 }
1545 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001546#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 {
1548 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001549 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001550 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001552 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001554 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 }
1556 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001557 memcpy(addr->sun_path, path.buf, path.len);
1558 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001559 retval = 1;
1560 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001561 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001562 Py_DECREF(args);
1563 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001565#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566
Martin v. Löwis11017b12006-01-14 18:12:57 +00001567#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 case AF_NETLINK:
1569 {
1570 struct sockaddr_nl* addr;
1571 int pid, groups;
1572 addr = (struct sockaddr_nl *)addr_ret;
1573 if (!PyTuple_Check(args)) {
1574 PyErr_Format(
1575 PyExc_TypeError,
1576 "getsockaddrarg: "
1577 "AF_NETLINK address must be tuple, not %.500s",
1578 Py_TYPE(args)->tp_name);
1579 return 0;
1580 }
1581 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1582 return 0;
1583 addr->nl_family = AF_NETLINK;
1584 addr->nl_pid = pid;
1585 addr->nl_groups = groups;
1586 *len_ret = sizeof(*addr);
1587 return 1;
1588 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001589#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001590
caaveryeffc12f2017-09-06 18:18:10 -04001591#if defined(AF_VSOCK)
1592 case AF_VSOCK:
1593 {
1594 struct sockaddr_vm* addr;
1595 int port, cid;
1596 addr = (struct sockaddr_vm *)addr_ret;
1597 memset(addr, 0, sizeof(struct sockaddr_vm));
1598 if (!PyTuple_Check(args)) {
1599 PyErr_Format(
1600 PyExc_TypeError,
1601 "getsockaddrarg: "
1602 "AF_VSOCK address must be tuple, not %.500s",
1603 Py_TYPE(args)->tp_name);
1604 return 0;
1605 }
1606 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1607 return 0;
1608 addr->svm_family = s->sock_family;
1609 addr->svm_port = port;
1610 addr->svm_cid = cid;
1611 *len_ret = sizeof(*addr);
1612 return 1;
1613 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001614#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001615
1616
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001617#ifdef AF_RDS
1618 case AF_RDS:
1619 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001620#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 case AF_INET:
1623 {
1624 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001625 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 int port, result;
1627 if (!PyTuple_Check(args)) {
1628 PyErr_Format(
1629 PyExc_TypeError,
1630 "getsockaddrarg: "
1631 "AF_INET address must be tuple, not %.500s",
1632 Py_TYPE(args)->tp_name);
1633 return 0;
1634 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001635 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1636 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 return 0;
1638 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001641 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (result < 0)
1643 return 0;
1644 if (port < 0 || port > 0xffff) {
1645 PyErr_SetString(
1646 PyExc_OverflowError,
1647 "getsockaddrarg: port must be 0-65535.");
1648 return 0;
1649 }
1650 addr->sin_family = AF_INET;
1651 addr->sin_port = htons((short)port);
1652 *len_ret = sizeof *addr;
1653 return 1;
1654 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001656#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 case AF_INET6:
1658 {
1659 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001660 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001661 int port, result;
1662 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 flowinfo = scope_id = 0;
1664 if (!PyTuple_Check(args)) {
1665 PyErr_Format(
1666 PyExc_TypeError,
1667 "getsockaddrarg: "
1668 "AF_INET6 address must be tuple, not %.500s",
1669 Py_TYPE(args)->tp_name);
1670 return 0;
1671 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001672 if (!PyArg_ParseTuple(args, "O&i|II",
1673 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 &scope_id)) {
1675 return 0;
1676 }
1677 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001678 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001680 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 if (result < 0)
1682 return 0;
1683 if (port < 0 || port > 0xffff) {
1684 PyErr_SetString(
1685 PyExc_OverflowError,
1686 "getsockaddrarg: port must be 0-65535.");
1687 return 0;
1688 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001689 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001690 PyErr_SetString(
1691 PyExc_OverflowError,
1692 "getsockaddrarg: flowinfo must be 0-1048575.");
1693 return 0;
1694 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 addr->sin6_family = s->sock_family;
1696 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001697 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 addr->sin6_scope_id = scope_id;
1699 *len_ret = sizeof *addr;
1700 return 1;
1701 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001702#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001703
Hye-Shik Chang81268602004-02-02 06:05:24 +00001704#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 case AF_BLUETOOTH:
1706 {
1707 switch (s->sock_proto) {
1708 case BTPROTO_L2CAP:
1709 {
1710 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001711 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 addr = (struct sockaddr_l2 *)addr_ret;
1714 memset(addr, 0, sizeof(struct sockaddr_l2));
1715 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1716 if (!PyArg_ParseTuple(args, "si", &straddr,
1717 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001718 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 "wrong format");
1720 return 0;
1721 }
1722 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1723 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 *len_ret = sizeof *addr;
1726 return 1;
1727 }
1728 case BTPROTO_RFCOMM:
1729 {
1730 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001731 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 addr = (struct sockaddr_rc *)addr_ret;
1734 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1735 if (!PyArg_ParseTuple(args, "si", &straddr,
1736 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001737 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 "wrong format");
1739 return 0;
1740 }
1741 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1742 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 *len_ret = sizeof *addr;
1745 return 1;
1746 }
1747 case BTPROTO_HCI:
1748 {
1749 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001750#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001751 const char *straddr;
1752 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1753 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001754 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001755 "wrong format");
1756 return 0;
1757 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001758 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001759 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1760 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001761#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1763 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001764 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 "wrong format");
1766 return 0;
1767 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001768#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 *len_ret = sizeof *addr;
1770 return 1;
1771 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001772#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 case BTPROTO_SCO:
1774 {
1775 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001776 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 addr = (struct sockaddr_sco *)addr_ret;
1779 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1780 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001781 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 "wrong format");
1783 return 0;
1784 }
1785 straddr = PyBytes_AS_STRING(args);
1786 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1787 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 *len_ret = sizeof *addr;
1790 return 1;
1791 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001792#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001794 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 return 0;
1796 }
1797 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001798#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001799
Antoine Pitroub156a462010-10-27 20:13:57 +00001800#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 case AF_PACKET:
1802 {
1803 struct sockaddr_ll* addr;
1804 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001805 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 int protoNumber;
1807 int hatype = 0;
1808 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001809 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 if (!PyTuple_Check(args)) {
1812 PyErr_Format(
1813 PyExc_TypeError,
1814 "getsockaddrarg: "
1815 "AF_PACKET address must be tuple, not %.500s",
1816 Py_TYPE(args)->tp_name);
1817 return 0;
1818 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001819 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001821 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 return 0;
1823 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1824 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1825 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1826 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001827 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 return 0;
1829 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001830 if (haddr.buf && haddr.len > 8) {
1831 PyErr_SetString(PyExc_ValueError,
1832 "Hardware address must be 8 bytes or less");
1833 PyBuffer_Release(&haddr);
1834 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 }
1836 if (protoNumber < 0 || protoNumber > 0xffff) {
1837 PyErr_SetString(
1838 PyExc_OverflowError,
1839 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001840 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 return 0;
1842 }
1843 addr = (struct sockaddr_ll*)addr_ret;
1844 addr->sll_family = AF_PACKET;
1845 addr->sll_protocol = htons((short)protoNumber);
1846 addr->sll_ifindex = ifr.ifr_ifindex;
1847 addr->sll_pkttype = pkttype;
1848 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001849 if (haddr.buf) {
1850 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1851 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001853 else
1854 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001856 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return 1;
1858 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001859#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001860
Christian Heimes043d6f62008-01-07 17:19:16 +00001861#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 case AF_TIPC:
1863 {
1864 unsigned int atype, v1, v2, v3;
1865 unsigned int scope = TIPC_CLUSTER_SCOPE;
1866 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (!PyTuple_Check(args)) {
1869 PyErr_Format(
1870 PyExc_TypeError,
1871 "getsockaddrarg: "
1872 "AF_TIPC address must be tuple, not %.500s",
1873 Py_TYPE(args)->tp_name);
1874 return 0;
1875 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (!PyArg_ParseTuple(args,
1878 "IIII|I;Invalid TIPC address format",
1879 &atype, &v1, &v2, &v3, &scope))
1880 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 addr = (struct sockaddr_tipc *) addr_ret;
1883 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 addr->family = AF_TIPC;
1886 addr->scope = scope;
1887 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (atype == TIPC_ADDR_NAMESEQ) {
1890 addr->addr.nameseq.type = v1;
1891 addr->addr.nameseq.lower = v2;
1892 addr->addr.nameseq.upper = v3;
1893 } else if (atype == TIPC_ADDR_NAME) {
1894 addr->addr.name.name.type = v1;
1895 addr->addr.name.name.instance = v2;
1896 } else if (atype == TIPC_ADDR_ID) {
1897 addr->addr.id.node = v1;
1898 addr->addr.id.ref = v2;
1899 } else {
1900 /* Shouldn't happen */
1901 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1902 return 0;
1903 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 return 1;
1908 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001909#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001910
Serhiy Storchakad3187152017-11-09 18:00:38 +02001911#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001912 case AF_CAN:
1913 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001914#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001915 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001916 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001917#endif
1918#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001919 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001920#endif
1921#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001922 {
1923 struct sockaddr_can *addr;
1924 PyObject *interfaceName;
1925 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001926 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001927 addr = (struct sockaddr_can *)addr_ret;
1928
Charles-François Natali47413c12011-10-06 19:47:44 +02001929 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1930 &interfaceName))
1931 return 0;
1932
1933 len = PyBytes_GET_SIZE(interfaceName);
1934
1935 if (len == 0) {
1936 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001937 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001938 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1939 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001940 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1941 s->errorhandler();
1942 Py_DECREF(interfaceName);
1943 return 0;
1944 }
1945 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001946 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001947 "AF_CAN interface name too long");
1948 Py_DECREF(interfaceName);
1949 return 0;
1950 }
1951
1952 addr->can_family = AF_CAN;
1953 addr->can_ifindex = ifr.ifr_ifindex;
1954
1955 *len_ret = sizeof(*addr);
1956 Py_DECREF(interfaceName);
1957 return 1;
1958 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001959#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001960
1961#ifdef CAN_ISOTP
1962 case CAN_ISOTP:
1963 {
1964 struct sockaddr_can *addr;
1965 PyObject *interfaceName;
1966 struct ifreq ifr;
1967 Py_ssize_t len;
1968 unsigned long int rx_id, tx_id;
1969
1970 addr = (struct sockaddr_can *)addr_ret;
1971
1972 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1973 &interfaceName,
1974 &rx_id,
1975 &tx_id))
1976 return 0;
1977
1978 len = PyBytes_GET_SIZE(interfaceName);
1979
1980 if (len == 0) {
1981 ifr.ifr_ifindex = 0;
1982 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1983 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1984 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1985 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1986 s->errorhandler();
1987 Py_DECREF(interfaceName);
1988 return 0;
1989 }
1990 } else {
1991 PyErr_SetString(PyExc_OSError,
1992 "AF_CAN interface name too long");
1993 Py_DECREF(interfaceName);
1994 return 0;
1995 }
1996
1997 addr->can_family = AF_CAN;
1998 addr->can_ifindex = ifr.ifr_ifindex;
1999 addr->can_addr.tp.rx_id = rx_id;
2000 addr->can_addr.tp.tx_id = tx_id;
2001
2002 *len_ret = sizeof(*addr);
2003 Py_DECREF(interfaceName);
2004 return 1;
2005 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002006#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002007 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002008 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002009 "getsockaddrarg: unsupported CAN protocol");
2010 return 0;
2011 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002012#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002013
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002014#ifdef PF_SYSTEM
2015 case PF_SYSTEM:
2016 switch (s->sock_proto) {
2017#ifdef SYSPROTO_CONTROL
2018 case SYSPROTO_CONTROL:
2019 {
2020 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002021
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002022 addr = (struct sockaddr_ctl *)addr_ret;
2023 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002024 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002025
2026 if (PyUnicode_Check(args)) {
2027 struct ctl_info info;
2028 PyObject *ctl_name;
2029
2030 if (!PyArg_Parse(args, "O&",
2031 PyUnicode_FSConverter, &ctl_name)) {
2032 return 0;
2033 }
2034
Victor Stinnerf50e1872015-03-20 11:32:24 +01002035 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002036 PyErr_SetString(PyExc_ValueError,
2037 "provided string is too long");
2038 Py_DECREF(ctl_name);
2039 return 0;
2040 }
2041 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2042 sizeof(info.ctl_name));
2043 Py_DECREF(ctl_name);
2044
2045 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2046 PyErr_SetString(PyExc_OSError,
2047 "cannot find kernel control with provided name");
2048 return 0;
2049 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002050
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002051 addr->sc_id = info.ctl_id;
2052 addr->sc_unit = 0;
2053 } else if (!PyArg_ParseTuple(args, "II",
2054 &(addr->sc_id), &(addr->sc_unit))) {
2055 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2056 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002057
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002058 return 0;
2059 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002060
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002061 *len_ret = sizeof(*addr);
2062 return 1;
2063 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002064#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002065 default:
2066 PyErr_SetString(PyExc_OSError,
2067 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2068 return 0;
2069 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002070#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002071#ifdef HAVE_SOCKADDR_ALG
2072 case AF_ALG:
2073 {
2074 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002075 const char *type;
2076 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002077 sa = (struct sockaddr_alg *)addr_ret;
2078
2079 memset(sa, 0, sizeof(*sa));
2080 sa->salg_family = AF_ALG;
2081
2082 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2083 &type, &name, &sa->salg_feat, &sa->salg_mask))
2084 return 0;
2085 /* sockaddr_alg has fixed-sized char arrays for type and name */
2086 if (strlen(type) > sizeof(sa->salg_type)) {
2087 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2088 return 0;
2089 }
2090 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2091 if (strlen(name) > sizeof(sa->salg_name)) {
2092 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2093 return 0;
2094 }
2095 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2096
2097 *len_ret = sizeof(*sa);
2098 return 1;
2099 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002100#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002105 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002109}
2110
Guido van Rossum30a685f1991-06-27 15:51:29 +00002111
Guido van Rossum48a680c2001-03-02 06:34:14 +00002112/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002113 Return 1 if the family is known, 0 otherwise. The length is returned
2114 through len_ret. */
2115
2116static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002117getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002120
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002121#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 case AF_UNIX:
2123 {
2124 *len_ret = sizeof (struct sockaddr_un);
2125 return 1;
2126 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002127#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002128
Martin v. Löwis11017b12006-01-14 18:12:57 +00002129#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002130 case AF_NETLINK:
2131 {
2132 *len_ret = sizeof (struct sockaddr_nl);
2133 return 1;
2134 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002135#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002136
caaveryeffc12f2017-09-06 18:18:10 -04002137#if defined(AF_VSOCK)
2138 case AF_VSOCK:
2139 {
2140 *len_ret = sizeof (struct sockaddr_vm);
2141 return 1;
2142 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002143#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002144
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002145#ifdef AF_RDS
2146 case AF_RDS:
2147 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002148#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 case AF_INET:
2151 {
2152 *len_ret = sizeof (struct sockaddr_in);
2153 return 1;
2154 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002155
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002156#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 case AF_INET6:
2158 {
2159 *len_ret = sizeof (struct sockaddr_in6);
2160 return 1;
2161 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002162#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002163
Hye-Shik Chang81268602004-02-02 06:05:24 +00002164#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 case AF_BLUETOOTH:
2166 {
2167 switch(s->sock_proto)
2168 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 case BTPROTO_L2CAP:
2171 *len_ret = sizeof (struct sockaddr_l2);
2172 return 1;
2173 case BTPROTO_RFCOMM:
2174 *len_ret = sizeof (struct sockaddr_rc);
2175 return 1;
2176 case BTPROTO_HCI:
2177 *len_ret = sizeof (struct sockaddr_hci);
2178 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002179#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 case BTPROTO_SCO:
2181 *len_ret = sizeof (struct sockaddr_sco);
2182 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002183#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002185 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 "unknown BT protocol");
2187 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 }
2190 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002191#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002192
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002193#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 case AF_PACKET:
2195 {
2196 *len_ret = sizeof (struct sockaddr_ll);
2197 return 1;
2198 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002199#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002200
Christian Heimes043d6f62008-01-07 17:19:16 +00002201#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 case AF_TIPC:
2203 {
2204 *len_ret = sizeof (struct sockaddr_tipc);
2205 return 1;
2206 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002207#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002208
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002209#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002210 case AF_CAN:
2211 {
2212 *len_ret = sizeof (struct sockaddr_can);
2213 return 1;
2214 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002215#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002216
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002217#ifdef PF_SYSTEM
2218 case PF_SYSTEM:
2219 switch(s->sock_proto) {
2220#ifdef SYSPROTO_CONTROL
2221 case SYSPROTO_CONTROL:
2222 *len_ret = sizeof (struct sockaddr_ctl);
2223 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002224#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002225 default:
2226 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2227 "unknown PF_SYSTEM protocol");
2228 return 0;
2229 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002230#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002231#ifdef HAVE_SOCKADDR_ALG
2232 case AF_ALG:
2233 {
2234 *len_ret = sizeof (struct sockaddr_alg);
2235 return 1;
2236 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002237#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002242 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002246}
2247
2248
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002249/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2250 Currently, these methods are only compiled if the RFC 2292/3542
2251 CMSG_LEN() macro is available. Older systems seem to have used
2252 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2253 it may be possible to define CMSG_LEN() that way if it's not
2254 provided. Some architectures might need extra padding after the
2255 cmsghdr, however, and CMSG_LEN() would have to take account of
2256 this. */
2257#ifdef CMSG_LEN
2258/* If length is in range, set *result to CMSG_LEN(length) and return
2259 true; otherwise, return false. */
2260static int
2261get_CMSG_LEN(size_t length, size_t *result)
2262{
2263 size_t tmp;
2264
2265 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2266 return 0;
2267 tmp = CMSG_LEN(length);
2268 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2269 return 0;
2270 *result = tmp;
2271 return 1;
2272}
2273
2274#ifdef CMSG_SPACE
2275/* If length is in range, set *result to CMSG_SPACE(length) and return
2276 true; otherwise, return false. */
2277static int
2278get_CMSG_SPACE(size_t length, size_t *result)
2279{
2280 size_t tmp;
2281
2282 /* Use CMSG_SPACE(1) here in order to take account of the padding
2283 necessary before *and* after the data. */
2284 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2285 return 0;
2286 tmp = CMSG_SPACE(length);
2287 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2288 return 0;
2289 *result = tmp;
2290 return 1;
2291}
2292#endif
2293
2294/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2295 pointer in msg->msg_control with at least "space" bytes after it,
2296 and its cmsg_len member inside the buffer. */
2297static int
2298cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2299{
2300 size_t cmsg_offset;
2301 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2302 sizeof(cmsgh->cmsg_len));
2303
Charles-François Natali466517d2011-08-28 18:23:43 +02002304 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002305 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002306 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002307 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2308 annoying under OS X as it's unsigned there and so it triggers a
2309 tautological comparison warning under Clang when compared against 0.
2310 Since the check is valid on other platforms, silence the warning under
2311 Clang. */
2312 #ifdef __clang__
2313 #pragma clang diagnostic push
2314 #pragma clang diagnostic ignored "-Wtautological-compare"
2315 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002316 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002317 #pragma GCC diagnostic push
2318 #pragma GCC diagnostic ignored "-Wtype-limits"
2319 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002320 if (msg->msg_controllen < 0)
2321 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002322 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002323 #pragma GCC diagnostic pop
2324 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002325 #ifdef __clang__
2326 #pragma clang diagnostic pop
2327 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002328 if (space < cmsg_len_end)
2329 space = cmsg_len_end;
2330 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2331 return (cmsg_offset <= (size_t)-1 - space &&
2332 cmsg_offset + space <= msg->msg_controllen);
2333}
2334
2335/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2336 *space to number of bytes following it in the buffer and return
2337 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2338 msg->msg_controllen are valid. */
2339static int
2340get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2341{
2342 size_t data_offset;
2343 char *data_ptr;
2344
2345 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2346 return 0;
2347 data_offset = data_ptr - (char *)msg->msg_control;
2348 if (data_offset > msg->msg_controllen)
2349 return 0;
2350 *space = msg->msg_controllen - data_offset;
2351 return 1;
2352}
2353
2354/* If cmsgh is invalid or not contained in the buffer pointed to by
2355 msg->msg_control, return -1. If cmsgh is valid and its associated
2356 data is entirely contained in the buffer, set *data_len to the
2357 length of the associated data and return 0. If only part of the
2358 associated data is contained in the buffer but cmsgh is otherwise
2359 valid, set *data_len to the length contained in the buffer and
2360 return 1. */
2361static int
2362get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2363{
2364 size_t space, cmsg_data_len;
2365
2366 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2367 cmsgh->cmsg_len < CMSG_LEN(0))
2368 return -1;
2369 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2370 if (!get_cmsg_data_space(msg, cmsgh, &space))
2371 return -1;
2372 if (space >= cmsg_data_len) {
2373 *data_len = cmsg_data_len;
2374 return 0;
2375 }
2376 *data_len = space;
2377 return 1;
2378}
2379#endif /* CMSG_LEN */
2380
2381
Victor Stinner31bf2d52015-04-01 21:57:09 +02002382struct sock_accept {
2383 socklen_t *addrlen;
2384 sock_addr_t *addrbuf;
2385 SOCKET_T result;
2386};
2387
2388#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2389/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2390static int accept4_works = -1;
2391#endif
2392
2393static int
2394sock_accept_impl(PySocketSockObject *s, void *data)
2395{
2396 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002397 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2398 socklen_t *paddrlen = ctx->addrlen;
2399#ifdef HAVE_SOCKADDR_ALG
2400 /* AF_ALG does not support accept() with addr and raises
2401 * ECONNABORTED instead. */
2402 if (s->sock_family == AF_ALG) {
2403 addr = NULL;
2404 paddrlen = NULL;
2405 *ctx->addrlen = 0;
2406 }
2407#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002408
2409#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2410 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002411 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002412 SOCK_CLOEXEC);
2413 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2414 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2415 accept4_works = (errno != ENOSYS);
2416 }
2417 }
2418 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002419 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002420#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002421 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002422#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002423
2424#ifdef MS_WINDOWS
2425 return (ctx->result != INVALID_SOCKET);
2426#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002427 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002428#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002429}
2430
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002431/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002432
Guido van Rossum73624e91994-10-10 17:59:00 +00002433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002434sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002437 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 socklen_t addrlen;
2439 PyObject *sock = NULL;
2440 PyObject *addr = NULL;
2441 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002442 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 if (!getsockaddrlen(s, &addrlen))
2445 return NULL;
2446 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 if (!IS_SELECTABLE(s))
2449 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002450
Victor Stinner31bf2d52015-04-01 21:57:09 +02002451 ctx.addrlen = &addrlen;
2452 ctx.addrbuf = &addrbuf;
2453 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002455 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002456
Victor Stinnerdaf45552013-08-28 00:53:59 +02002457#ifdef MS_WINDOWS
2458 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2459 PyErr_SetFromWindowsErr(0);
2460 SOCKETCLOSE(newfd);
2461 goto finally;
2462 }
2463#else
2464
2465#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2466 if (!accept4_works)
2467#endif
2468 {
2469 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2470 SOCKETCLOSE(newfd);
2471 goto finally;
2472 }
2473 }
2474#endif
2475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 sock = PyLong_FromSocket_t(newfd);
2477 if (sock == NULL) {
2478 SOCKETCLOSE(newfd);
2479 goto finally;
2480 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2483 addrlen, s->sock_proto);
2484 if (addr == NULL)
2485 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002488
Guido van Rossum67f7a382002-06-06 21:08:16 +00002489finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 Py_XDECREF(sock);
2491 Py_XDECREF(addr);
2492 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002493}
2494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002495PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002496"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002497\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002498Wait for an incoming connection. Return a new socket file descriptor\n\
2499representing the connection, and the address of the client.\n\
2500For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501
Guido van Rossum11ba0942002-06-13 15:07:44 +00002502/* s.setblocking(flag) method. Argument:
2503 False -- non-blocking mode; same as settimeout(0)
2504 True -- blocking mode; same as settimeout(None)
2505*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002506
Guido van Rossum73624e91994-10-10 17:59:00 +00002507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002508sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002509{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002510 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 block = PyLong_AsLong(arg);
2513 if (block == -1 && PyErr_Occurred())
2514 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002515
Victor Stinner9001d802015-04-06 23:06:01 +02002516 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002517 if (internal_setblocking(s, block) == -1) {
2518 return NULL;
2519 }
2520 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002521}
Guido van Rossume4485b01994-09-07 14:32:49 +00002522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524"setblocking(flag)\n\
2525\n\
2526Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002527setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002529
Victor Stinner71694d52015-03-28 01:18:54 +01002530static int
2531socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2532{
2533#ifdef MS_WINDOWS
2534 struct timeval tv;
2535#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002536#ifndef HAVE_POLL
2537 _PyTime_t ms;
2538#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002539 int overflow = 0;
2540
2541 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002542 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002543 return 0;
2544 }
2545
Victor Stinner869e1772015-03-30 03:49:14 +02002546 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002547 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002548 return -1;
2549
2550 if (*timeout < 0) {
2551 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2552 return -1;
2553 }
2554
2555#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002556 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002557#endif
2558#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002559 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002560 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002561#endif
2562 if (overflow) {
2563 PyErr_SetString(PyExc_OverflowError,
2564 "timeout doesn't fit into C timeval");
2565 return -1;
2566 }
2567
2568 return 0;
2569}
2570
Guido van Rossum11ba0942002-06-13 15:07:44 +00002571/* s.settimeout(timeout) method. Argument:
2572 None -- no timeout, blocking mode; same as setblocking(True)
2573 0.0 -- non-blocking mode; same as setblocking(False)
2574 > 0 -- timeout mode; operations time out after timeout seconds
2575 < 0 -- illegal; raises an exception
2576*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002578sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579{
Victor Stinner71694d52015-03-28 01:18:54 +01002580 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002581
Victor Stinner71694d52015-03-28 01:18:54 +01002582 if (socket_parse_timeout(&timeout, arg) < 0)
2583 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002586 if (internal_setblocking(s, timeout < 0) == -1) {
2587 return NULL;
2588 }
2589 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590}
2591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002592PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002593"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002594\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002595Set a timeout on socket operations. 'timeout' can be a float,\n\
2596giving in seconds, or None. Setting a timeout of None disables\n\
2597the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002598Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002600/* s.gettimeout() method.
2601 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002602static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002603sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604{
Victor Stinner71694d52015-03-28 01:18:54 +01002605 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002606 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 }
Victor Stinner71694d52015-03-28 01:18:54 +01002608 else {
2609 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2610 return PyFloat_FromDouble(seconds);
2611 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002612}
2613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002614PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002615"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002616\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002617Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002618operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002619operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002620
Guido van Rossumaee08791992-09-08 09:05:33 +00002621/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002622 With an integer third argument, sets an integer optval with optlen=4.
2623 With None as third argument and an integer fourth argument, set
2624 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002625 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002626 use optional built-in module 'struct' to encode the string.
2627*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002628
Guido van Rossum73624e91994-10-10 17:59:00 +00002629static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002630sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 int level;
2633 int optname;
2634 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002635 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002637 unsigned int optlen;
2638 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002639
caaveryeffc12f2017-09-06 18:18:10 -04002640#ifdef AF_VSOCK
2641 if (s->sock_family == AF_VSOCK) {
2642 uint64_t vflag; // Must be set width of 64 bits
2643 /* setsockopt(level, opt, flag) */
2644 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2645 &level, &optname, &vflag)) {
2646 // level should always be set to AF_VSOCK
2647 res = setsockopt(s->sock_fd, level, optname,
2648 (void*)&vflag, sizeof vflag);
2649 goto done;
2650 }
2651 return NULL;
2652 }
2653#endif
2654
Christian Heimesdffa3942016-09-05 23:54:41 +02002655 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 if (PyArg_ParseTuple(args, "iii:setsockopt",
2657 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002658 res = setsockopt(s->sock_fd, level, optname,
2659 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002660 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002662
2663 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002664 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002665 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2666 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2667 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002668 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002669 NULL, (socklen_t)optlen);
2670 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002672
2673 PyErr_Clear();
2674 /* setsockopt(level, opt, buffer) */
2675 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2676 &level, &optname, &optval))
2677 return NULL;
2678
2679#ifdef MS_WINDOWS
2680 if (optval.len > INT_MAX) {
2681 PyBuffer_Release(&optval);
2682 PyErr_Format(PyExc_OverflowError,
2683 "socket option is larger than %i bytes",
2684 INT_MAX);
2685 return NULL;
2686 }
2687 res = setsockopt(s->sock_fd, level, optname,
2688 optval.buf, (int)optval.len);
2689#else
2690 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2691#endif
2692 PyBuffer_Release(&optval);
2693
2694done:
Victor Stinnercc739322016-03-23 21:35:29 +01002695 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002697 }
2698
2699 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002700}
2701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002703"setsockopt(level, option, value: int)\n\
2704setsockopt(level, option, value: buffer)\n\
2705setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706\n\
2707Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002708The value argument can either be an integer, a string buffer, or \n\
2709None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002710
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002711
Guido van Rossumaee08791992-09-08 09:05:33 +00002712/* s.getsockopt() method.
2713 With two arguments, retrieves an integer option.
2714 With a third integer argument, retrieves a string buffer of that size;
2715 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002716
Guido van Rossum73624e91994-10-10 17:59:00 +00002717static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002718sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 int level;
2721 int optname;
2722 int res;
2723 PyObject *buf;
2724 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002725 int flag = 0;
2726 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2729 &level, &optname, &buflen))
2730 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002733#ifdef AF_VSOCK
2734 if (s->sock_family == AF_VSOCK) {
2735 uint64_t vflag = 0; // Must be set width of 64 bits
2736 flagsize = sizeof vflag;
2737 res = getsockopt(s->sock_fd, level, optname,
2738 (void *)&vflag, &flagsize);
2739 if (res < 0)
2740 return s->errorhandler();
2741 return PyLong_FromUnsignedLong(vflag);
2742 }
2743#endif
2744 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 res = getsockopt(s->sock_fd, level, optname,
2746 (void *)&flag, &flagsize);
2747 if (res < 0)
2748 return s->errorhandler();
2749 return PyLong_FromLong(flag);
2750 }
caaveryeffc12f2017-09-06 18:18:10 -04002751#ifdef AF_VSOCK
2752 if (s->sock_family == AF_VSOCK) {
2753 PyErr_SetString(PyExc_OSError,
2754 "getsockopt string buffer not allowed");
2755 return NULL;
2756 }
2757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002759 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 "getsockopt buflen out of range");
2761 return NULL;
2762 }
2763 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2764 if (buf == NULL)
2765 return NULL;
2766 res = getsockopt(s->sock_fd, level, optname,
2767 (void *)PyBytes_AS_STRING(buf), &buflen);
2768 if (res < 0) {
2769 Py_DECREF(buf);
2770 return s->errorhandler();
2771 }
2772 _PyBytes_Resize(&buf, buflen);
2773 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002774}
2775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002776PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002777"getsockopt(level, option[, buffersize]) -> value\n\
2778\n\
2779Get a socket option. See the Unix manual for level and option.\n\
2780If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002781string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002782
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002783
Fred Drake728819a2000-07-01 03:40:12 +00002784/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002785
Guido van Rossum73624e91994-10-10 17:59:00 +00002786static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002787sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 sock_addr_t addrbuf;
2790 int addrlen;
2791 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2794 return NULL;
2795 Py_BEGIN_ALLOW_THREADS
2796 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2797 Py_END_ALLOW_THREADS
2798 if (res < 0)
2799 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002800 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002801}
2802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002803PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002804"bind(address)\n\
2805\n\
2806Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002807pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002809
Guido van Rossum30a685f1991-06-27 15:51:29 +00002810
2811/* s.close() method.
2812 Set the file descriptor to -1 so operations tried subsequently
2813 will surely fail. */
2814
Guido van Rossum73624e91994-10-10 17:59:00 +00002815static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002816sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002819 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002820
Victor Stinner19a8e842016-03-21 16:36:48 +01002821 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002822 if (fd != INVALID_SOCKET) {
2823 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002824
2825 /* We do not want to retry upon EINTR: see
2826 http://lwn.net/Articles/576478/ and
2827 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2828 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002830 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002832 /* bpo-30319: The peer can already have closed the connection.
2833 Python ignores ECONNRESET on close(). */
2834 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002835 return s->errorhandler();
2836 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002838 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002839}
2840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842"close()\n\
2843\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002844Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002845
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002846static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002847sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002848{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002849 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002850 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002851 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002852}
2853
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002854PyDoc_STRVAR(detach_doc,
2855"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002856\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002857Close the socket object without closing the underlying file descriptor.\n\
2858The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002859can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002860
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002861static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002862sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002863{
Victor Stinner81c41db2015-04-02 11:50:57 +02002864 int err;
2865 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002866
Victor Stinner81c41db2015-04-02 11:50:57 +02002867 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2868 /* getsockopt() failed */
2869 return 0;
2870 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002871
Victor Stinner81c41db2015-04-02 11:50:57 +02002872 if (err == EISCONN)
2873 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002874 if (err != 0) {
2875 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2876 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002877 return 0;
2878 }
2879 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002880}
2881
2882static int
2883internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2884 int raise)
2885{
2886 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002887
2888 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002890 Py_END_ALLOW_THREADS
2891
Victor Stinner70a46f62015-03-31 22:03:59 +02002892 if (!res) {
2893 /* connect() succeeded, the socket is connected */
2894 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002896
Victor Stinner81c41db2015-04-02 11:50:57 +02002897 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002898
Victor Stinner81c41db2015-04-02 11:50:57 +02002899 /* save error, PyErr_CheckSignals() can replace it */
2900 err = GET_SOCK_ERROR;
2901 if (CHECK_ERRNO(EINTR)) {
2902 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002903 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002904
2905 /* Issue #23618: when connect() fails with EINTR, the connection is
2906 running asynchronously.
2907
2908 If the socket is blocking or has a timeout, wait until the
2909 connection completes, fails or timed out using select(), and then
2910 get the connection status using getsockopt(SO_ERROR).
2911
2912 If the socket is non-blocking, raise InterruptedError. The caller is
2913 responsible to wait until the connection completes, fails or timed
2914 out (it's the case in asyncio for example). */
2915 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2916 }
2917 else {
2918 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2919 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002920 }
2921
Victor Stinner81c41db2015-04-02 11:50:57 +02002922 if (!wait_connect) {
2923 if (raise) {
2924 /* restore error, maybe replaced by PyErr_CheckSignals() */
2925 SET_SOCK_ERROR(err);
2926 s->errorhandler();
2927 return -1;
2928 }
2929 else
2930 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002931 }
2932
Victor Stinner81c41db2015-04-02 11:50:57 +02002933 if (raise) {
2934 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002935 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2936 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002937 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002938 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002939 else {
2940 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002941 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2942 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002943 return err;
2944 }
2945 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002946}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002947
Fred Drake728819a2000-07-01 03:40:12 +00002948/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002949
Guido van Rossum73624e91994-10-10 17:59:00 +00002950static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002951sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 sock_addr_t addrbuf;
2954 int addrlen;
2955 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2958 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002959
Victor Stinner81c41db2015-04-02 11:50:57 +02002960 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002961 if (res < 0)
2962 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002963
Victor Stinneree699e92015-03-31 21:28:42 +02002964 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002965}
2966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002967PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002968"connect(address)\n\
2969\n\
2970Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002971is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002972
Guido van Rossum30a685f1991-06-27 15:51:29 +00002973
Fred Drake728819a2000-07-01 03:40:12 +00002974/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002975
2976static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002977sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 sock_addr_t addrbuf;
2980 int addrlen;
2981 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2984 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002985
Victor Stinner81c41db2015-04-02 11:50:57 +02002986 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002987 if (res < 0)
2988 return NULL;
2989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002991}
2992
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002993PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002994"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002995\n\
2996This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002999
Guido van Rossumed233a51992-06-23 09:07:03 +00003000/* s.fileno() method */
3001
Guido van Rossum73624e91994-10-10 17:59:00 +00003002static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003003sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003006}
3007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003008PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003009"fileno() -> integer\n\
3010\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003011Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003012
Guido van Rossumed233a51992-06-23 09:07:03 +00003013
Guido van Rossumc89705d1992-11-26 08:54:07 +00003014/* s.getsockname() method */
3015
Guido van Rossum73624e91994-10-10 17:59:00 +00003016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003017sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 sock_addr_t addrbuf;
3020 int res;
3021 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 if (!getsockaddrlen(s, &addrlen))
3024 return NULL;
3025 memset(&addrbuf, 0, addrlen);
3026 Py_BEGIN_ALLOW_THREADS
3027 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3028 Py_END_ALLOW_THREADS
3029 if (res < 0)
3030 return s->errorhandler();
3031 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3032 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003033}
3034
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003035PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003036"getsockname() -> address info\n\
3037\n\
3038Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003039info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003040
Guido van Rossumc89705d1992-11-26 08:54:07 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003043/* s.getpeername() method */
3044
Guido van Rossum73624e91994-10-10 17:59:00 +00003045static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003046sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 sock_addr_t addrbuf;
3049 int res;
3050 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 if (!getsockaddrlen(s, &addrlen))
3053 return NULL;
3054 memset(&addrbuf, 0, addrlen);
3055 Py_BEGIN_ALLOW_THREADS
3056 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3057 Py_END_ALLOW_THREADS
3058 if (res < 0)
3059 return s->errorhandler();
3060 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3061 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003062}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003063
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065"getpeername() -> address info\n\
3066\n\
3067Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003068info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003069
Guido van Rossumb6775db1994-08-01 11:34:53 +00003070#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003071
3072
Guido van Rossum30a685f1991-06-27 15:51:29 +00003073/* s.listen(n) method */
3074
Guido van Rossum73624e91994-10-10 17:59:00 +00003075static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003076sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003077{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003078 /* We try to choose a default backlog high enough to avoid connection drops
3079 * for common workloads, yet not too high to limit resource usage. */
3080 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003082
Charles-François Natali644b8f52014-05-22 19:45:39 +01003083 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003087 /* To avoid problems on systems that don't allow a negative backlog
3088 * (which doesn't make sense anyway) we force a minimum value of 0. */
3089 if (backlog < 0)
3090 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 res = listen(s->sock_fd, backlog);
3092 Py_END_ALLOW_THREADS
3093 if (res < 0)
3094 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003095 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003096}
3097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003098PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003099"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003100\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003101Enable a server to accept connections. If backlog is specified, it must be\n\
3102at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003103unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003104connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003105
Victor Stinner31bf2d52015-04-01 21:57:09 +02003106struct sock_recv {
3107 char *cbuf;
3108 Py_ssize_t len;
3109 int flags;
3110 Py_ssize_t result;
3111};
3112
3113static int
3114sock_recv_impl(PySocketSockObject *s, void *data)
3115{
3116 struct sock_recv *ctx = data;
3117
3118#ifdef MS_WINDOWS
3119 if (ctx->len > INT_MAX)
3120 ctx->len = INT_MAX;
3121 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3122#else
3123 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3124#endif
3125 return (ctx->result >= 0);
3126}
3127
Guido van Rossum82a5c661998-07-07 20:45:43 +00003128
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003130 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003131 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003132 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003133 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003134 * also possible that we return a number of bytes smaller than the request
3135 * bytes.
3136 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003137
Antoine Pitrou19467d22010-08-17 19:33:30 +00003138static Py_ssize_t
3139sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003141 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 if (!IS_SELECTABLE(s)) {
3144 select_error();
3145 return -1;
3146 }
3147 if (len == 0) {
3148 /* If 0 bytes were requested, do nothing. */
3149 return 0;
3150 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003151
Victor Stinner31bf2d52015-04-01 21:57:09 +02003152 ctx.cbuf = cbuf;
3153 ctx.len = len;
3154 ctx.flags = flags;
3155 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003157
3158 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003159}
3160
Guido van Rossum48a680c2001-03-02 06:34:14 +00003161
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003162/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003163
Guido van Rossum73624e91994-10-10 17:59:00 +00003164static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003165sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003166{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003167 Py_ssize_t recvlen, outlen;
3168 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003170
Antoine Pitrou19467d22010-08-17 19:33:30 +00003171 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 if (recvlen < 0) {
3175 PyErr_SetString(PyExc_ValueError,
3176 "negative buffersize in recv");
3177 return NULL;
3178 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 /* Allocate a new string. */
3181 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3182 if (buf == NULL)
3183 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 /* Call the guts */
3186 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3187 if (outlen < 0) {
3188 /* An error occurred, release the string and return an
3189 error. */
3190 Py_DECREF(buf);
3191 return NULL;
3192 }
3193 if (outlen != recvlen) {
3194 /* We did not read as many bytes as we anticipated, resize the
3195 string if possible and be successful. */
3196 _PyBytes_Resize(&buf, outlen);
3197 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003200}
3201
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003202PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003203"recv(buffersize[, flags]) -> data\n\
3204\n\
3205Receive up to buffersize bytes from the socket. For the optional flags\n\
3206argument, see the Unix manual. When no data is available, block until\n\
3207at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003208the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003209
Guido van Rossum30a685f1991-06-27 15:51:29 +00003210
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003211/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003212
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003214sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003217
Antoine Pitrou19467d22010-08-17 19:33:30 +00003218 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 Py_buffer pbuf;
3220 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003221 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003224 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 &pbuf, &recvlen, &flags))
3226 return NULL;
3227 buf = pbuf.buf;
3228 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 if (recvlen < 0) {
3231 PyBuffer_Release(&pbuf);
3232 PyErr_SetString(PyExc_ValueError,
3233 "negative buffersize in recv_into");
3234 return NULL;
3235 }
3236 if (recvlen == 0) {
3237 /* If nbytes was not specified, use the buffer's length */
3238 recvlen = buflen;
3239 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 /* Check if the buffer is large enough */
3242 if (buflen < recvlen) {
3243 PyBuffer_Release(&pbuf);
3244 PyErr_SetString(PyExc_ValueError,
3245 "buffer too small for requested bytes");
3246 return NULL;
3247 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 /* Call the guts */
3250 readlen = sock_recv_guts(s, buf, recvlen, flags);
3251 if (readlen < 0) {
3252 /* Return an error. */
3253 PyBuffer_Release(&pbuf);
3254 return NULL;
3255 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 PyBuffer_Release(&pbuf);
3258 /* Return the number of bytes read. Note that we do not do anything
3259 special here in the case that readlen < recvlen. */
3260 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003261}
3262
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003263PyDoc_STRVAR(recv_into_doc,
3264"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003265\n\
3266A version of recv() that stores its data into a buffer rather than creating \n\
3267a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3268is not specified (or 0), receive up to the size available in the given buffer.\n\
3269\n\
3270See recv() for documentation about the flags.");
3271
Victor Stinner31bf2d52015-04-01 21:57:09 +02003272struct sock_recvfrom {
3273 char* cbuf;
3274 Py_ssize_t len;
3275 int flags;
3276 socklen_t *addrlen;
3277 sock_addr_t *addrbuf;
3278 Py_ssize_t result;
3279};
3280
3281static int
3282sock_recvfrom_impl(PySocketSockObject *s, void *data)
3283{
3284 struct sock_recvfrom *ctx = data;
3285
3286 memset(ctx->addrbuf, 0, *ctx->addrlen);
3287
3288#ifdef MS_WINDOWS
3289 if (ctx->len > INT_MAX)
3290 ctx->len = INT_MAX;
3291 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3292 SAS2SA(ctx->addrbuf), ctx->addrlen);
3293#else
3294 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3295 SAS2SA(ctx->addrbuf), ctx->addrlen);
3296#endif
3297 return (ctx->result >= 0);
3298}
3299
Thomas Wouters477c8d52006-05-27 19:21:47 +00003300
3301/*
Christian Heimes99170a52007-12-19 02:07:34 +00003302 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3303 * into a char buffer. If you have any inc/def ref to do to the objects that
3304 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003305 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003306 * that it is also possible that we return a number of bytes smaller than the
3307 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003308 *
3309 * 'addr' is a return value for the address object. Note that you must decref
3310 * it yourself.
3311 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003312static Py_ssize_t
3313sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003318 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 if (!getsockaddrlen(s, &addrlen))
3323 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (!IS_SELECTABLE(s)) {
3326 select_error();
3327 return -1;
3328 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003329
Victor Stinner31bf2d52015-04-01 21:57:09 +02003330 ctx.cbuf = cbuf;
3331 ctx.len = len;
3332 ctx.flags = flags;
3333 ctx.addrbuf = &addrbuf;
3334 ctx.addrlen = &addrlen;
3335 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003337
Victor Stinner31bf2d52015-04-01 21:57:09 +02003338 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3339 s->sock_proto);
3340 if (*addr == NULL)
3341 return -1;
3342
3343 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003344}
3345
3346/* s.recvfrom(nbytes [,flags]) method */
3347
3348static PyObject *
3349sock_recvfrom(PySocketSockObject *s, PyObject *args)
3350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 PyObject *buf = NULL;
3352 PyObject *addr = NULL;
3353 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003354 int flags = 0;
3355 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003356
Antoine Pitrou19467d22010-08-17 19:33:30 +00003357 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 if (recvlen < 0) {
3361 PyErr_SetString(PyExc_ValueError,
3362 "negative buffersize in recvfrom");
3363 return NULL;
3364 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3367 if (buf == NULL)
3368 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3371 recvlen, flags, &addr);
3372 if (outlen < 0) {
3373 goto finally;
3374 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 if (outlen != recvlen) {
3377 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003378 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003380 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 goto finally;
3382 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003385
3386finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 Py_XDECREF(buf);
3388 Py_XDECREF(addr);
3389 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003390}
3391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003392PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003393"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3394\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003395Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003396
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003398/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003399
3400static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003401sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003404
Antoine Pitrou19467d22010-08-17 19:33:30 +00003405 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 Py_buffer pbuf;
3407 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003408 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003411
Antoine Pitrou19467d22010-08-17 19:33:30 +00003412 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 kwlist, &pbuf,
3414 &recvlen, &flags))
3415 return NULL;
3416 buf = pbuf.buf;
3417 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 if (recvlen < 0) {
3420 PyBuffer_Release(&pbuf);
3421 PyErr_SetString(PyExc_ValueError,
3422 "negative buffersize in recvfrom_into");
3423 return NULL;
3424 }
3425 if (recvlen == 0) {
3426 /* If nbytes was not specified, use the buffer's length */
3427 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003428 } else if (recvlen > buflen) {
3429 PyBuffer_Release(&pbuf);
3430 PyErr_SetString(PyExc_ValueError,
3431 "nbytes is greater than the length of the buffer");
3432 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3436 if (readlen < 0) {
3437 PyBuffer_Release(&pbuf);
3438 /* Return an error */
3439 Py_XDECREF(addr);
3440 return NULL;
3441 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 PyBuffer_Release(&pbuf);
3444 /* Return the number of bytes read and the address. Note that we do
3445 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003446 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003447}
3448
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003449PyDoc_STRVAR(recvfrom_into_doc,
3450"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003451\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003452Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003453
Victor Stinner35bee932015-04-02 12:28:07 +02003454/* The sendmsg() and recvmsg[_into]() methods require a working
3455 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3456#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003457struct sock_recvmsg {
3458 struct msghdr *msg;
3459 int flags;
3460 ssize_t result;
3461};
3462
3463static int
3464sock_recvmsg_impl(PySocketSockObject *s, void *data)
3465{
3466 struct sock_recvmsg *ctx = data;
3467
3468 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3469 return (ctx->result >= 0);
3470}
3471
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003472/*
3473 * Call recvmsg() with the supplied iovec structures, flags, and
3474 * ancillary data buffer size (controllen). Returns the tuple return
3475 * value for recvmsg() or recvmsg_into(), with the first item provided
3476 * by the supplied makeval() function. makeval() will be called with
3477 * the length read and makeval_data as arguments, and must return a
3478 * new reference (which will be decrefed if there is a subsequent
3479 * error). On error, closes any file descriptors received via
3480 * SCM_RIGHTS.
3481 */
3482static PyObject *
3483sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3484 int flags, Py_ssize_t controllen,
3485 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3486{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003487 sock_addr_t addrbuf;
3488 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003489 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003490 PyObject *cmsg_list = NULL, *retval = NULL;
3491 void *controlbuf = NULL;
3492 struct cmsghdr *cmsgh;
3493 size_t cmsgdatalen = 0;
3494 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003495 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003496
3497 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3498 ignored" when the socket is connected (Linux fills them in
3499 anyway for AF_UNIX sockets at least). Normally msg_namelen
3500 seems to be set to 0 if there's no address, but try to
3501 initialize msg_name to something that won't be mistaken for a
3502 real address if that doesn't happen. */
3503 if (!getsockaddrlen(s, &addrbuflen))
3504 return NULL;
3505 memset(&addrbuf, 0, addrbuflen);
3506 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3507
3508 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3509 PyErr_SetString(PyExc_ValueError,
3510 "invalid ancillary data buffer length");
3511 return NULL;
3512 }
3513 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3514 return PyErr_NoMemory();
3515
3516 /* Make the system call. */
3517 if (!IS_SELECTABLE(s)) {
3518 select_error();
3519 goto finally;
3520 }
3521
Victor Stinner31bf2d52015-04-01 21:57:09 +02003522 msg.msg_name = SAS2SA(&addrbuf);
3523 msg.msg_namelen = addrbuflen;
3524 msg.msg_iov = iov;
3525 msg.msg_iovlen = iovlen;
3526 msg.msg_control = controlbuf;
3527 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003528
Victor Stinner31bf2d52015-04-01 21:57:09 +02003529 ctx.msg = &msg;
3530 ctx.flags = flags;
3531 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003532 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533
3534 /* Make list of (level, type, data) tuples from control messages. */
3535 if ((cmsg_list = PyList_New(0)) == NULL)
3536 goto err_closefds;
3537 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3538 implementations didn't do so. */
3539 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3540 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3541 PyObject *bytes, *tuple;
3542 int tmp;
3543
3544 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3545 if (cmsg_status != 0) {
3546 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3547 "received malformed or improperly-truncated "
3548 "ancillary data", 1) == -1)
3549 goto err_closefds;
3550 }
3551 if (cmsg_status < 0)
3552 break;
3553 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003554 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003555 goto err_closefds;
3556 }
3557
3558 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3559 cmsgdatalen);
3560 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3561 (int)cmsgh->cmsg_type, bytes);
3562 if (tuple == NULL)
3563 goto err_closefds;
3564 tmp = PyList_Append(cmsg_list, tuple);
3565 Py_DECREF(tuple);
3566 if (tmp != 0)
3567 goto err_closefds;
3568
3569 if (cmsg_status != 0)
3570 break;
3571 }
3572
3573 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003574 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575 cmsg_list,
3576 (int)msg.msg_flags,
3577 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3578 ((msg.msg_namelen > addrbuflen) ?
3579 addrbuflen : msg.msg_namelen),
3580 s->sock_proto));
3581 if (retval == NULL)
3582 goto err_closefds;
3583
3584finally:
3585 Py_XDECREF(cmsg_list);
3586 PyMem_Free(controlbuf);
3587 return retval;
3588
3589err_closefds:
3590#ifdef SCM_RIGHTS
3591 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3592 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3593 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3594 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3595 if (cmsg_status < 0)
3596 break;
3597 if (cmsgh->cmsg_level == SOL_SOCKET &&
3598 cmsgh->cmsg_type == SCM_RIGHTS) {
3599 size_t numfds;
3600 int *fdp;
3601
3602 numfds = cmsgdatalen / sizeof(int);
3603 fdp = (int *)CMSG_DATA(cmsgh);
3604 while (numfds-- > 0)
3605 close(*fdp++);
3606 }
3607 if (cmsg_status != 0)
3608 break;
3609 }
3610#endif /* SCM_RIGHTS */
3611 goto finally;
3612}
3613
3614
3615static PyObject *
3616makeval_recvmsg(ssize_t received, void *data)
3617{
3618 PyObject **buf = data;
3619
3620 if (received < PyBytes_GET_SIZE(*buf))
3621 _PyBytes_Resize(buf, received);
3622 Py_XINCREF(*buf);
3623 return *buf;
3624}
3625
3626/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3627
3628static PyObject *
3629sock_recvmsg(PySocketSockObject *s, PyObject *args)
3630{
3631 Py_ssize_t bufsize, ancbufsize = 0;
3632 int flags = 0;
3633 struct iovec iov;
3634 PyObject *buf = NULL, *retval = NULL;
3635
3636 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3637 return NULL;
3638
3639 if (bufsize < 0) {
3640 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3641 return NULL;
3642 }
3643 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3644 return NULL;
3645 iov.iov_base = PyBytes_AS_STRING(buf);
3646 iov.iov_len = bufsize;
3647
3648 /* Note that we're passing a pointer to *our pointer* to the bytes
3649 object here (&buf); makeval_recvmsg() may incref the object, or
3650 deallocate it and set our pointer to NULL. */
3651 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3652 &makeval_recvmsg, &buf);
3653 Py_XDECREF(buf);
3654 return retval;
3655}
3656
3657PyDoc_STRVAR(recvmsg_doc,
3658"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3659\n\
3660Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3661socket. The ancbufsize argument sets the size in bytes of the\n\
3662internal buffer used to receive the ancillary data; it defaults to 0,\n\
3663meaning that no ancillary data will be received. Appropriate buffer\n\
3664sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3665CMSG_LEN(), and items which do not fit into the buffer might be\n\
3666truncated or discarded. The flags argument defaults to 0 and has the\n\
3667same meaning as for recv().\n\
3668\n\
3669The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3670The data item is a bytes object holding the non-ancillary data\n\
3671received. The ancdata item is a list of zero or more tuples\n\
3672(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3673(control messages) received: cmsg_level and cmsg_type are integers\n\
3674specifying the protocol level and protocol-specific type respectively,\n\
3675and cmsg_data is a bytes object holding the associated data. The\n\
3676msg_flags item is the bitwise OR of various flags indicating\n\
3677conditions on the received message; see your system documentation for\n\
3678details. If the receiving socket is unconnected, address is the\n\
3679address of the sending socket, if available; otherwise, its value is\n\
3680unspecified.\n\
3681\n\
3682If recvmsg() raises an exception after the system call returns, it\n\
3683will first attempt to close any file descriptors received via the\n\
3684SCM_RIGHTS mechanism.");
3685
3686
3687static PyObject *
3688makeval_recvmsg_into(ssize_t received, void *data)
3689{
3690 return PyLong_FromSsize_t(received);
3691}
3692
3693/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3694
3695static PyObject *
3696sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3697{
3698 Py_ssize_t ancbufsize = 0;
3699 int flags = 0;
3700 struct iovec *iovs = NULL;
3701 Py_ssize_t i, nitems, nbufs = 0;
3702 Py_buffer *bufs = NULL;
3703 PyObject *buffers_arg, *fast, *retval = NULL;
3704
3705 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3706 &buffers_arg, &ancbufsize, &flags))
3707 return NULL;
3708
3709 if ((fast = PySequence_Fast(buffers_arg,
3710 "recvmsg_into() argument 1 must be an "
3711 "iterable")) == NULL)
3712 return NULL;
3713 nitems = PySequence_Fast_GET_SIZE(fast);
3714 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003715 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716 goto finally;
3717 }
3718
3719 /* Fill in an iovec for each item, and save the Py_buffer
3720 structs to release afterwards. */
3721 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3722 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3723 PyErr_NoMemory();
3724 goto finally;
3725 }
3726 for (; nbufs < nitems; nbufs++) {
3727 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3728 "w*;recvmsg_into() argument 1 must be an iterable "
3729 "of single-segment read-write buffers",
3730 &bufs[nbufs]))
3731 goto finally;
3732 iovs[nbufs].iov_base = bufs[nbufs].buf;
3733 iovs[nbufs].iov_len = bufs[nbufs].len;
3734 }
3735
3736 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3737 &makeval_recvmsg_into, NULL);
3738finally:
3739 for (i = 0; i < nbufs; i++)
3740 PyBuffer_Release(&bufs[i]);
3741 PyMem_Free(bufs);
3742 PyMem_Free(iovs);
3743 Py_DECREF(fast);
3744 return retval;
3745}
3746
3747PyDoc_STRVAR(recvmsg_into_doc,
3748"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3749\n\
3750Receive normal data and ancillary data from the socket, scattering the\n\
3751non-ancillary data into a series of buffers. The buffers argument\n\
3752must be an iterable of objects that export writable buffers\n\
3753(e.g. bytearray objects); these will be filled with successive chunks\n\
3754of the non-ancillary data until it has all been written or there are\n\
3755no more buffers. The ancbufsize argument sets the size in bytes of\n\
3756the internal buffer used to receive the ancillary data; it defaults to\n\
37570, meaning that no ancillary data will be received. Appropriate\n\
3758buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3759or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3760truncated or discarded. The flags argument defaults to 0 and has the\n\
3761same meaning as for recv().\n\
3762\n\
3763The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3764The nbytes item is the total number of bytes of non-ancillary data\n\
3765written into the buffers. The ancdata item is a list of zero or more\n\
3766tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3767data (control messages) received: cmsg_level and cmsg_type are\n\
3768integers specifying the protocol level and protocol-specific type\n\
3769respectively, and cmsg_data is a bytes object holding the associated\n\
3770data. The msg_flags item is the bitwise OR of various flags\n\
3771indicating conditions on the received message; see your system\n\
3772documentation for details. If the receiving socket is unconnected,\n\
3773address is the address of the sending socket, if available; otherwise,\n\
3774its value is unspecified.\n\
3775\n\
3776If recvmsg_into() raises an exception after the system call returns,\n\
3777it will first attempt to close any file descriptors received via the\n\
3778SCM_RIGHTS mechanism.");
3779#endif /* CMSG_LEN */
3780
3781
Victor Stinner31bf2d52015-04-01 21:57:09 +02003782struct sock_send {
3783 char *buf;
3784 Py_ssize_t len;
3785 int flags;
3786 Py_ssize_t result;
3787};
3788
3789static int
3790sock_send_impl(PySocketSockObject *s, void *data)
3791{
3792 struct sock_send *ctx = data;
3793
3794#ifdef MS_WINDOWS
3795 if (ctx->len > INT_MAX)
3796 ctx->len = INT_MAX;
3797 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3798#else
3799 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3800#endif
3801 return (ctx->result >= 0);
3802}
3803
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003804/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003805
Guido van Rossum73624e91994-10-10 17:59:00 +00003806static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003807sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003808{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003809 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003811 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3814 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 if (!IS_SELECTABLE(s)) {
3817 PyBuffer_Release(&pbuf);
3818 return select_error();
3819 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003820 ctx.buf = pbuf.buf;
3821 ctx.len = pbuf.len;
3822 ctx.flags = flags;
3823 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003824 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825 return NULL;
3826 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003827 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003828
3829 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003830}
3831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003832PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003833"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003834\n\
3835Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003836argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003837sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003838
3839
3840/* s.sendall(data [,flags]) method */
3841
3842static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003843sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003846 Py_ssize_t len, n;
3847 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003849 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003850 int has_timeout = (s->sock_timeout > 0);
3851 _PyTime_t interval = s->sock_timeout;
3852 _PyTime_t deadline = 0;
3853 int deadline_initialized = 0;
3854 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3857 return NULL;
3858 buf = pbuf.buf;
3859 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003861 if (!IS_SELECTABLE(s)) {
3862 PyBuffer_Release(&pbuf);
3863 return select_error();
3864 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003867 if (has_timeout) {
3868 if (deadline_initialized) {
3869 /* recompute the timeout */
3870 interval = deadline - _PyTime_GetMonotonicClock();
3871 }
3872 else {
3873 deadline_initialized = 1;
3874 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3875 }
3876
3877 if (interval <= 0) {
3878 PyErr_SetString(socket_timeout, "timed out");
3879 goto done;
3880 }
3881 }
3882
Victor Stinner02f32ab2015-04-01 22:53:26 +02003883 ctx.buf = buf;
3884 ctx.len = len;
3885 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003886 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3887 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003888 n = ctx.result;
3889 assert(n >= 0);
3890
3891 buf += n;
3892 len -= n;
3893
3894 /* We must run our signal handlers before looping again.
3895 send() can return a successful partial write when it is
3896 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003897 if (PyErr_CheckSignals())
3898 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003899 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003900 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003901
Victor Stinner8912d142015-04-06 23:16:34 +02003902 Py_INCREF(Py_None);
3903 res = Py_None;
3904
3905done:
3906 PyBuffer_Release(&pbuf);
3907 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003908}
3909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003910PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003911"sendall(data[, flags])\n\
3912\n\
3913Send a data string to the socket. For the optional flags\n\
3914argument, see the Unix manual. This calls send() repeatedly\n\
3915until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003916to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003917
Guido van Rossum30a685f1991-06-27 15:51:29 +00003918
Victor Stinner31bf2d52015-04-01 21:57:09 +02003919struct sock_sendto {
3920 char *buf;
3921 Py_ssize_t len;
3922 int flags;
3923 int addrlen;
3924 sock_addr_t *addrbuf;
3925 Py_ssize_t result;
3926};
3927
3928static int
3929sock_sendto_impl(PySocketSockObject *s, void *data)
3930{
3931 struct sock_sendto *ctx = data;
3932
3933#ifdef MS_WINDOWS
3934 if (ctx->len > INT_MAX)
3935 ctx->len = INT_MAX;
3936 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3937 SAS2SA(ctx->addrbuf), ctx->addrlen);
3938#else
3939 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3940 SAS2SA(ctx->addrbuf), ctx->addrlen);
3941#endif
3942 return (ctx->result >= 0);
3943}
3944
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003945/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003946
Guido van Rossum73624e91994-10-10 17:59:00 +00003947static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 Py_buffer pbuf;
3951 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003952 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003954 int addrlen, flags;
3955 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003958 arglen = PyTuple_Size(args);
3959 switch (arglen) {
3960 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003961 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3962 return NULL;
3963 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003964 break;
3965 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003966 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3967 &pbuf, &flags, &addro)) {
3968 return NULL;
3969 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003970 break;
3971 default:
3972 PyErr_Format(PyExc_TypeError,
3973 "sendto() takes 2 or 3 arguments (%d given)",
3974 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003975 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 if (!IS_SELECTABLE(s)) {
3979 PyBuffer_Release(&pbuf);
3980 return select_error();
3981 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3984 PyBuffer_Release(&pbuf);
3985 return NULL;
3986 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003987
Victor Stinner31bf2d52015-04-01 21:57:09 +02003988 ctx.buf = pbuf.buf;
3989 ctx.len = pbuf.len;
3990 ctx.flags = flags;
3991 ctx.addrlen = addrlen;
3992 ctx.addrbuf = &addrbuf;
3993 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003994 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003995 return NULL;
3996 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003997 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003998
3999 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004000}
4001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004002PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004003"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004004\n\
4005Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004006For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004007
Guido van Rossum30a685f1991-06-27 15:51:29 +00004008
Victor Stinner35bee932015-04-02 12:28:07 +02004009/* The sendmsg() and recvmsg[_into]() methods require a working
4010 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4011#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004012struct sock_sendmsg {
4013 struct msghdr *msg;
4014 int flags;
4015 ssize_t result;
4016};
4017
4018static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004019sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4020 struct msghdr *msg,
4021 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4022 Py_ssize_t ndataparts, ndatabufs = 0;
4023 int result = -1;
4024 struct iovec *iovs = NULL;
4025 PyObject *data_fast = NULL;
4026 Py_buffer *databufs = NULL;
4027
4028 /* Fill in an iovec for each message part, and save the Py_buffer
4029 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004030 data_fast = PySequence_Fast(data_arg,
4031 "sendmsg() argument 1 must be an "
4032 "iterable");
4033 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004034 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004035 }
4036
Christian Heimesdffa3942016-09-05 23:54:41 +02004037 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4038 if (ndataparts > INT_MAX) {
4039 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4040 goto finally;
4041 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004042
Christian Heimesdffa3942016-09-05 23:54:41 +02004043 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004044 if (ndataparts > 0) {
4045 iovs = PyMem_New(struct iovec, ndataparts);
4046 if (iovs == NULL) {
4047 PyErr_NoMemory();
4048 goto finally;
4049 }
4050 msg->msg_iov = iovs;
4051
4052 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004053 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004054 PyErr_NoMemory();
4055 goto finally;
4056 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004057 }
4058 for (; ndatabufs < ndataparts; ndatabufs++) {
4059 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4060 "y*;sendmsg() argument 1 must be an iterable of "
4061 "bytes-like objects",
4062 &databufs[ndatabufs]))
4063 goto finally;
4064 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4065 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4066 }
4067 result = 0;
4068 finally:
4069 *databufsout = databufs;
4070 *ndatabufsout = ndatabufs;
4071 Py_XDECREF(data_fast);
4072 return result;
4073}
4074
4075static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004076sock_sendmsg_impl(PySocketSockObject *s, void *data)
4077{
4078 struct sock_sendmsg *ctx = data;
4079
4080 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4081 return (ctx->result >= 0);
4082}
4083
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4085
4086static PyObject *
4087sock_sendmsg(PySocketSockObject *s, PyObject *args)
4088{
Christian Heimesdffa3942016-09-05 23:54:41 +02004089 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004090 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004091 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004092 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093 struct cmsginfo {
4094 int level;
4095 int type;
4096 Py_buffer data;
4097 } *cmsgs = NULL;
4098 void *controlbuf = NULL;
4099 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004100 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004101 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004103 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104
4105 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004106 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004107 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004108 }
4109
4110 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004112 /* Parse destination address. */
4113 if (addr_arg != NULL && addr_arg != Py_None) {
4114 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4115 goto finally;
4116 msg.msg_name = &addrbuf;
4117 msg.msg_namelen = addrlen;
4118 }
4119
4120 /* Fill in an iovec for each message part, and save the Py_buffer
4121 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004122 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004123 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124 }
4125
4126 if (cmsg_arg == NULL)
4127 ncmsgs = 0;
4128 else {
4129 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4130 "sendmsg() argument 2 must be an "
4131 "iterable")) == NULL)
4132 goto finally;
4133 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4134 }
4135
4136#ifndef CMSG_SPACE
4137 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004138 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004139 "sending multiple control messages is not supported "
4140 "on this system");
4141 goto finally;
4142 }
4143#endif
4144 /* Save level, type and Py_buffer for each control message,
4145 and calculate total size. */
4146 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4147 PyErr_NoMemory();
4148 goto finally;
4149 }
4150 controllen = controllen_last = 0;
4151 while (ncmsgbufs < ncmsgs) {
4152 size_t bufsize, space;
4153
4154 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4155 "(iiy*):[sendmsg() ancillary data items]",
4156 &cmsgs[ncmsgbufs].level,
4157 &cmsgs[ncmsgbufs].type,
4158 &cmsgs[ncmsgbufs].data))
4159 goto finally;
4160 bufsize = cmsgs[ncmsgbufs++].data.len;
4161
4162#ifdef CMSG_SPACE
4163 if (!get_CMSG_SPACE(bufsize, &space)) {
4164#else
4165 if (!get_CMSG_LEN(bufsize, &space)) {
4166#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004167 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004168 goto finally;
4169 }
4170 controllen += space;
4171 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004172 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173 goto finally;
4174 }
4175 controllen_last = controllen;
4176 }
4177
4178 /* Construct ancillary data block from control message info. */
4179 if (ncmsgbufs > 0) {
4180 struct cmsghdr *cmsgh = NULL;
4181
Victor Stinner52d61e42016-09-12 11:41:58 +02004182 controlbuf = PyMem_Malloc(controllen);
4183 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184 PyErr_NoMemory();
4185 goto finally;
4186 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004187 msg.msg_control = controlbuf;
4188
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004189 msg.msg_controllen = controllen;
4190
4191 /* Need to zero out the buffer as a workaround for glibc's
4192 CMSG_NXTHDR() implementation. After getting the pointer to
4193 the next header, it checks its (uninitialized) cmsg_len
4194 member to see if the "message" fits in the buffer, and
4195 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004196 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004197 memset(controlbuf, 0, controllen);
4198
4199 for (i = 0; i < ncmsgbufs; i++) {
4200 size_t msg_len, data_len = cmsgs[i].data.len;
4201 int enough_space = 0;
4202
4203 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4204 if (cmsgh == NULL) {
4205 PyErr_Format(PyExc_RuntimeError,
4206 "unexpected NULL result from %s()",
4207 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4208 goto finally;
4209 }
4210 if (!get_CMSG_LEN(data_len, &msg_len)) {
4211 PyErr_SetString(PyExc_RuntimeError,
4212 "item size out of range for CMSG_LEN()");
4213 goto finally;
4214 }
4215 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4216 size_t space;
4217
4218 cmsgh->cmsg_len = msg_len;
4219 if (get_cmsg_data_space(&msg, cmsgh, &space))
4220 enough_space = (space >= data_len);
4221 }
4222 if (!enough_space) {
4223 PyErr_SetString(PyExc_RuntimeError,
4224 "ancillary data does not fit in calculated "
4225 "space");
4226 goto finally;
4227 }
4228 cmsgh->cmsg_level = cmsgs[i].level;
4229 cmsgh->cmsg_type = cmsgs[i].type;
4230 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4231 }
4232 }
4233
4234 /* Make the system call. */
4235 if (!IS_SELECTABLE(s)) {
4236 select_error();
4237 goto finally;
4238 }
4239
Victor Stinner31bf2d52015-04-01 21:57:09 +02004240 ctx.msg = &msg;
4241 ctx.flags = flags;
4242 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004243 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004244
4245 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246
4247finally:
4248 PyMem_Free(controlbuf);
4249 for (i = 0; i < ncmsgbufs; i++)
4250 PyBuffer_Release(&cmsgs[i].data);
4251 PyMem_Free(cmsgs);
4252 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004253 PyMem_Free(msg.msg_iov);
4254 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004255 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004256 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004257 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004258 return retval;
4259}
4260
4261PyDoc_STRVAR(sendmsg_doc,
4262"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4263\n\
4264Send normal and ancillary data to the socket, gathering the\n\
4265non-ancillary data from a series of buffers and concatenating it into\n\
4266a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004267data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004268The ancdata argument specifies the ancillary data (control messages)\n\
4269as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4270cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4271protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004272is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004273argument defaults to 0 and has the same meaning as for send(). If\n\
4274address is supplied and not None, it sets a destination address for\n\
4275the message. The return value is the number of bytes of non-ancillary\n\
4276data sent.");
4277#endif /* CMSG_LEN */
4278
Christian Heimesdffa3942016-09-05 23:54:41 +02004279#ifdef HAVE_SOCKADDR_ALG
4280static PyObject*
4281sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4282{
4283 PyObject *retval = NULL;
4284
4285 Py_ssize_t i, ndatabufs = 0;
4286 Py_buffer *databufs = NULL;
4287 PyObject *data_arg = NULL;
4288
4289 Py_buffer iv = {NULL, NULL};
4290
4291 PyObject *opobj = NULL;
4292 int op = -1;
4293
4294 PyObject *assoclenobj = NULL;
4295 int assoclen = -1;
4296
4297 unsigned int *uiptr;
4298 int flags = 0;
4299
4300 struct msghdr msg;
4301 struct cmsghdr *header = NULL;
4302 struct af_alg_iv *alg_iv = NULL;
4303 struct sock_sendmsg ctx;
4304 Py_ssize_t controllen;
4305 void *controlbuf = NULL;
4306 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4307
4308 if (self->sock_family != AF_ALG) {
4309 PyErr_SetString(PyExc_OSError,
4310 "algset is only supported for AF_ALG");
4311 return NULL;
4312 }
4313
4314 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4315 "|O$O!y*O!i:sendmsg_afalg", keywords,
4316 &data_arg,
4317 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004318 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004319 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004320 }
4321
4322 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004323
4324 /* op is a required, keyword-only argument >= 0 */
4325 if (opobj != NULL) {
4326 op = _PyLong_AsInt(opobj);
4327 }
4328 if (op < 0) {
4329 /* override exception from _PyLong_AsInt() */
4330 PyErr_SetString(PyExc_TypeError,
4331 "Invalid or missing argument 'op'");
4332 goto finally;
4333 }
4334 /* assoclen is optional but must be >= 0 */
4335 if (assoclenobj != NULL) {
4336 assoclen = _PyLong_AsInt(assoclenobj);
4337 if (assoclen == -1 && PyErr_Occurred()) {
4338 goto finally;
4339 }
4340 if (assoclen < 0) {
4341 PyErr_SetString(PyExc_TypeError,
4342 "assoclen must be positive");
4343 goto finally;
4344 }
4345 }
4346
4347 controllen = CMSG_SPACE(4);
4348 if (iv.buf != NULL) {
4349 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4350 }
4351 if (assoclen >= 0) {
4352 controllen += CMSG_SPACE(4);
4353 }
4354
4355 controlbuf = PyMem_Malloc(controllen);
4356 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004357 PyErr_NoMemory();
4358 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004359 }
4360 memset(controlbuf, 0, controllen);
4361
Christian Heimesdffa3942016-09-05 23:54:41 +02004362 msg.msg_controllen = controllen;
4363 msg.msg_control = controlbuf;
4364
4365 /* Fill in an iovec for each message part, and save the Py_buffer
4366 structs to release afterwards. */
4367 if (data_arg != NULL) {
4368 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4369 goto finally;
4370 }
4371 }
4372
4373 /* set operation to encrypt or decrypt */
4374 header = CMSG_FIRSTHDR(&msg);
4375 if (header == NULL) {
4376 PyErr_SetString(PyExc_RuntimeError,
4377 "unexpected NULL result from CMSG_FIRSTHDR");
4378 goto finally;
4379 }
4380 header->cmsg_level = SOL_ALG;
4381 header->cmsg_type = ALG_SET_OP;
4382 header->cmsg_len = CMSG_LEN(4);
4383 uiptr = (void*)CMSG_DATA(header);
4384 *uiptr = (unsigned int)op;
4385
4386 /* set initialization vector */
4387 if (iv.buf != NULL) {
4388 header = CMSG_NXTHDR(&msg, header);
4389 if (header == NULL) {
4390 PyErr_SetString(PyExc_RuntimeError,
4391 "unexpected NULL result from CMSG_NXTHDR(iv)");
4392 goto finally;
4393 }
4394 header->cmsg_level = SOL_ALG;
4395 header->cmsg_type = ALG_SET_IV;
4396 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4397 alg_iv = (void*)CMSG_DATA(header);
4398 alg_iv->ivlen = iv.len;
4399 memcpy(alg_iv->iv, iv.buf, iv.len);
4400 }
4401
4402 /* set length of associated data for AEAD */
4403 if (assoclen >= 0) {
4404 header = CMSG_NXTHDR(&msg, header);
4405 if (header == NULL) {
4406 PyErr_SetString(PyExc_RuntimeError,
4407 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4408 goto finally;
4409 }
4410 header->cmsg_level = SOL_ALG;
4411 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4412 header->cmsg_len = CMSG_LEN(4);
4413 uiptr = (void*)CMSG_DATA(header);
4414 *uiptr = (unsigned int)assoclen;
4415 }
4416
4417 ctx.msg = &msg;
4418 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004419 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004420 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004421 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004422
4423 retval = PyLong_FromSsize_t(ctx.result);
4424
4425 finally:
4426 PyMem_Free(controlbuf);
4427 if (iv.buf != NULL) {
4428 PyBuffer_Release(&iv);
4429 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004430 PyMem_Free(msg.msg_iov);
4431 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004432 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004433 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004434 PyMem_Free(databufs);
4435 return retval;
4436}
4437
4438PyDoc_STRVAR(sendmsg_afalg_doc,
4439"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4440\n\
4441Set operation mode, IV and length of associated data for an AF_ALG\n\
4442operation socket.");
4443#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004444
Guido van Rossum30a685f1991-06-27 15:51:29 +00004445/* s.shutdown(how) method */
4446
Guido van Rossum73624e91994-10-10 17:59:00 +00004447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004448sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 int how;
4451 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004452
Serhiy Storchaka78980432013-01-15 01:12:17 +02004453 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 if (how == -1 && PyErr_Occurred())
4455 return NULL;
4456 Py_BEGIN_ALLOW_THREADS
4457 res = shutdown(s->sock_fd, how);
4458 Py_END_ALLOW_THREADS
4459 if (res < 0)
4460 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004461 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004462}
4463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004464PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004465"shutdown(flag)\n\
4466\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004467Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4468of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004469
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004470#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004471static PyObject*
4472sock_ioctl(PySocketSockObject *s, PyObject *arg)
4473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 unsigned long cmd = SIO_RCVALL;
4475 PyObject *argO;
4476 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4479 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 switch (cmd) {
4482 case SIO_RCVALL: {
4483 unsigned int option = RCVALL_ON;
4484 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4485 return NULL;
4486 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4487 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4488 return set_error();
4489 }
4490 return PyLong_FromUnsignedLong(recv); }
4491 case SIO_KEEPALIVE_VALS: {
4492 struct tcp_keepalive ka;
4493 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4494 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4495 return NULL;
4496 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4497 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4498 return set_error();
4499 }
4500 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004501#if defined(SIO_LOOPBACK_FAST_PATH)
4502 case SIO_LOOPBACK_FAST_PATH: {
4503 unsigned int option;
4504 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4505 return NULL;
4506 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4507 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4508 return set_error();
4509 }
4510 return PyLong_FromUnsignedLong(recv); }
4511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 default:
4513 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4514 return NULL;
4515 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004516}
4517PyDoc_STRVAR(sock_ioctl_doc,
4518"ioctl(cmd, option) -> long\n\
4519\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004520Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4521SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004522SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4523SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004524#endif
4525
4526#if defined(MS_WINDOWS)
4527static PyObject*
4528sock_share(PySocketSockObject *s, PyObject *arg)
4529{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004530 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004531 DWORD processId;
4532 int result;
4533
4534 if (!PyArg_ParseTuple(arg, "I", &processId))
4535 return NULL;
4536
4537 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004538 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004539 Py_END_ALLOW_THREADS
4540 if (result == SOCKET_ERROR)
4541 return set_error();
4542 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4543}
4544PyDoc_STRVAR(sock_share_doc,
4545"share(process_id) -> bytes\n\
4546\n\
4547Share the socket with another process. The target process id\n\
4548must be provided and the resulting bytes object passed to the target\n\
4549process. There the shared socket can be instantiated by calling\n\
4550socket.fromshare().");
4551
Christian Heimesfaf2f632008-01-06 16:59:19 +00004552
4553#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004554
4555/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004556
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004557static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4559 accept_doc},
4560 {"bind", (PyCFunction)sock_bind, METH_O,
4561 bind_doc},
4562 {"close", (PyCFunction)sock_close, METH_NOARGS,
4563 close_doc},
4564 {"connect", (PyCFunction)sock_connect, METH_O,
4565 connect_doc},
4566 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4567 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004568 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4569 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4571 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004572#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 {"getpeername", (PyCFunction)sock_getpeername,
4574 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 {"getsockname", (PyCFunction)sock_getsockname,
4577 METH_NOARGS, getsockname_doc},
4578 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4579 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004580#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4582 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004583#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004584#if defined(MS_WINDOWS)
4585 {"share", (PyCFunction)sock_share, METH_VARARGS,
4586 sock_share_doc},
4587#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004588 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 listen_doc},
4590 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4591 recv_doc},
4592 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4593 recv_into_doc},
4594 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4595 recvfrom_doc},
4596 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4597 recvfrom_into_doc},
4598 {"send", (PyCFunction)sock_send, METH_VARARGS,
4599 send_doc},
4600 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4601 sendall_doc},
4602 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4603 sendto_doc},
4604 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4605 setblocking_doc},
4606 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4607 settimeout_doc},
4608 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4609 gettimeout_doc},
4610 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4611 setsockopt_doc},
4612 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4613 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004614#ifdef CMSG_LEN
4615 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4616 recvmsg_doc},
4617 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4618 recvmsg_into_doc,},
4619 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4620 sendmsg_doc},
4621#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004622#ifdef HAVE_SOCKADDR_ALG
4623 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4624 sendmsg_afalg_doc},
4625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004627};
4628
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004629/* SockObject members */
4630static PyMemberDef sock_memberlist[] = {
4631 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4632 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4633 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004634 {0},
4635};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004636
Victor Stinner71694d52015-03-28 01:18:54 +01004637static PyGetSetDef sock_getsetlist[] = {
4638 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4639 {NULL} /* sentinel */
4640};
4641
Guido van Rossum73624e91994-10-10 17:59:00 +00004642/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004643 First close the file description. */
4644
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004645static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004646sock_finalize(PySocketSockObject *s)
4647{
4648 SOCKET_T fd;
4649 PyObject *error_type, *error_value, *error_traceback;
4650
4651 /* Save the current exception, if any. */
4652 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4653
Victor Stinnerd3afb622016-07-22 17:47:09 +02004654 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004655 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4656 /* Spurious errors can appear at shutdown */
4657 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4658 PyErr_WriteUnraisable((PyObject *)s);
4659 }
4660 }
4661
4662 /* Only close the socket *after* logging the ResourceWarning warning
4663 to allow the logger to call socket methods like
4664 socket.getsockname(). If the socket is closed before, socket
4665 methods fails with the EBADF error. */
4666 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004667 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004668
4669 /* We do not want to retry upon EINTR: see sock_close() */
4670 Py_BEGIN_ALLOW_THREADS
4671 (void) SOCKETCLOSE(fd);
4672 Py_END_ALLOW_THREADS
4673 }
4674
4675 /* Restore the saved exception. */
4676 PyErr_Restore(error_type, error_value, error_traceback);
4677}
4678
4679static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004680sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004681{
Victor Stinner19a8e842016-03-21 16:36:48 +01004682 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4683 return;
4684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004686}
4687
Guido van Rossum30a685f1991-06-27 15:51:29 +00004688
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004689static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004690sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004691{
Victor Stinnere254e532014-07-26 14:36:55 +02004692 long sock_fd;
4693 /* On Windows, this test is needed because SOCKET_T is unsigned */
4694 if (s->sock_fd == INVALID_SOCKET) {
4695 sock_fd = -1;
4696 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004697#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004698 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 /* this can occur on Win64, and actually there is a special
4700 ugly printf formatter for decimal pointer length integer
4701 printing, only bother if necessary*/
4702 PyErr_SetString(PyExc_OverflowError,
4703 "no printf formatter to display "
4704 "the socket descriptor in decimal");
4705 return NULL;
4706 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004707#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004708 else
4709 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 return PyUnicode_FromFormat(
4711 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004712 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 s->sock_type,
4714 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004715}
4716
4717
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004718/* Create a new, uninitialized socket object. */
4719
4720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004721sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 new = type->tp_alloc(type, 0);
4726 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004727 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004728 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 ((PySocketSockObject *)new)->errorhandler = &set_error;
4730 }
4731 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004732}
4733
4734
4735/* Initialize a new socket object. */
4736
Victor Stinnerdaf45552013-08-28 00:53:59 +02004737#ifdef SOCK_CLOEXEC
4738/* socket() and socketpair() fail with EINVAL on Linux kernel older
4739 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4740static int sock_cloexec_works = -1;
4741#endif
4742
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004743/*ARGSUSED*/
4744static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004745sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 PySocketSockObject *s = (PySocketSockObject *)self;
4748 PyObject *fdobj = NULL;
4749 SOCKET_T fd = INVALID_SOCKET;
4750 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4751 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004752#ifndef MS_WINDOWS
4753#ifdef SOCK_CLOEXEC
4754 int *atomic_flag_works = &sock_cloexec_works;
4755#else
4756 int *atomic_flag_works = NULL;
4757#endif
4758#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4761 "|iiiO:socket", keywords,
4762 &family, &type, &proto, &fdobj))
4763 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004766#ifdef MS_WINDOWS
4767 /* recreate a socket that was duplicated */
4768 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004769 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004770 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4771 PyErr_Format(PyExc_ValueError,
4772 "socket descriptor string has wrong size, "
4773 "should be %zu bytes.", sizeof(info));
4774 return -1;
4775 }
4776 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4777 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004778 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004779 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4780 Py_END_ALLOW_THREADS
4781 if (fd == INVALID_SOCKET) {
4782 set_error();
4783 return -1;
4784 }
4785 family = info.iAddressFamily;
4786 type = info.iSocketType;
4787 proto = info.iProtocol;
4788 }
4789 else
4790#endif
4791 {
4792 fd = PyLong_AsSocket_t(fdobj);
4793 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4794 return -1;
4795 if (fd == INVALID_SOCKET) {
4796 PyErr_SetString(PyExc_ValueError,
4797 "can't use invalid socket value");
4798 return -1;
4799 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 }
4801 }
4802 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004803#ifdef MS_WINDOWS
4804 /* Windows implementation */
4805#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4806#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4807#endif
4808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004810 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004811 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004812 NULL, 0,
4813 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4814 if (fd == INVALID_SOCKET) {
4815 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4816 support_wsa_no_inherit = 0;
4817 fd = socket(family, type, proto);
4818 }
4819 }
4820 else {
4821 fd = socket(family, type, proto);
4822 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 if (fd == INVALID_SOCKET) {
4826 set_error();
4827 return -1;
4828 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004829
4830 if (!support_wsa_no_inherit) {
4831 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4832 closesocket(fd);
4833 PyErr_SetFromWindowsErr(0);
4834 return -1;
4835 }
4836 }
4837#else
4838 /* UNIX */
4839 Py_BEGIN_ALLOW_THREADS
4840#ifdef SOCK_CLOEXEC
4841 if (sock_cloexec_works != 0) {
4842 fd = socket(family, type | SOCK_CLOEXEC, proto);
4843 if (sock_cloexec_works == -1) {
4844 if (fd >= 0) {
4845 sock_cloexec_works = 1;
4846 }
4847 else if (errno == EINVAL) {
4848 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4849 sock_cloexec_works = 0;
4850 fd = socket(family, type, proto);
4851 }
4852 }
4853 }
4854 else
4855#endif
4856 {
4857 fd = socket(family, type, proto);
4858 }
4859 Py_END_ALLOW_THREADS
4860
4861 if (fd == INVALID_SOCKET) {
4862 set_error();
4863 return -1;
4864 }
4865
4866 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4867 SOCKETCLOSE(fd);
4868 return -1;
4869 }
4870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004872 if (init_sockobject(s, fd, family, type, proto) == -1) {
4873 SOCKETCLOSE(fd);
4874 return -1;
4875 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004878
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004879}
4880
4881
Guido van Rossumb6775db1994-08-01 11:34:53 +00004882/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004883
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004884static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4886 "_socket.socket", /* tp_name */
4887 sizeof(PySocketSockObject), /* tp_basicsize */
4888 0, /* tp_itemsize */
4889 (destructor)sock_dealloc, /* tp_dealloc */
4890 0, /* tp_print */
4891 0, /* tp_getattr */
4892 0, /* tp_setattr */
4893 0, /* tp_reserved */
4894 (reprfunc)sock_repr, /* tp_repr */
4895 0, /* tp_as_number */
4896 0, /* tp_as_sequence */
4897 0, /* tp_as_mapping */
4898 0, /* tp_hash */
4899 0, /* tp_call */
4900 0, /* tp_str */
4901 PyObject_GenericGetAttr, /* tp_getattro */
4902 0, /* tp_setattro */
4903 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004904 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4905 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 sock_doc, /* tp_doc */
4907 0, /* tp_traverse */
4908 0, /* tp_clear */
4909 0, /* tp_richcompare */
4910 0, /* tp_weaklistoffset */
4911 0, /* tp_iter */
4912 0, /* tp_iternext */
4913 sock_methods, /* tp_methods */
4914 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004915 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 0, /* tp_base */
4917 0, /* tp_dict */
4918 0, /* tp_descr_get */
4919 0, /* tp_descr_set */
4920 0, /* tp_dictoffset */
4921 sock_initobj, /* tp_init */
4922 PyType_GenericAlloc, /* tp_alloc */
4923 sock_new, /* tp_new */
4924 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004925 0, /* tp_is_gc */
4926 0, /* tp_bases */
4927 0, /* tp_mro */
4928 0, /* tp_cache */
4929 0, /* tp_subclasses */
4930 0, /* tp_weaklist */
4931 0, /* tp_del */
4932 0, /* tp_version_tag */
4933 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004934};
4935
Guido van Rossum30a685f1991-06-27 15:51:29 +00004936
Guido van Rossum81194471991-07-27 21:42:02 +00004937/* Python interface to gethostname(). */
4938
4939/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004940static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004941socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004942{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004943#ifdef MS_WINDOWS
4944 /* Don't use winsock's gethostname, as this returns the ANSI
4945 version of the hostname, whereas we need a Unicode string.
4946 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004947 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004948 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004949 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004950 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004951
4952 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004953 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004954
4955 if (GetLastError() != ERROR_MORE_DATA)
4956 return PyErr_SetFromWindowsErr(0);
4957
4958 if (size == 0)
4959 return PyUnicode_New(0, 0);
4960
4961 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4962 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004963 name = PyMem_New(wchar_t, size);
4964 if (!name) {
4965 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004966 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004967 }
Victor Stinner74168972011-11-17 01:11:36 +01004968 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4969 name,
4970 &size))
4971 {
4972 PyMem_Free(name);
4973 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004974 }
Victor Stinner74168972011-11-17 01:11:36 +01004975
4976 result = PyUnicode_FromWideChar(name, size);
4977 PyMem_Free(name);
4978 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004979#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 char buf[1024];
4981 int res;
4982 Py_BEGIN_ALLOW_THREADS
4983 res = gethostname(buf, (int) sizeof buf - 1);
4984 Py_END_ALLOW_THREADS
4985 if (res < 0)
4986 return set_error();
4987 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004988 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004989#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004990}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004991
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004992PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004993"gethostname() -> string\n\
4994\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004995Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004996
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004997#ifdef HAVE_SETHOSTNAME
4998PyDoc_STRVAR(sethostname_doc,
4999"sethostname(name)\n\n\
5000Sets the hostname to name.");
5001
5002static PyObject *
5003socket_sethostname(PyObject *self, PyObject *args)
5004{
5005 PyObject *hnobj;
5006 Py_buffer buf;
5007 int res, flag = 0;
5008
Christian Heimesd2774c72013-06-19 02:06:29 +02005009#ifdef _AIX
5010/* issue #18259, not declared in any useful header file */
5011extern int sethostname(const char *, size_t);
5012#endif
5013
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005014 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5015 PyErr_Clear();
5016 if (!PyArg_ParseTuple(args, "O&:sethostname",
5017 PyUnicode_FSConverter, &hnobj))
5018 return NULL;
5019 flag = 1;
5020 }
5021 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5022 if (!res) {
5023 res = sethostname(buf.buf, buf.len);
5024 PyBuffer_Release(&buf);
5025 }
5026 if (flag)
5027 Py_DECREF(hnobj);
5028 if (res)
5029 return set_error();
5030 Py_RETURN_NONE;
5031}
5032#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005033
Guido van Rossum30a685f1991-06-27 15:51:29 +00005034/* Python interface to gethostbyname(name). */
5035
5036/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005038socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 char *name;
5041 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005042 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005043
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005044 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 return NULL;
5046 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005047 goto finally;
5048 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5049finally:
5050 PyMem_Free(name);
5051 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005052}
5053
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005054PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005055"gethostbyname(host) -> address\n\
5056\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005057Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005058
5059
Victor Stinner72400302016-01-28 15:41:01 +01005060static PyObject*
5061sock_decode_hostname(const char *name)
5062{
5063#ifdef MS_WINDOWS
5064 /* Issue #26227: gethostbyaddr() returns a string encoded
5065 * to the ANSI code page */
5066 return PyUnicode_DecodeFSDefault(name);
5067#else
5068 /* Decode from UTF-8 */
5069 return PyUnicode_FromString(name);
5070#endif
5071}
5072
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005073/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5074
5075static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005076gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 char **pch;
5079 PyObject *rtn_tuple = (PyObject *)NULL;
5080 PyObject *name_list = (PyObject *)NULL;
5081 PyObject *addr_list = (PyObject *)NULL;
5082 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005083 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 if (h == NULL) {
5086 /* Let's get real error message to return */
5087 set_herror(h_errno);
5088 return NULL;
5089 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 if (h->h_addrtype != af) {
5092 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005093 errno = EAFNOSUPPORT;
5094 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 return NULL;
5096 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 case AF_INET:
5101 if (alen < sizeof(struct sockaddr_in))
5102 return NULL;
5103 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005104
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005105#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 case AF_INET6:
5107 if (alen < sizeof(struct sockaddr_in6))
5108 return NULL;
5109 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005110#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 if ((name_list = PyList_New(0)) == NULL)
5115 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 if ((addr_list = PyList_New(0)) == NULL)
5118 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 /* SF #1511317: h_aliases can be NULL */
5121 if (h->h_aliases) {
5122 for (pch = h->h_aliases; *pch != NULL; pch++) {
5123 int status;
5124 tmp = PyUnicode_FromString(*pch);
5125 if (tmp == NULL)
5126 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 status = PyList_Append(name_list, tmp);
5129 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 if (status)
5132 goto err;
5133 }
5134 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5137 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 case AF_INET:
5142 {
5143 struct sockaddr_in sin;
5144 memset(&sin, 0, sizeof(sin));
5145 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005146#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5150 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 if (pch == h->h_addr_list && alen >= sizeof(sin))
5153 memcpy((char *) addr, &sin, sizeof(sin));
5154 break;
5155 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005156
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005157#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 case AF_INET6:
5159 {
5160 struct sockaddr_in6 sin6;
5161 memset(&sin6, 0, sizeof(sin6));
5162 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005163#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5167 tmp = makeipaddr((struct sockaddr *)&sin6,
5168 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5171 memcpy((char *) addr, &sin6, sizeof(sin6));
5172 break;
5173 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005174#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005177 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 "unsupported address family");
5179 return NULL;
5180 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 if (tmp == NULL)
5183 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 status = PyList_Append(addr_list, tmp);
5186 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 if (status)
5189 goto err;
5190 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005191
Victor Stinner72400302016-01-28 15:41:01 +01005192 name = sock_decode_hostname(h->h_name);
5193 if (name == NULL)
5194 goto err;
5195 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005196
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005197 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 Py_XDECREF(name_list);
5199 Py_XDECREF(addr_list);
5200 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005201}
5202
5203
5204/* Python interface to gethostbyname_ex(name). */
5205
5206/*ARGSUSED*/
5207static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005208socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 char *name;
5211 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005212 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005214 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005215#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005217#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005219#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 char buf[16384];
5221 int buf_len = (sizeof buf) - 1;
5222 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005223#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005224#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005226#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005227#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005228
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005229 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005231 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005232 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005234#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005235#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005236 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005238#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005240#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 memset((void *) &data, '\0', sizeof(data));
5242 result = gethostbyname_r(name, &hp_allocated, &data);
5243 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005244#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005245#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005246#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005248#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005249 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005251#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 Py_END_ALLOW_THREADS
5253 /* Some C libraries would require addr.__ss_family instead of
5254 addr.ss_family.
5255 Therefore, we cast the sockaddr_storage into sockaddr to
5256 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005257 sa = SAS2SA(&addr);
5258 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005260#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005262#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005263finally:
5264 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005266}
5267
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005268PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005269"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5270\n\
5271Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005272for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005273
5274
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005275/* Python interface to gethostbyaddr(IP). */
5276
5277/*ARGSUSED*/
5278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005279socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005280{
Charles-François Natali8b759652011-12-23 16:44:51 +01005281 sock_addr_t addr;
5282 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 char *ip_num;
5284 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005285 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005286#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005288#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005290#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 /* glibcs up to 2.10 assume that the buf argument to
5292 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5293 does not ensure. The attribute below instructs the compiler
5294 to maintain this alignment. */
5295 char buf[16384] Py_ALIGNED(8);
5296 int buf_len = (sizeof buf) - 1;
5297 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005298#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005299#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005301#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005302#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005303 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 int al;
5305 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005306
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005307 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 return NULL;
5309 af = AF_UNSPEC;
5310 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005311 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 af = sa->sa_family;
5313 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005314 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 switch (af) {
5316 case AF_INET:
5317 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5318 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5319 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005320#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 case AF_INET6:
5322 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5323 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5324 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005327 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005328 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 }
5330 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005331#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005332#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005333 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 &hp_allocated, buf, buf_len,
5335 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005336#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 h = gethostbyaddr_r(ap, al, af,
5338 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005339#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 memset((void *) &data, '\0', sizeof(data));
5341 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5342 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005343#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005344#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005345#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005347#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005348 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005350#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005352 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005353#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005355#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005356finally:
5357 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005359}
5360
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005361PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005362"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5363\n\
5364Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005365for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005366
Guido van Rossum30a685f1991-06-27 15:51:29 +00005367
5368/* Python interface to getservbyname(name).
5369 This only returns the port number, since the other info is already
5370 known or not useful (like the list of aliases). */
5371
5372/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005373static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005374socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005375{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005376 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 struct servent *sp;
5378 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5379 return NULL;
5380 Py_BEGIN_ALLOW_THREADS
5381 sp = getservbyname(name, proto);
5382 Py_END_ALLOW_THREADS
5383 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005384 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 return NULL;
5386 }
5387 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005388}
5389
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005390PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005391"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005392\n\
5393Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005394The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5395otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005396
Guido van Rossum30a685f1991-06-27 15:51:29 +00005397
Barry Warsaw11b91a02004-06-28 00:50:43 +00005398/* Python interface to getservbyport(port).
5399 This only returns the service name, since the other info is already
5400 known or not useful (like the list of aliases). */
5401
5402/*ARGSUSED*/
5403static PyObject *
5404socket_getservbyport(PyObject *self, PyObject *args)
5405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005407 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 struct servent *sp;
5409 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5410 return NULL;
5411 if (port < 0 || port > 0xffff) {
5412 PyErr_SetString(
5413 PyExc_OverflowError,
5414 "getservbyport: port must be 0-65535.");
5415 return NULL;
5416 }
5417 Py_BEGIN_ALLOW_THREADS
5418 sp = getservbyport(htons((short)port), proto);
5419 Py_END_ALLOW_THREADS
5420 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005421 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 return NULL;
5423 }
5424 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005425}
5426
5427PyDoc_STRVAR(getservbyport_doc,
5428"getservbyport(port[, protocolname]) -> string\n\
5429\n\
5430Return the service name from a port number and protocol name.\n\
5431The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5432otherwise any protocol will match.");
5433
Guido van Rossum3901d851996-12-19 16:35:04 +00005434/* Python interface to getprotobyname(name).
5435 This only returns the protocol number, since the other info is
5436 already known or not useful (like the list of aliases). */
5437
5438/*ARGSUSED*/
5439static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005440socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005441{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005442 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 struct protoent *sp;
5444 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5445 return NULL;
5446 Py_BEGIN_ALLOW_THREADS
5447 sp = getprotobyname(name);
5448 Py_END_ALLOW_THREADS
5449 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005450 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 return NULL;
5452 }
5453 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005454}
5455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005456PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005457"getprotobyname(name) -> integer\n\
5458\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005459Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005460
Guido van Rossum3901d851996-12-19 16:35:04 +00005461
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005462#ifndef NO_DUP
5463/* dup() function for socket fds */
5464
5465static PyObject *
5466socket_dup(PyObject *self, PyObject *fdobj)
5467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 SOCKET_T fd, newfd;
5469 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005470#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005471 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005472#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 fd = PyLong_AsSocket_t(fdobj);
5475 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5476 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005477
Victor Stinnerdaf45552013-08-28 00:53:59 +02005478#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005479 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005480 return set_error();
5481
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005482 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005483 FROM_PROTOCOL_INFO,
5484 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 if (newfd == INVALID_SOCKET)
5486 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005487
Victor Stinnerdaf45552013-08-28 00:53:59 +02005488 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5489 closesocket(newfd);
5490 PyErr_SetFromWindowsErr(0);
5491 return NULL;
5492 }
5493#else
5494 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5495 newfd = _Py_dup(fd);
5496 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005497 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005498#endif
5499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 newfdobj = PyLong_FromSocket_t(newfd);
5501 if (newfdobj == NULL)
5502 SOCKETCLOSE(newfd);
5503 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005504}
5505
5506PyDoc_STRVAR(dup_doc,
5507"dup(integer) -> integer\n\
5508\n\
5509Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5510sockets; on some platforms os.dup() won't work for socket file descriptors.");
5511#endif
5512
5513
Dave Cole331708b2004-08-09 04:51:41 +00005514#ifdef HAVE_SOCKETPAIR
5515/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005516 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005517 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005518
5519/*ARGSUSED*/
5520static PyObject *
5521socket_socketpair(PyObject *self, PyObject *args)
5522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 PySocketSockObject *s0 = NULL, *s1 = NULL;
5524 SOCKET_T sv[2];
5525 int family, type = SOCK_STREAM, proto = 0;
5526 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005527#ifdef SOCK_CLOEXEC
5528 int *atomic_flag_works = &sock_cloexec_works;
5529#else
5530 int *atomic_flag_works = NULL;
5531#endif
5532 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005533
5534#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005536#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5540 &family, &type, &proto))
5541 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005544 Py_BEGIN_ALLOW_THREADS
5545#ifdef SOCK_CLOEXEC
5546 if (sock_cloexec_works != 0) {
5547 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5548 if (sock_cloexec_works == -1) {
5549 if (ret >= 0) {
5550 sock_cloexec_works = 1;
5551 }
5552 else if (errno == EINVAL) {
5553 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5554 sock_cloexec_works = 0;
5555 ret = socketpair(family, type, proto, sv);
5556 }
5557 }
5558 }
5559 else
5560#endif
5561 {
5562 ret = socketpair(family, type, proto, sv);
5563 }
5564 Py_END_ALLOW_THREADS
5565
5566 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005568
5569 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5570 goto finally;
5571 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5572 goto finally;
5573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 s0 = new_sockobject(sv[0], family, type, proto);
5575 if (s0 == NULL)
5576 goto finally;
5577 s1 = new_sockobject(sv[1], family, type, proto);
5578 if (s1 == NULL)
5579 goto finally;
5580 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005581
5582finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 if (res == NULL) {
5584 if (s0 == NULL)
5585 SOCKETCLOSE(sv[0]);
5586 if (s1 == NULL)
5587 SOCKETCLOSE(sv[1]);
5588 }
5589 Py_XDECREF(s0);
5590 Py_XDECREF(s1);
5591 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005592}
5593
5594PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005595"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005596\n\
5597Create a pair of socket objects from the sockets returned by the platform\n\
5598socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005599The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005600AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005601
5602#endif /* HAVE_SOCKETPAIR */
5603
5604
Guido van Rossum006bf911996-06-12 04:04:55 +00005605static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005606socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005607{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005608 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005609
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005610 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 return NULL;
5612 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005613 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005615 "ntohs: can't convert negative Python int to C "
5616 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 return NULL;
5618 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005619 if (x > 0xffff) {
5620 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5621 "ntohs: Python int too large to convert to C "
5622 "16-bit unsigned integer (The silent truncation "
5623 "is deprecated)",
5624 1)) {
5625 return NULL;
5626 }
5627 }
5628 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005629}
5630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005631PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005632"ntohs(integer) -> integer\n\
5633\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005634Convert a 16-bit unsigned integer from network to host byte order.\n\
5635Note that in case the received integer does not fit in 16-bit unsigned\n\
5636integer, but does fit in a positive C int, it is silently truncated to\n\
563716-bit unsigned integer.\n\
5638However, this silent truncation feature is deprecated, and will raise an \n\
5639exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005640
5641
Guido van Rossum006bf911996-06-12 04:04:55 +00005642static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005643socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 if (PyLong_Check(arg)) {
5648 x = PyLong_AsUnsignedLong(arg);
5649 if (x == (unsigned long) -1 && PyErr_Occurred())
5650 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005651#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 {
5653 unsigned long y;
5654 /* only want the trailing 32 bits */
5655 y = x & 0xFFFFFFFFUL;
5656 if (y ^ x)
5657 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005658 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 x = y;
5660 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 }
5663 else
5664 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005665 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005668}
5669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005670PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005671"ntohl(integer) -> integer\n\
5672\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005673Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005674
5675
Guido van Rossum006bf911996-06-12 04:04:55 +00005676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005677socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005678{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005679 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005680
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005681 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 return NULL;
5683 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005684 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005686 "htons: can't convert negative Python int to C "
5687 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 return NULL;
5689 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005690 if (x > 0xffff) {
5691 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5692 "htons: Python int too large to convert to C "
5693 "16-bit unsigned integer (The silent truncation "
5694 "is deprecated)",
5695 1)) {
5696 return NULL;
5697 }
5698 }
5699 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005700}
5701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005702PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005703"htons(integer) -> integer\n\
5704\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005705Convert a 16-bit unsigned integer from host to network byte order.\n\
5706Note that in case the received integer does not fit in 16-bit unsigned\n\
5707integer, but does fit in a positive C int, it is silently truncated to\n\
570816-bit unsigned integer.\n\
5709However, this silent truncation feature is deprecated, and will raise an \n\
5710exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005711
5712
Guido van Rossum006bf911996-06-12 04:04:55 +00005713static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005714socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 if (PyLong_Check(arg)) {
5719 x = PyLong_AsUnsignedLong(arg);
5720 if (x == (unsigned long) -1 && PyErr_Occurred())
5721 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005722#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 {
5724 unsigned long y;
5725 /* only want the trailing 32 bits */
5726 y = x & 0xFFFFFFFFUL;
5727 if (y ^ x)
5728 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005729 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 x = y;
5731 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 }
5734 else
5735 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005736 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 Py_TYPE(arg)->tp_name);
5738 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005739}
5740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005741PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005742"htonl(integer) -> integer\n\
5743\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005744Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005745
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005746/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005747
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005748PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005749"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005750\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005751Convert 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 +00005752binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005753
5754static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005755socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005756{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005757#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005759#endif
5760
5761#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005762#if (SIZEOF_INT != 4)
5763#error "Not sure if in_addr_t exists and int is not 32-bits."
5764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 /* Have to use inet_addr() instead */
5766 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005767#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005768 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5771 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005772
Tim Peters1df9fdd2003-02-13 03:13:40 +00005773
5774#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005775
5776#ifdef USE_INET_ATON_WEAKLINK
5777 if (inet_aton != NULL) {
5778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 if (inet_aton(ip_addr, &buf))
5780 return PyBytes_FromStringAndSize((char *)(&buf),
5781 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005782
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005783 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 "illegal IP address string passed to inet_aton");
5785 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005786
Thomas Wouters477c8d52006-05-27 19:21:47 +00005787#ifdef USE_INET_ATON_WEAKLINK
5788 } else {
5789#endif
5790
5791#endif
5792
5793#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 /* special-case this address as inet_addr might return INADDR_NONE
5796 * for this */
5797 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005798 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005800
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005801 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005805 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 "illegal IP address string passed to inet_aton");
5807 return NULL;
5808 }
5809 }
5810 return PyBytes_FromStringAndSize((char *) &packed_addr,
5811 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005812
5813#ifdef USE_INET_ATON_WEAKLINK
5814 }
5815#endif
5816
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005817#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005818}
5819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005820PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005821"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005822\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005823Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005824
5825static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005826socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005827{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005828 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005830
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005831 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 return NULL;
5833 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005834
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005835 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005836 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005838 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 return NULL;
5840 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005841
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005842 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5843 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005844
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005845 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005847}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005848
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005849#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005850
5851PyDoc_STRVAR(inet_pton_doc,
5852"inet_pton(af, ip) -> packed IP address string\n\
5853\n\
5854Convert an IP address from string format to a packed string suitable\n\
5855for use with low-level network functions.");
5856
5857static PyObject *
5858socket_inet_pton(PyObject *self, PyObject *args)
5859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005861 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005863#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005864 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005865#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5869 return NULL;
5870 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005871
Martin v. Löwis04697e82004-06-02 12:35:29 +00005872#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005874 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 "can't use AF_INET6, IPv6 is disabled");
5876 return NULL;
5877 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005878#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 retval = inet_pton(af, ip, packed);
5881 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005882 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 return NULL;
5884 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005885 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 "illegal IP address string passed to inet_pton");
5887 return NULL;
5888 } else if (af == AF_INET) {
5889 return PyBytes_FromStringAndSize(packed,
5890 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005891#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 } else if (af == AF_INET6) {
5893 return PyBytes_FromStringAndSize(packed,
5894 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005897 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 return NULL;
5899 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005900}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005901
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005902PyDoc_STRVAR(inet_ntop_doc,
5903"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5904\n\
5905Convert a packed IP address of the given family to string format.");
5906
5907static PyObject *
5908socket_inet_ntop(PyObject *self, PyObject *args)
5909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005911 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005913#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005914 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005915#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005917#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5920 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005921
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005922 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 return NULL;
5924 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005927 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 PyErr_SetString(PyExc_ValueError,
5929 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005930 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 return NULL;
5932 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005933#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005935 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 PyErr_SetString(PyExc_ValueError,
5937 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005938 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 return NULL;
5940 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 } else {
5943 PyErr_Format(PyExc_ValueError,
5944 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005945 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 return NULL;
5947 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005948
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005949 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5950 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005952 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 return NULL;
5954 } else {
5955 return PyUnicode_FromString(retval);
5956 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005957}
5958
5959#endif /* HAVE_INET_PTON */
5960
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005961/* Python interface to getaddrinfo(host, port). */
5962
5963/*ARGSUSED*/
5964static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005965socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005966{
Victor Stinner77af1722011-05-26 14:05:59 +02005967 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005968 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 struct addrinfo hints, *res;
5970 struct addrinfo *res0 = NULL;
5971 PyObject *hobj = NULL;
5972 PyObject *pobj = (PyObject *)NULL;
5973 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005974 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 int family, socktype, protocol, flags;
5976 int error;
5977 PyObject *all = (PyObject *)NULL;
5978 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005979
Georg Brandl6083a4b2013-10-14 06:51:46 +02005980 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005982 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005983 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 &protocol, &flags)) {
5985 return NULL;
5986 }
5987 if (hobj == Py_None) {
5988 hptr = NULL;
5989 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005990 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 if (!idna)
5992 return NULL;
5993 assert(PyBytes_Check(idna));
5994 hptr = PyBytes_AS_STRING(idna);
5995 } else if (PyBytes_Check(hobj)) {
5996 hptr = PyBytes_AsString(hobj);
5997 } else {
5998 PyErr_SetString(PyExc_TypeError,
5999 "getaddrinfo() argument 1 must be string or None");
6000 return NULL;
6001 }
6002 if (PyLong_CheckExact(pobj)) {
6003 long value = PyLong_AsLong(pobj);
6004 if (value == -1 && PyErr_Occurred())
6005 goto err;
6006 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6007 pptr = pbuf;
6008 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006009 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006010 if (pptr == NULL)
6011 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006013 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 } else if (pobj == Py_None) {
6015 pptr = (char *)NULL;
6016 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006017 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 goto err;
6019 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006020#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006021 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6022 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006023 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6024 * This workaround avoids a segfault in libsystem.
6025 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006026 pptr = "00";
6027 }
6028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 memset(&hints, 0, sizeof(hints));
6030 hints.ai_family = family;
6031 hints.ai_socktype = socktype;
6032 hints.ai_protocol = protocol;
6033 hints.ai_flags = flags;
6034 Py_BEGIN_ALLOW_THREADS
6035 ACQUIRE_GETADDRINFO_LOCK
6036 error = getaddrinfo(hptr, pptr, &hints, &res0);
6037 Py_END_ALLOW_THREADS
6038 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6039 if (error) {
6040 set_gaierror(error);
6041 goto err;
6042 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006043
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006044 all = PyList_New(0);
6045 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 goto err;
6047 for (res = res0; res; res = res->ai_next) {
6048 PyObject *single;
6049 PyObject *addr =
6050 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6051 if (addr == NULL)
6052 goto err;
6053 single = Py_BuildValue("iiisO", res->ai_family,
6054 res->ai_socktype, res->ai_protocol,
6055 res->ai_canonname ? res->ai_canonname : "",
6056 addr);
6057 Py_DECREF(addr);
6058 if (single == NULL)
6059 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 if (PyList_Append(all, single))
6062 goto err;
6063 Py_XDECREF(single);
6064 }
6065 Py_XDECREF(idna);
6066 if (res0)
6067 freeaddrinfo(res0);
6068 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006069 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 Py_XDECREF(all);
6071 Py_XDECREF(idna);
6072 if (res0)
6073 freeaddrinfo(res0);
6074 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006075}
6076
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006077PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006078"getaddrinfo(host, port [, family, type, proto, flags])\n\
6079 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006080\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006081Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006082
6083/* Python interface to getnameinfo(sa, flags). */
6084
6085/*ARGSUSED*/
6086static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006087socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 PyObject *sa = (PyObject *)NULL;
6090 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006091 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006092 int port;
6093 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6095 struct addrinfo hints, *res = NULL;
6096 int error;
6097 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006098 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 flags = flowinfo = scope_id = 0;
6101 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6102 return NULL;
6103 if (!PyTuple_Check(sa)) {
6104 PyErr_SetString(PyExc_TypeError,
6105 "getnameinfo() argument 1 must be a tuple");
6106 return NULL;
6107 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006108 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006110 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006112 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006113 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006114 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006115 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006116 return NULL;
6117 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6119 memset(&hints, 0, sizeof(hints));
6120 hints.ai_family = AF_UNSPEC;
6121 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006122 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 Py_BEGIN_ALLOW_THREADS
6124 ACQUIRE_GETADDRINFO_LOCK
6125 error = getaddrinfo(hostp, pbuf, &hints, &res);
6126 Py_END_ALLOW_THREADS
6127 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6128 if (error) {
6129 set_gaierror(error);
6130 goto fail;
6131 }
6132 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006133 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 "sockaddr resolved to multiple addresses");
6135 goto fail;
6136 }
6137 switch (res->ai_family) {
6138 case AF_INET:
6139 {
6140 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006141 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 "IPv4 sockaddr must be 2 tuple");
6143 goto fail;
6144 }
6145 break;
6146 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006147#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 case AF_INET6:
6149 {
6150 struct sockaddr_in6 *sin6;
6151 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006152 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 sin6->sin6_scope_id = scope_id;
6154 break;
6155 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006158 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6160 if (error) {
6161 set_gaierror(error);
6162 goto fail;
6163 }
Victor Stinner72400302016-01-28 15:41:01 +01006164
6165 name = sock_decode_hostname(hbuf);
6166 if (name == NULL)
6167 goto fail;
6168 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169
6170fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 if (res)
6172 freeaddrinfo(res);
6173 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006174}
6175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006176PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006177"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006178\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006179Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006180
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006181
6182/* Python API to getting and setting the default timeout value. */
6183
6184static PyObject *
6185socket_getdefaulttimeout(PyObject *self)
6186{
Victor Stinner71694d52015-03-28 01:18:54 +01006187 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006188 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 }
Victor Stinner71694d52015-03-28 01:18:54 +01006190 else {
6191 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6192 return PyFloat_FromDouble(seconds);
6193 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006194}
6195
6196PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006197"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006198\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006199Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006200A value of None indicates that new socket objects have no timeout.\n\
6201When the socket module is first imported, the default is None.");
6202
6203static PyObject *
6204socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6205{
Victor Stinner71694d52015-03-28 01:18:54 +01006206 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006207
Victor Stinner71694d52015-03-28 01:18:54 +01006208 if (socket_parse_timeout(&timeout, arg) < 0)
6209 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006212
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006213 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006214}
6215
6216PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006217"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006218\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006219Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006220A value of None indicates that new socket objects have no timeout.\n\
6221When the socket module is first imported, the default is None.");
6222
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006223#ifdef HAVE_IF_NAMEINDEX
6224/* Python API for getting interface indices and names */
6225
6226static PyObject *
6227socket_if_nameindex(PyObject *self, PyObject *arg)
6228{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006229 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006230 int i;
6231 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006232
Charles-François Natali60713592011-05-20 16:55:06 +02006233 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006234 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006235 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236 return NULL;
6237 }
6238
6239 list = PyList_New(0);
6240 if (list == NULL) {
6241 if_freenameindex(ni);
6242 return NULL;
6243 }
6244
Charles-François Natali60713592011-05-20 16:55:06 +02006245 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6246 PyObject *ni_tuple = Py_BuildValue("IO&",
6247 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006248
6249 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6250 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006251 Py_DECREF(list);
6252 if_freenameindex(ni);
6253 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006254 }
6255 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006256 }
6257
6258 if_freenameindex(ni);
6259 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006260}
6261
6262PyDoc_STRVAR(if_nameindex_doc,
6263"if_nameindex()\n\
6264\n\
6265Returns a list of network interface information (index, name) tuples.");
6266
Charles-François Natali60713592011-05-20 16:55:06 +02006267static PyObject *
6268socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006269{
Charles-François Natali60713592011-05-20 16:55:06 +02006270 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006271 unsigned long index;
6272
Charles-François Natali60713592011-05-20 16:55:06 +02006273 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6274 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006275 return NULL;
6276
Charles-François Natali60713592011-05-20 16:55:06 +02006277 index = if_nametoindex(PyBytes_AS_STRING(oname));
6278 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006279 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006280 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006281 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006282 return NULL;
6283 }
6284
6285 return PyLong_FromUnsignedLong(index);
6286}
6287
6288PyDoc_STRVAR(if_nametoindex_doc,
6289"if_nametoindex(if_name)\n\
6290\n\
6291Returns the interface index corresponding to the interface name if_name.");
6292
Charles-François Natali60713592011-05-20 16:55:06 +02006293static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006294socket_if_indextoname(PyObject *self, PyObject *arg)
6295{
Charles-François Natali60713592011-05-20 16:55:06 +02006296 unsigned long index;
6297 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006298
Charles-François Natali60713592011-05-20 16:55:06 +02006299 index = PyLong_AsUnsignedLong(arg);
6300 if (index == (unsigned long) -1)
6301 return NULL;
6302
6303 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006304 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006305 return NULL;
6306 }
6307
Charles-François Natali60713592011-05-20 16:55:06 +02006308 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006309}
6310
6311PyDoc_STRVAR(if_indextoname_doc,
6312"if_indextoname(if_index)\n\
6313\n\
6314Returns the interface name corresponding to the interface index if_index.");
6315
6316#endif /* HAVE_IF_NAMEINDEX */
6317
6318
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006319#ifdef CMSG_LEN
6320/* Python interface to CMSG_LEN(length). */
6321
6322static PyObject *
6323socket_CMSG_LEN(PyObject *self, PyObject *args)
6324{
6325 Py_ssize_t length;
6326 size_t result;
6327
6328 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6329 return NULL;
6330 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6331 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6332 return NULL;
6333 }
6334 return PyLong_FromSize_t(result);
6335}
6336
6337PyDoc_STRVAR(CMSG_LEN_doc,
6338"CMSG_LEN(length) -> control message length\n\
6339\n\
6340Return the total length, without trailing padding, of an ancillary\n\
6341data item with associated data of the given length. This value can\n\
6342often be used as the buffer size for recvmsg() to receive a single\n\
6343item of ancillary data, but RFC 3542 requires portable applications to\n\
6344use CMSG_SPACE() and thus include space for padding, even when the\n\
6345item will be the last in the buffer. Raises OverflowError if length\n\
6346is outside the permissible range of values.");
6347
6348
6349#ifdef CMSG_SPACE
6350/* Python interface to CMSG_SPACE(length). */
6351
6352static PyObject *
6353socket_CMSG_SPACE(PyObject *self, PyObject *args)
6354{
6355 Py_ssize_t length;
6356 size_t result;
6357
6358 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6359 return NULL;
6360 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6361 PyErr_SetString(PyExc_OverflowError,
6362 "CMSG_SPACE() argument out of range");
6363 return NULL;
6364 }
6365 return PyLong_FromSize_t(result);
6366}
6367
6368PyDoc_STRVAR(CMSG_SPACE_doc,
6369"CMSG_SPACE(length) -> buffer size\n\
6370\n\
6371Return the buffer size needed for recvmsg() to receive an ancillary\n\
6372data item with associated data of the given length, along with any\n\
6373trailing padding. The buffer space needed to receive multiple items\n\
6374is the sum of the CMSG_SPACE() values for their associated data\n\
6375lengths. Raises OverflowError if length is outside the permissible\n\
6376range of values.");
6377#endif /* CMSG_SPACE */
6378#endif /* CMSG_LEN */
6379
6380
Guido van Rossum30a685f1991-06-27 15:51:29 +00006381/* List of functions exported by this module. */
6382
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006383static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 {"gethostbyname", socket_gethostbyname,
6385 METH_VARARGS, gethostbyname_doc},
6386 {"gethostbyname_ex", socket_gethostbyname_ex,
6387 METH_VARARGS, ghbn_ex_doc},
6388 {"gethostbyaddr", socket_gethostbyaddr,
6389 METH_VARARGS, gethostbyaddr_doc},
6390 {"gethostname", socket_gethostname,
6391 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006392#ifdef HAVE_SETHOSTNAME
6393 {"sethostname", socket_sethostname,
6394 METH_VARARGS, sethostname_doc},
6395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 {"getservbyname", socket_getservbyname,
6397 METH_VARARGS, getservbyname_doc},
6398 {"getservbyport", socket_getservbyport,
6399 METH_VARARGS, getservbyport_doc},
6400 {"getprotobyname", socket_getprotobyname,
6401 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006402#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 {"dup", socket_dup,
6404 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006405#endif
Dave Cole331708b2004-08-09 04:51:41 +00006406#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 {"socketpair", socket_socketpair,
6408 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 {"ntohs", socket_ntohs,
6411 METH_VARARGS, ntohs_doc},
6412 {"ntohl", socket_ntohl,
6413 METH_O, ntohl_doc},
6414 {"htons", socket_htons,
6415 METH_VARARGS, htons_doc},
6416 {"htonl", socket_htonl,
6417 METH_O, htonl_doc},
6418 {"inet_aton", socket_inet_aton,
6419 METH_VARARGS, inet_aton_doc},
6420 {"inet_ntoa", socket_inet_ntoa,
6421 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006422#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 {"inet_pton", socket_inet_pton,
6424 METH_VARARGS, inet_pton_doc},
6425 {"inet_ntop", socket_inet_ntop,
6426 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006427#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006428 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6429 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 {"getnameinfo", socket_getnameinfo,
6431 METH_VARARGS, getnameinfo_doc},
6432 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6433 METH_NOARGS, getdefaulttimeout_doc},
6434 {"setdefaulttimeout", socket_setdefaulttimeout,
6435 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006436#ifdef HAVE_IF_NAMEINDEX
6437 {"if_nameindex", socket_if_nameindex,
6438 METH_NOARGS, if_nameindex_doc},
6439 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006440 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006441 {"if_indextoname", socket_if_indextoname,
6442 METH_O, if_indextoname_doc},
6443#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006444#ifdef CMSG_LEN
6445 {"CMSG_LEN", socket_CMSG_LEN,
6446 METH_VARARGS, CMSG_LEN_doc},
6447#ifdef CMSG_SPACE
6448 {"CMSG_SPACE", socket_CMSG_SPACE,
6449 METH_VARARGS, CMSG_SPACE_doc},
6450#endif
6451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006453};
6454
Guido van Rossum30a685f1991-06-27 15:51:29 +00006455
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006456#ifdef MS_WINDOWS
6457#define OS_INIT_DEFINED
6458
6459/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006460
6461static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006462os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006465}
6466
6467static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006468os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 WSADATA WSAData;
6471 int ret;
6472 ret = WSAStartup(0x0101, &WSAData);
6473 switch (ret) {
6474 case 0: /* No error */
6475 Py_AtExit(os_cleanup);
6476 return 1; /* Success */
6477 case WSASYSNOTREADY:
6478 PyErr_SetString(PyExc_ImportError,
6479 "WSAStartup failed: network not ready");
6480 break;
6481 case WSAVERNOTSUPPORTED:
6482 case WSAEINVAL:
6483 PyErr_SetString(
6484 PyExc_ImportError,
6485 "WSAStartup failed: requested version not supported");
6486 break;
6487 default:
6488 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6489 break;
6490 }
6491 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006492}
6493
Guido van Rossum8d665e61996-06-26 18:22:49 +00006494#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006495
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006496
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006497
6498#ifndef OS_INIT_DEFINED
6499static int
6500os_init(void)
6501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006503}
6504#endif
6505
6506
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006507/* C API table - always add new things to the end for binary
6508 compatibility. */
6509static
6510PySocketModule_APIObject PySocketModuleAPI =
6511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006513 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006515};
6516
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006517
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006518/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006519
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006520 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006521 "socket.py" which implements some additional functionality.
6522 The import of "_socket" may fail with an ImportError exception if
6523 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006524 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006525 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006526*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006528PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006529"Implementation module for socket operations.\n\
6530\n\
6531See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006532
Martin v. Löwis1a214512008-06-11 05:26:20 +00006533static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 PyModuleDef_HEAD_INIT,
6535 PySocket_MODULE_NAME,
6536 socket_doc,
6537 -1,
6538 socket_methods,
6539 NULL,
6540 NULL,
6541 NULL,
6542 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006543};
6544
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006545PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006546PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 if (!os_init())
6551 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006552
Victor Stinnerdaf45552013-08-28 00:53:59 +02006553#ifdef MS_WINDOWS
6554 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006555#if defined(_MSC_VER) && _MSC_VER >= 1800
6556 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6557#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006558 DWORD version = GetVersion();
6559 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6560 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6561 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006562 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6563#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006564 }
6565#endif
6566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 Py_TYPE(&sock_type) = &PyType_Type;
6568 m = PyModule_Create(&socketmodule);
6569 if (m == NULL)
6570 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006571
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006572 Py_INCREF(PyExc_OSError);
6573 PySocketModuleAPI.error = PyExc_OSError;
6574 Py_INCREF(PyExc_OSError);
6575 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006577 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 if (socket_herror == NULL)
6579 return NULL;
6580 Py_INCREF(socket_herror);
6581 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006582 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 NULL);
6584 if (socket_gaierror == NULL)
6585 return NULL;
6586 Py_INCREF(socket_gaierror);
6587 PyModule_AddObject(m, "gaierror", socket_gaierror);
6588 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006589 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 if (socket_timeout == NULL)
6591 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006592 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 Py_INCREF(socket_timeout);
6594 PyModule_AddObject(m, "timeout", socket_timeout);
6595 Py_INCREF((PyObject *)&sock_type);
6596 if (PyModule_AddObject(m, "SocketType",
6597 (PyObject *)&sock_type) != 0)
6598 return NULL;
6599 Py_INCREF((PyObject *)&sock_type);
6600 if (PyModule_AddObject(m, "socket",
6601 (PyObject *)&sock_type) != 0)
6602 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006603
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006604#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 Py_INCREF(has_ipv6);
6610 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 /* Export C API */
6613 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6614 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6615 ) != 0)
6616 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006619#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006621#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006623#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006625#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006626#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006629#endif
6630#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006632#endif
6633#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006636#endif
6637#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#endif
6641#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006644#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006645#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006648#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006652#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006653#ifdef HAVE_SOCKADDR_ALG
6654 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6655#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006656#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006659#endif
6660#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006662#endif
6663#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006666#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006667#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#endif
6671#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006674#endif
6675#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006678#endif
6679#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006682#endif
6683#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, AF_NETLINK);
6686 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006687#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006689#endif
6690#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006692#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6694 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006695#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006697#endif
6698#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006700#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006701#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006703#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006704#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006706#endif
6707#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006709#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006711#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006713#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006714#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006716#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006717#ifdef NETLINK_CRYPTO
6718 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6719#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006720#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006721
6722#ifdef AF_VSOCK
6723 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6724 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6725 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6726 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6727 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6728 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6729 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6730 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6731 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6732#endif
6733
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006734#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006738#ifdef AF_LINK
6739 PyModule_AddIntMacro(m, AF_LINK);
6740#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006741#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#endif
6745#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006748#endif
6749#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006752#endif
6753#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006756#endif
6757#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006760#endif
6761#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006764#endif
6765#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006768#endif
6769#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006772#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006773
Hye-Shik Chang81268602004-02-02 06:05:24 +00006774#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6776 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6777 PyModule_AddIntMacro(m, BTPROTO_HCI);
6778 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006779#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006781#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006782#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006783#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006785#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6787 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006788#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6791 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006792#endif
6793
Charles-François Natali47413c12011-10-06 19:47:44 +02006794#ifdef AF_CAN
6795 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006797#endif
6798#ifdef PF_CAN
6799 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006801#endif
6802
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006803/* Reliable Datagram Sockets */
6804#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006806#endif
6807#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006809#endif
6810
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006811/* Kernel event messages */
6812#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006814#endif
6815#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006817#endif
6818
Antoine Pitroub156a462010-10-27 20:13:57 +00006819#ifdef AF_PACKET
6820 PyModule_AddIntMacro(m, AF_PACKET);
6821#endif
6822#ifdef PF_PACKET
6823 PyModule_AddIntMacro(m, PF_PACKET);
6824#endif
6825#ifdef PACKET_HOST
6826 PyModule_AddIntMacro(m, PACKET_HOST);
6827#endif
6828#ifdef PACKET_BROADCAST
6829 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6830#endif
6831#ifdef PACKET_MULTICAST
6832 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6833#endif
6834#ifdef PACKET_OTHERHOST
6835 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6836#endif
6837#ifdef PACKET_OUTGOING
6838 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6839#endif
6840#ifdef PACKET_LOOPBACK
6841 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6842#endif
6843#ifdef PACKET_FASTROUTE
6844 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006845#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006846
Christian Heimes043d6f62008-01-07 17:19:16 +00006847#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6852 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6853 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006854
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6856 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6857 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, SOL_TIPC);
6861 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6862 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6863 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6864 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006865
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6867 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6868 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6869 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6873 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006874#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006877#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6879 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6880 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6881 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6882 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6883 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006884#endif
6885
Christian Heimesdffa3942016-09-05 23:54:41 +02006886#ifdef HAVE_SOCKADDR_ALG
6887 /* Socket options */
6888 PyModule_AddIntMacro(m, ALG_SET_KEY);
6889 PyModule_AddIntMacro(m, ALG_SET_IV);
6890 PyModule_AddIntMacro(m, ALG_SET_OP);
6891 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6892 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6893 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6894
6895 /* Operations */
6896 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6897 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6898 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6899 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6900#endif
6901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_STREAM);
6904 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006905/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006906#ifdef SOCK_RAW
6907 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006909#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006911#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006913#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006914#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006916#endif
6917#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006919#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006929#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006930#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006932#endif
6933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006952#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006983#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006984#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006986#endif
6987#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#endif
6990#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006992#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006993#ifdef SO_PASSSEC
6994 PyModule_AddIntMacro(m, SO_PASSSEC);
6995#endif
6996#ifdef SO_PEERSEC
6997 PyModule_AddIntMacro(m, SO_PEERSEC);
6998#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006999#ifdef SO_BINDTODEVICE
7000 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7001#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007002#ifdef SO_PRIORITY
7003 PyModule_AddIntMacro(m, SO_PRIORITY);
7004#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007005#ifdef SO_MARK
7006 PyModule_AddIntMacro(m, SO_MARK);
7007#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007008#ifdef SO_DOMAIN
7009 PyModule_AddIntMacro(m, SO_DOMAIN);
7010#endif
7011#ifdef SO_PROTOCOL
7012 PyModule_AddIntMacro(m, SO_PROTOCOL);
7013#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 /* Maximum number of connections for "listen" */
7016#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007017 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007018#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007019 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007020#endif
7021
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007022 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007023#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007025#endif
7026#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007028#endif
7029#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007031#endif
7032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033 /* Flags for send, recv */
7034#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007063#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007064#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007066#endif
7067#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007069#endif
7070#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007072#endif
7073#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007075#endif
7076#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007078#endif
7079#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007081#endif
7082#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007084#endif
7085#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007087#endif
7088#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007090#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007091#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007093#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 /* Protocol level and numbers, usable for [gs]etsockopt */
7096#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007124#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007126#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007128#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007129#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007131#endif
7132#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7134 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007135#endif
7136#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7138 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7139 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007140
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7142 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7143 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007144#ifdef CAN_ISOTP
7145 PyModule_AddIntMacro(m, CAN_ISOTP);
7146#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007147#endif
7148#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7150 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7151 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7152 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007153#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007154#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7155 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7156#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007157#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007159 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7160 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7161 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7162 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7163 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7164 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7165 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7166 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7167 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7168 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7169 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7170 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7171#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007172#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007174#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007175#ifdef HAVE_SOCKADDR_ALG
7176 PyModule_AddIntMacro(m, SOL_ALG);
7177#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007178#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007180#endif
7181#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007183#endif
7184#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007186#endif
7187#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007189#endif
7190#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007192#endif
7193#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007198#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007206#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007237#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007296#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007297#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007302#endif
7303/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007306#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
7312
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007313#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007315#endif
7316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 /* Some port configuration */
7318#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007327#endif
7328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 /* Some reserved IP v.4 addresses */
7330#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007332#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007347#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef INADDR_ALLHOSTS_GROUP
7351 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7352 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007358#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007361#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007363#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007365#endif
7366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367 /* IPv4 [gs]etsockopt options */
7368#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007410#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007413#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007415#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007416#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007418#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7421#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007433#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007446#endif
7447#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007449#endif
7450#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007452#endif
7453#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007455#endif
7456#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007458#endif
7459#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#endif
7462#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007464#endif
7465#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007467#endif
7468#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#endif
7471#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007473#endif
7474#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
7477#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007479#endif
7480#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007482#endif
7483#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007485#endif
7486#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007488#endif
7489#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007491#endif
7492#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007494#endif
7495#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007497#endif
7498#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007500#endif
7501#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007503#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505 /* TCP options */
7506#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007541#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007542#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007544#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007545#ifdef TCP_CONGESTION
7546 PyModule_AddIntMacro(m, TCP_CONGESTION);
7547#endif
7548#ifdef TCP_USER_TIMEOUT
7549 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7550#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007551#ifdef TCP_NOTSENT_LOWAT
7552 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7553#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555 /* IPX options */
7556#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007558#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007559
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007560/* Reliable Datagram Sockets */
7561#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007563#endif
7564#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007566#endif
7567#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007569#endif
7570#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007572#endif
7573#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007575#endif
7576#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007578#endif
7579#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007581#endif
7582#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007584#endif
7585#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007587#endif
7588#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007590#endif
7591#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007593#endif
7594#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007596#endif
7597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007613#endif
7614#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#endif
7617#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
7620#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007623#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007625#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007626#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007628#endif
7629#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007634#endif
7635#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007637#endif
7638#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007640#endif
7641#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007643#endif
7644#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007646#endif
7647#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#endif
7650#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007652#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007653#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007655#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007656#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007658#endif
7659#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007661#endif
7662#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007664#endif
7665#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007667#endif
7668#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007670#endif
7671#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#endif
7674#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007676#endif
7677#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007679#endif
7680#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007682#endif
7683#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007685#endif
7686#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007688#endif
7689#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007691#endif
7692#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007694#endif
7695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007697#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007699#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007701#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007703#endif
7704#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007708#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007710#endif
7711#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007713#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007716 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007717#endif
7718
Christian Heimesfaf2f632008-01-06 16:59:19 +00007719#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007721 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7722#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007723 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007724#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007725 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007726 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7727#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007728 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007729#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007730 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007731 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007732 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733 PyObject *tmp;
7734 tmp = PyLong_FromUnsignedLong(codes[i]);
7735 if (tmp == NULL)
7736 return NULL;
7737 PyModule_AddObject(m, names[i], tmp);
7738 }
7739 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007740 PyModule_AddIntMacro(m, RCVALL_OFF);
7741 PyModule_AddIntMacro(m, RCVALL_ON);
7742 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007743#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007745#endif
7746#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007748#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007749#endif /* _MSTCPIP_ */
7750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007751 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007752#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007753 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007755 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007756}