blob: 8744ea0be87cfe290575930b509deff4e9a6c92d [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\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500139getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200140setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141settimeout(None | float) -- set or clear the timeout\n\
142shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700143if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700144if_nametoindex(name) -- return the corresponding interface index\n\
145if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000146\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000147 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000148
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000149/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000150 I hope some day someone can clean this up please... */
151
Guido van Rossum9376b741999-09-15 22:01:40 +0000152/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
153 script doesn't get this right, so we hardcode some platform checks below.
154 On the other hand, not all Linux versions agree, so there the settings
155 computed by the configure script are needed! */
156
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700157#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158# undef HAVE_GETHOSTBYNAME_R_3_ARG
159# undef HAVE_GETHOSTBYNAME_R_5_ARG
160# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000161#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000162
Victor Stinner710d27e2011-08-23 10:57:32 +0200163#if defined(__OpenBSD__)
164# include <sys/uio.h>
165#endif
166
Stefan Krah1f9eb872016-05-22 17:35:34 +0200167#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000168# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000169#endif
170
Guido van Rossume7de2061999-03-24 17:24:33 +0000171#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000172# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173# define HAVE_GETHOSTBYNAME_R_3_ARG
174# elif defined(__sun) || defined(__sgi)
175# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700176# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000177/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000178# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
179# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000180# else
181# undef HAVE_GETHOSTBYNAME_R
182# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000183#endif
184
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200185#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000186# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000187#endif
188
Ned Deilye1d4e582016-02-23 22:05:29 +1100189/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#ifdef HAVE_SYS_PARAM_H
191#include <sys/param.h>
192#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000193/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100194 (this includes the getaddrinfo emulation) protect access with a lock.
195
196 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
197 a mix of code including an unsafe implementation from an old BSD's
198 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
199 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100200 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100201
Ned Deilye1d4e582016-02-23 22:05:29 +1100202 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
203 http://www.openbsd.org/plus54.html
204
205 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
206
207http://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 +1100208 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200209#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100210 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000211 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100212 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
213 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100214 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000215#define USE_GETADDRINFO_LOCK
216#endif
217
218#ifdef USE_GETADDRINFO_LOCK
219#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
220#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
221#else
222#define ACQUIRE_GETADDRINFO_LOCK
223#define RELEASE_GETADDRINFO_LOCK
224#endif
225
226#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000228#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000230
Serhiy Storchakad3187152017-11-09 18:00:38 +0200231#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100232# include <sys/ioctl.h>
233#endif
234
235
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000236#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000237/* make sure that the reentrant (gethostbyaddr_r etc)
238 functions are declared correctly if compiling with
239 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240
Thomas Wouters477c8d52006-05-27 19:21:47 +0000241/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000243#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000244#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000245
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000246#undef _XOPEN_SOURCE
247#include <sys/socket.h>
248#include <sys/types.h>
249#include <netinet/in.h>
250#ifdef _SS_ALIGNSIZE
251#define HAVE_GETADDRINFO 1
252#define HAVE_GETNAMEINFO 1
253#endif
254
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255#define HAVE_INET_PTON
256#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000257#endif
258
Benjamin Peterson06930632017-09-04 16:36:05 -0700259/* Solaris fails to define this variable at all. */
260#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000261#define INET_ADDRSTRLEN 16
262#endif
263
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000265#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000266#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000267#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700269#ifdef HAVE_SYS_SOCKET_H
270#include <sys/socket.h>
271#endif
272
273#ifdef HAVE_NET_IF_H
274#include <net/if.h>
275#endif
276
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000277/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000279#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280
281/* Addressing includes */
282
Guido van Rossum6f489d91996-06-28 20:15:15 +0000283#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284
285/* Non-MS WINDOWS includes */
286# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000287# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000288
Guido van Rossum9376b741999-09-15 22:01:40 +0000289/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000291
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000294#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000297# ifdef HAVE_FCNTL_H
298# include <fcntl.h>
299# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000300
Steve Dower65e4cb12014-11-22 12:54:57 -0800301/* Provides the IsWindows7SP1OrGreater() function */
302#include <VersionHelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800303
Jeremy Hylton22308652001-02-02 03:23:09 +0000304#endif
305
Skip Montanaro7befb992004-02-10 16:50:21 +0000306#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000307
Neal Norwitz39d22e52002-11-02 19:55:21 +0000308#ifndef O_NONBLOCK
309# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310#endif
311
Trent Micka708d6e2004-09-07 17:48:26 +0000312/* include Python's addrinfo.h unless it causes trouble */
313#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
314 /* Do not include addinfo.h on some newer IRIX versions.
315 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
316 * for example, but not by 6.5.10.
317 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000318#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000319 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
320 * EAI_* constants are defined in (the already included) ws2tcpip.h.
321 */
322#else
323# include "addrinfo.h"
324#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000325
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000326#ifdef __APPLE__
327/* On OS X, getaddrinfo returns no error indication of lookup
328 failure, so we must use the emulation instead of the libinfo
329 implementation. Unfortunately, performing an autoconf test
330 for this bug would require DNS access for the machine performing
331 the configuration, which is not acceptable. Therefore, we
332 determine the bug just by checking for __APPLE__. If this bug
333 gets ever fixed, perhaps checking for sys/version.h would be
334 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000335#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600336/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000337 Find to check for Jaguar is that it has getnameinfo(), which
338 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000341
342#ifdef HAVE_INET_ATON
343#define USE_INET_ATON_WEAKLINK
344#endif
345
Jack Jansen84262fb2002-07-02 14:40:42 +0000346#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000350/* avoid clashes with the C library definition of the symbol. */
351#define getaddrinfo fake_getaddrinfo
352#define gai_strerror fake_gai_strerror
353#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000354#include "getaddrinfo.c"
355#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000358#include "getnameinfo.c"
359#endif
360
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000361#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000362#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000363#endif
364
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000365#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000366#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000367#define EAFNOSUPPORT WSAEAFNOSUPPORT
368#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000369#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000370
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000371#ifndef SOCKETCLOSE
372#define SOCKETCLOSE close
373#endif
374
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000375#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000376#define USE_BLUETOOTH 1
377#if defined(__FreeBSD__)
378#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
379#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000380#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000381#define SOL_HCI SOL_HCI_RAW
382#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000383#define sockaddr_l2 sockaddr_l2cap
384#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000385#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000386#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
387#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000390#define sockaddr_l2 sockaddr_bt
391#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000392#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000394#define SOL_HCI BTPROTO_HCI
395#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000400#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000401#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
402#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000403#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000404#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
405#endif
406#endif
407
Charles-François Natali8b759652011-12-23 16:44:51 +0100408/* Convert "sock_addr_t *" to "struct sockaddr *". */
409#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410
Martin v. Löwise9416172003-05-03 10:12:45 +0000411/*
412 * Constants for getnameinfo()
413 */
414#if !defined(NI_MAXHOST)
415#define NI_MAXHOST 1025
416#endif
417#if !defined(NI_MAXSERV)
418#define NI_MAXSERV 32
419#endif
420
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000421#ifndef INVALID_SOCKET /* MS defines this */
422#define INVALID_SOCKET (-1)
423#endif
424
Charles-François Natali0cc86852013-09-13 19:53:08 +0200425#ifndef INADDR_NONE
426#define INADDR_NONE (-1)
427#endif
428
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000429/* XXX There's a problem here: *static* functions are not supposed to have
430 a Py prefix (or use CapitalizedWords). Later... */
431
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432/* Global variable holding the exception type for errors detected
433 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434static PyObject *socket_herror;
435static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000436static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000437
Tim Peters643a7fc2002-02-17 04:13:21 +0000438/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000439 The sock_type variable contains pointers to various functions,
440 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000441 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000442static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000443
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000444#if defined(HAVE_POLL_H)
445#include <poll.h>
446#elif defined(HAVE_SYS_POLL_H)
447#include <sys/poll.h>
448#endif
449
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000450/* Largest value to try to store in a socklen_t (used when handling
451 ancillary data). POSIX requires socklen_t to hold at least
452 (2**31)-1 and recommends against storing larger values, but
453 socklen_t was originally int in the BSD interface, so to be on the
454 safe side we use the smaller of (2**31)-1 and INT_MAX. */
455#if INT_MAX > 0x7fffffff
456#define SOCKLEN_T_LIMIT 0x7fffffff
457#else
458#define SOCKLEN_T_LIMIT INT_MAX
459#endif
460
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462/* Instead of select(), we'll use poll() since poll() works on any fd. */
463#define IS_SELECTABLE(s) 1
464/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000465#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200466/* If there's no timeout left, we don't have to call select, so it's a safe,
467 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100468#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000469#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000470
471static PyObject*
472select_error(void)
473{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200474 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000476}
477
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000478#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000479#ifndef WSAEAGAIN
480#define WSAEAGAIN WSAEWOULDBLOCK
481#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000482#define CHECK_ERRNO(expected) \
483 (WSAGetLastError() == WSA ## expected)
484#else
485#define CHECK_ERRNO(expected) \
486 (errno == expected)
487#endif
488
Victor Stinnerdaf45552013-08-28 00:53:59 +0200489#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200490# define GET_SOCK_ERROR WSAGetLastError()
491# define SET_SOCK_ERROR(err) WSASetLastError(err)
492# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
493# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300494# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200495#else
496# define GET_SOCK_ERROR errno
497# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
498# define SOCK_TIMEOUT_ERR EWOULDBLOCK
499# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300500# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200501#endif
502
503
504#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200505/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
506static int support_wsa_no_inherit = -1;
507#endif
508
Guido van Rossum30a685f1991-06-27 15:51:29 +0000509/* Convenience function to raise an error according to errno
510 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511
Guido van Rossum73624e91994-10-10 17:59:00 +0000512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000513set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000515#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 int err_no = WSAGetLastError();
517 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
518 recognizes the error codes used by both GetLastError() and
519 WSAGetLastError */
520 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200521 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000522#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000523
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200524 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000525}
526
Guido van Rossum30a685f1991-06-27 15:51:29 +0000527
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000529set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532
533#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (v != NULL) {
539 PyErr_SetObject(socket_herror, v);
540 Py_DECREF(v);
541 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544}
545
546
547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000548set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
Martin v. Löwis272cb402002-03-01 08:31:07 +0000552#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* EAI_SYSTEM is not available on Windows XP. */
554 if (error == EAI_SYSTEM)
555 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000556#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000558#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000560#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 if (v != NULL) {
564 PyErr_SetObject(socket_gaierror, v);
565 Py_DECREF(v);
566 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569}
570
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000571/* Function to perform the setting of socket blocking mode
572 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000573static int
574internal_setblocking(PySocketSockObject *s, int block)
575{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400576 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200577#ifdef MS_WINDOWS
578 u_long arg;
579#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100580#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100581 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100582 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000586#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100587#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200589 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400590 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100591#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200593 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400594 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100596 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 else
Victor Stinner9a954832013-12-04 00:41:24 +0100598 new_delay_flag = delay_flag | O_NONBLOCK;
599 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200600 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400601 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100602#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000603#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200604 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200605 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400606 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400608
609 result = 0;
610
611 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000613
Yury Selivanovfa22b292016-10-18 16:03:52 -0400614 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200615#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400616 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200617#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400618 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200619#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400620 }
621
622 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623}
624
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000625static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200626internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
627 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100630#ifdef HAVE_POLL
631 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200632 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100633#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200634 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200635 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100636#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000637
Victor Stinnerb7df3142015-03-27 22:59:32 +0100638 /* must be called with the GIL held */
639 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100640
Victor Stinner416f2e62015-03-31 13:56:29 +0200641 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200642 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200645 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 /* Prefer poll, if available, since you can poll() any fd
649 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000650#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100651 pollfd.fd = s->sock_fd;
652 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200653 if (connect) {
654 /* On Windows, the socket becomes writable on connection success,
655 but a connection failure is notified as an error. On POSIX, the
656 socket becomes writable on connection success or on connection
657 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200658 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200659 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660
Victor Stinner71694d52015-03-28 01:18:54 +0100661 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200662 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200663 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000664
Victor Stinner71694d52015-03-28 01:18:54 +0100665 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200666 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100667 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668#else
Victor Stinnerced11742015-04-09 10:27:25 +0200669 if (interval >= 0) {
670 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
671 tvp = &tv;
672 }
673 else
674 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675
Victor Stinner71694d52015-03-28 01:18:54 +0100676 FD_ZERO(&fds);
677 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200678 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200679 if (connect) {
680 /* On Windows, the socket becomes writable on connection success,
681 but a connection failure is notified as an error. On POSIX, the
682 socket becomes writable on connection success or on connection
683 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200684 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200685 }
Victor Stinner71694d52015-03-28 01:18:54 +0100686
687 /* See if the socket is ready */
688 Py_BEGIN_ALLOW_THREADS;
689 if (writing)
690 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200691 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100692 else
693 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200694 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100695 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000696#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 if (n < 0)
699 return -1;
700 if (n == 0)
701 return 1;
702 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703}
704
Victor Stinner31bf2d52015-04-01 21:57:09 +0200705/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000706
Victor Stinner81c41db2015-04-02 11:50:57 +0200707 On error, raise an exception and return -1 if err is set, or fill err and
708 return -1 otherwise. If a signal was received and the signal handler raised
709 an exception, return -1, and set err to -1 if err is set.
710
711 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100712
Victor Stinner31bf2d52015-04-01 21:57:09 +0200713 If the socket has a timeout, wait until the socket is ready before calling
714 the function: wait until the socket is writable if writing is nonzero, wait
715 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100716
Victor Stinner81c41db2015-04-02 11:50:57 +0200717 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200718 the function, except if the signal handler raised an exception (PEP 475).
719
720 When the function is retried, recompute the timeout using a monotonic clock.
721
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 sock_call_ex() must be called with the GIL held. The socket function is
723 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200724static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200725sock_call_ex(PySocketSockObject *s,
726 int writing,
727 int (*sock_func) (PySocketSockObject *s, void *data),
728 void *data,
729 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200730 int *err,
731 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200732{
Victor Stinner8912d142015-04-06 23:16:34 +0200733 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200734 _PyTime_t deadline = 0;
735 int deadline_initialized = 0;
736 int res;
737
738 /* sock_call() must be called with the GIL held. */
739 assert(PyGILState_Check());
740
741 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200742 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200743 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200744 /* For connect(), poll even for blocking socket. The connection
745 runs asynchronously. */
746 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200748 _PyTime_t interval;
749
Victor Stinner81c41db2015-04-02 11:50:57 +0200750 if (deadline_initialized) {
751 /* recompute the timeout */
752 interval = deadline - _PyTime_GetMonotonicClock();
753 }
754 else {
755 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200756 deadline = _PyTime_GetMonotonicClock() + timeout;
757 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759
Victor Stinner10550cd2015-04-03 13:22:27 +0200760 if (interval >= 0)
761 res = internal_select(s, writing, interval, connect);
762 else
763 res = 1;
764 }
765 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200766 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200767 }
768
Victor Stinner31bf2d52015-04-01 21:57:09 +0200769 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200770 if (err)
771 *err = GET_SOCK_ERROR;
772
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773 if (CHECK_ERRNO(EINTR)) {
774 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 if (PyErr_CheckSignals()) {
776 if (err)
777 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200778 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200779 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200780
781 /* retry select() */
782 continue;
783 }
784
785 /* select() failed */
786 s->errorhandler();
787 return -1;
788 }
789
790 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200791 if (err)
792 *err = SOCK_TIMEOUT_ERR;
793 else
794 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795 return -1;
796 }
797
798 /* the socket is ready */
799 }
800
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 /* inner loop to retry sock_func() when sock_func() is interrupted
802 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803 while (1) {
804 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200805 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200806 Py_END_ALLOW_THREADS
807
808 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200809 /* sock_func() succeeded */
810 if (err)
811 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812 return 0;
813 }
814
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 if (err)
816 *err = GET_SOCK_ERROR;
817
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818 if (!CHECK_ERRNO(EINTR))
819 break;
820
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 /* sock_func() was interrupted by a signal */
822 if (PyErr_CheckSignals()) {
823 if (err)
824 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200825 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200826 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200829 }
830
831 if (s->sock_timeout > 0
832 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834
835 For example, select() could indicate a socket is ready for
836 reading, but the data then discarded by the OS because of a
837 wrong checksum.
838
839 Loop on select() to recheck for socket readyness. */
840 continue;
841 }
842
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 /* sock_func() failed */
844 if (!err)
845 s->errorhandler();
846 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000847 return -1;
848 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200849}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000850
Victor Stinner81c41db2015-04-02 11:50:57 +0200851static int
852sock_call(PySocketSockObject *s,
853 int writing,
854 int (*func) (PySocketSockObject *s, void *data),
855 void *data)
856{
Victor Stinner8912d142015-04-06 23:16:34 +0200857 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200858}
859
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000860
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000861/* Initialize a new socket object. */
862
Victor Stinner88ed6402015-04-09 10:23:12 +0200863/* Default timeout for new sockets */
864static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000865
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200866static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000867init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 s->sock_fd = fd;
871 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500874
875 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
876 on some OSes as part of socket.type. We want to reset them here,
877 to make socket.type be set to the same value on all platforms.
878 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
879 not portable.
880 */
881#ifdef SOCK_NONBLOCK
882 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
883#endif
884#ifdef SOCK_CLOEXEC
885 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
886#endif
887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000891#ifdef SOCK_NONBLOCK
892 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100893 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000894 else
895#endif
896 {
897 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200898 if (defaulttimeout >= 0) {
899 if (internal_setblocking(s, 0) == -1) {
900 return -1;
901 }
902 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000903 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200904 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000905}
906
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908/* Create a new socket object.
909 This just creates the object and initializes it.
910 If the creation fails, return NULL and set an exception (implicit
911 in NEWOBJ()). */
912
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000914new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 PySocketSockObject *s;
917 s = (PySocketSockObject *)
918 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200919 if (s == NULL)
920 return NULL;
921 if (init_sockobject(s, fd, family, type, proto) == -1) {
922 Py_DECREF(s);
923 return NULL;
924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926}
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
Guido van Rossum48a680c2001-03-02 06:34:14 +0000929/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000930 thread to be in gethostbyname or getaddrinfo */
931#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200932static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000933#endif
934
935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936/* Convert a string specifying a host name or one of a few symbolic
937 names to a numeric IP address. This usually calls gethostbyname()
938 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000939 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940 an error occurred; then an exception is raised. */
941
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200943setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 struct addrinfo hints, *res;
946 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
949 if (name[0] == '\0') {
950 int siz;
951 memset(&hints, 0, sizeof(hints));
952 hints.ai_family = af;
953 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
954 hints.ai_flags = AI_PASSIVE;
955 Py_BEGIN_ALLOW_THREADS
956 ACQUIRE_GETADDRINFO_LOCK
957 error = getaddrinfo(NULL, "0", &hints, &res);
958 Py_END_ALLOW_THREADS
959 /* We assume that those thread-unsafe getaddrinfo() versions
960 *are* safe regarding their return value, ie. that a
961 subsequent call to getaddrinfo() does not destroy the
962 outcome of the first call. */
963 RELEASE_GETADDRINFO_LOCK
964 if (error) {
965 set_gaierror(error);
966 return -1;
967 }
968 switch (res->ai_family) {
969 case AF_INET:
970 siz = 4;
971 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000972#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 case AF_INET6:
974 siz = 16;
975 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 default:
978 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200979 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 "unsupported address family");
981 return -1;
982 }
983 if (res->ai_next) {
984 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200985 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 "wildcard resolved to multiple address");
987 return -1;
988 }
989 if (res->ai_addrlen < addr_ret_size)
990 addr_ret_size = res->ai_addrlen;
991 memcpy(addr_ret, res->ai_addr, addr_ret_size);
992 freeaddrinfo(res);
993 return siz;
994 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200995 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100996 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200997 if (strcmp(name, "255.255.255.255") == 0 ||
998 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 struct sockaddr_in *sin;
1000 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 "address family mismatched");
1003 return -1;
1004 }
1005 sin = (struct sockaddr_in *)addr_ret;
1006 memset((void *) sin, '\0', sizeof(*sin));
1007 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001008#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 sin->sin_addr.s_addr = INADDR_BROADCAST;
1012 return sizeof(sin->sin_addr);
1013 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014
1015 /* avoid a name resolution in case of numeric address */
1016#ifdef HAVE_INET_PTON
1017 /* check for an IPv4 address */
1018 if (af == AF_UNSPEC || af == AF_INET) {
1019 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1020 memset(sin, 0, sizeof(*sin));
1021 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1022 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001023#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001024 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001025#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001026 return 4;
1027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001029#ifdef ENABLE_IPV6
1030 /* check for an IPv6 address - if the address contains a scope ID, we
1031 * fallback to getaddrinfo(), which can handle translation from interface
1032 * name to interface index */
1033 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1034 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1035 memset(sin, 0, sizeof(*sin));
1036 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1037 sin->sin6_family = AF_INET6;
1038#ifdef HAVE_SOCKADDR_SA_LEN
1039 sin->sin6_len = sizeof(*sin);
1040#endif
1041 return 16;
1042 }
1043 }
1044#endif /* ENABLE_IPV6 */
1045#else /* HAVE_INET_PTON */
1046 /* check for an IPv4 address */
1047 if (af == AF_INET || af == AF_UNSPEC) {
1048 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1049 memset(sin, 0, sizeof(*sin));
1050 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1051 sin->sin_family = AF_INET;
1052#ifdef HAVE_SOCKADDR_SA_LEN
1053 sin->sin_len = sizeof(*sin);
1054#endif
1055 return 4;
1056 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001057 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001058#endif /* HAVE_INET_PTON */
1059
1060 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 memset(&hints, 0, sizeof(hints));
1062 hints.ai_family = af;
1063 Py_BEGIN_ALLOW_THREADS
1064 ACQUIRE_GETADDRINFO_LOCK
1065 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001066#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 if (error == EAI_NONAME && af == AF_UNSPEC) {
1068 /* On Tru64 V5.1, numeric-to-addr conversion fails
1069 if no address family is given. Assume IPv4 for now.*/
1070 hints.ai_family = AF_INET;
1071 error = getaddrinfo(name, NULL, &hints, &res);
1072 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 Py_END_ALLOW_THREADS
1075 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1076 if (error) {
1077 set_gaierror(error);
1078 return -1;
1079 }
1080 if (res->ai_addrlen < addr_ret_size)
1081 addr_ret_size = res->ai_addrlen;
1082 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1083 freeaddrinfo(res);
1084 switch (addr_ret->sa_family) {
1085 case AF_INET:
1086 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001087#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case AF_INET6:
1089 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001092 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 return -1;
1094 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095}
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001098/* Create a string object representing an IP address.
1099 This is always a string of the form 'dd.dd.dd.dd' (with variable
1100 size numbers). */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001103makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104{
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001105 char buf[NI_MAXHOST];
1106 int error;
1107
1108 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1109 NI_NUMERICHOST);
1110 if (error) {
1111 set_gaierror(error);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 return NULL;
1113 }
1114 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115}
1116
1117
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118#ifdef USE_BLUETOOTH
1119/* Convert a string representation of a Bluetooth address into a numeric
1120 address. Returns the length (6), or raises an exception and returns -1 if
1121 an error occurred. */
1122
1123static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001124setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 unsigned int b0, b1, b2, b3, b4, b5;
1127 char ch;
1128 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1131 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1132 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1133 bdaddr->b[0] = b0;
1134 bdaddr->b[1] = b1;
1135 bdaddr->b[2] = b2;
1136 bdaddr->b[3] = b3;
1137 bdaddr->b[4] = b4;
1138 bdaddr->b[5] = b5;
1139 return 6;
1140 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001141 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 return -1;
1143 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144}
1145
1146/* Create a string representation of the Bluetooth address. This is always a
1147 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1148 value (zero padded if necessary). */
1149
1150static PyObject *
1151makebdaddr(bdaddr_t *bdaddr)
1152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1156 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1157 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1158 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159}
1160#endif
1161
1162
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163/* Create an object representing the given socket address,
1164 suitable for passing it back to bind(), connect() etc.
1165 The family field of the sockaddr structure is inspected
1166 to determine what kind of address it really is. */
1167
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001169static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001170makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (addrlen == 0) {
1173 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001174 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case AF_INET:
1180 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001181 struct sockaddr_in *a;
1182 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 PyObject *ret = NULL;
1184 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001185 a = (struct sockaddr_in *)addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1187 Py_DECREF(addrobj);
1188 }
1189 return ret;
1190 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001192#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 case AF_UNIX:
1194 {
1195 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001196#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001197 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1198 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1199 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 }
1201 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001202#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 {
1204 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001205 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 }
1207 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001208#endif /* AF_UNIX */
1209
Martin v. Löwis11017b12006-01-14 18:12:57 +00001210#if defined(AF_NETLINK)
1211 case AF_NETLINK:
1212 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1214 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001215 }
1216#endif /* AF_NETLINK */
1217
caaveryeffc12f2017-09-06 18:18:10 -04001218#if defined(AF_VSOCK)
1219 case AF_VSOCK:
1220 {
1221 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1222 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1223 }
1224#endif /* AF_VSOCK */
1225
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001226#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AF_INET6:
1228 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001229 struct sockaddr_in6 *a;
1230 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 PyObject *ret = NULL;
1232 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001233 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001234 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 addrobj,
1236 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001237 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 a->sin6_scope_id);
1239 Py_DECREF(addrobj);
1240 }
1241 return ret;
1242 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001243#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001245#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 case AF_BLUETOOTH:
1247 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 case BTPROTO_L2CAP:
1250 {
1251 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1252 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1253 PyObject *ret = NULL;
1254 if (addrobj) {
1255 ret = Py_BuildValue("Oi",
1256 addrobj,
1257 _BT_L2_MEMB(a, psm));
1258 Py_DECREF(addrobj);
1259 }
1260 return ret;
1261 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 case BTPROTO_RFCOMM:
1264 {
1265 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1266 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1267 PyObject *ret = NULL;
1268 if (addrobj) {
1269 ret = Py_BuildValue("Oi",
1270 addrobj,
1271 _BT_RC_MEMB(a, channel));
1272 Py_DECREF(addrobj);
1273 }
1274 return ret;
1275 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 case BTPROTO_HCI:
1278 {
1279 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001280#if defined(__NetBSD__) || defined(__DragonFly__)
1281 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001282#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 PyObject *ret = NULL;
1284 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1285 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001286#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001288
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001289#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case BTPROTO_SCO:
1291 {
1292 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1293 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1294 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001295#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 default:
1298 PyErr_SetString(PyExc_ValueError,
1299 "Unknown Bluetooth protocol");
1300 return NULL;
1301 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001302#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001303
Antoine Pitroub156a462010-10-27 20:13:57 +00001304#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_PACKET:
1306 {
1307 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001308 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 struct ifreq ifr;
1310 /* need to look up interface name give index */
1311 if (a->sll_ifindex) {
1312 ifr.ifr_ifindex = a->sll_ifindex;
1313 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1314 ifname = ifr.ifr_name;
1315 }
1316 return Py_BuildValue("shbhy#",
1317 ifname,
1318 ntohs(a->sll_protocol),
1319 a->sll_pkttype,
1320 a->sll_hatype,
1321 a->sll_addr,
1322 a->sll_halen);
1323 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001324#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001325
Christian Heimes043d6f62008-01-07 17:19:16 +00001326#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 case AF_TIPC:
1328 {
1329 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1330 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1331 return Py_BuildValue("IIIII",
1332 a->addrtype,
1333 a->addr.nameseq.type,
1334 a->addr.nameseq.lower,
1335 a->addr.nameseq.upper,
1336 a->scope);
1337 } else if (a->addrtype == TIPC_ADDR_NAME) {
1338 return Py_BuildValue("IIIII",
1339 a->addrtype,
1340 a->addr.name.name.type,
1341 a->addr.name.name.instance,
1342 a->addr.name.name.instance,
1343 a->scope);
1344 } else if (a->addrtype == TIPC_ADDR_ID) {
1345 return Py_BuildValue("IIIII",
1346 a->addrtype,
1347 a->addr.id.node,
1348 a->addr.id.ref,
1349 0,
1350 a->scope);
1351 } else {
1352 PyErr_SetString(PyExc_ValueError,
1353 "Invalid address type");
1354 return NULL;
1355 }
1356 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001357#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001358
Serhiy Storchakad3187152017-11-09 18:00:38 +02001359#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001360 case AF_CAN:
1361 {
1362 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001363 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001364 struct ifreq ifr;
1365 /* need to look up interface name given index */
1366 if (a->can_ifindex) {
1367 ifr.ifr_ifindex = a->can_ifindex;
1368 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1369 ifname = ifr.ifr_name;
1370 }
1371
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001372 switch (proto) {
1373#ifdef CAN_ISOTP
1374 case CAN_ISOTP:
1375 {
1376 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1377 ifname,
1378 a->can_addr.tp.rx_id,
1379 a->can_addr.tp.tx_id);
1380 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001381#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001382 default:
1383 {
1384 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1385 ifname);
1386 }
1387 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001388 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001389#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001390
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001391#ifdef PF_SYSTEM
1392 case PF_SYSTEM:
1393 switch(proto) {
1394#ifdef SYSPROTO_CONTROL
1395 case SYSPROTO_CONTROL:
1396 {
1397 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1398 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1399 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001400#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001401 default:
1402 PyErr_SetString(PyExc_ValueError,
1403 "Invalid address type");
1404 return 0;
1405 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001406#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001407
Christian Heimesdffa3942016-09-05 23:54:41 +02001408#ifdef HAVE_SOCKADDR_ALG
1409 case AF_ALG:
1410 {
1411 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1412 return Py_BuildValue("s#s#HH",
1413 a->salg_type,
1414 strnlen((const char*)a->salg_type,
1415 sizeof(a->salg_type)),
1416 a->salg_name,
1417 strnlen((const char*)a->salg_name,
1418 sizeof(a->salg_name)),
1419 a->salg_feat,
1420 a->salg_mask);
1421 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001422#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 default:
1427 /* If we don't know the address family, don't raise an
1428 exception -- return it as an (int, bytes) tuple. */
1429 return Py_BuildValue("iy#",
1430 addr->sa_family,
1431 addr->sa_data,
1432 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435}
1436
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001437/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1438 (in particular, numeric IP addresses). */
1439struct maybe_idna {
1440 PyObject *obj;
1441 char *buf;
1442};
1443
1444static void
1445idna_cleanup(struct maybe_idna *data)
1446{
1447 Py_CLEAR(data->obj);
1448}
1449
1450static int
1451idna_converter(PyObject *obj, struct maybe_idna *data)
1452{
1453 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001454 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455 if (obj == NULL) {
1456 idna_cleanup(data);
1457 return 1;
1458 }
1459 data->obj = NULL;
1460 len = -1;
1461 if (PyBytes_Check(obj)) {
1462 data->buf = PyBytes_AsString(obj);
1463 len = PyBytes_Size(obj);
1464 }
1465 else if (PyByteArray_Check(obj)) {
1466 data->buf = PyByteArray_AsString(obj);
1467 len = PyByteArray_Size(obj);
1468 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001469 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001470 if (PyUnicode_READY(obj) == -1) {
1471 return 0;
1472 }
1473 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001474 data->buf = PyUnicode_DATA(obj);
1475 len = PyUnicode_GET_LENGTH(obj);
1476 }
1477 else {
1478 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1479 if (!obj2) {
1480 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1481 return 0;
1482 }
1483 assert(PyBytes_Check(obj2));
1484 data->obj = obj2;
1485 data->buf = PyBytes_AS_STRING(obj2);
1486 len = PyBytes_GET_SIZE(obj2);
1487 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001488 }
1489 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001490 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1491 obj->ob_type->tp_name);
1492 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001493 }
1494 if (strlen(data->buf) != len) {
1495 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001496 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001497 return 0;
1498 }
1499 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001500}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501
1502/* Parse a socket address argument according to the socket object's
1503 address family. Return 1 if the address was in the proper format,
1504 0 of not. The address is returned through addr_ret, its length
1505 through len_ret. */
1506
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001507static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001508getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001512
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001513#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 case AF_UNIX:
1515 {
1516 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001517 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001518 int retval = 0;
1519
1520 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1521 allow embedded nulls on Linux. */
1522 if (PyUnicode_Check(args)) {
1523 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1524 return 0;
1525 }
1526 else
1527 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001528 if (!PyArg_Parse(args, "y*", &path)) {
1529 Py_DECREF(args);
1530 return retval;
1531 }
1532 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001535#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001536 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001538 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001539 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001541 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 }
1543 }
1544 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 {
1547 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001548 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001549 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001551 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 }
1555 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001556 memcpy(addr->sun_path, path.buf, path.len);
1557 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001558 retval = 1;
1559 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001560 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001561 Py_DECREF(args);
1562 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001564#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001565
Martin v. Löwis11017b12006-01-14 18:12:57 +00001566#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 case AF_NETLINK:
1568 {
1569 struct sockaddr_nl* addr;
1570 int pid, groups;
1571 addr = (struct sockaddr_nl *)addr_ret;
1572 if (!PyTuple_Check(args)) {
1573 PyErr_Format(
1574 PyExc_TypeError,
1575 "getsockaddrarg: "
1576 "AF_NETLINK address must be tuple, not %.500s",
1577 Py_TYPE(args)->tp_name);
1578 return 0;
1579 }
1580 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1581 return 0;
1582 addr->nl_family = AF_NETLINK;
1583 addr->nl_pid = pid;
1584 addr->nl_groups = groups;
1585 *len_ret = sizeof(*addr);
1586 return 1;
1587 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001588#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001589
caaveryeffc12f2017-09-06 18:18:10 -04001590#if defined(AF_VSOCK)
1591 case AF_VSOCK:
1592 {
1593 struct sockaddr_vm* addr;
1594 int port, cid;
1595 addr = (struct sockaddr_vm *)addr_ret;
1596 memset(addr, 0, sizeof(struct sockaddr_vm));
1597 if (!PyTuple_Check(args)) {
1598 PyErr_Format(
1599 PyExc_TypeError,
1600 "getsockaddrarg: "
1601 "AF_VSOCK address must be tuple, not %.500s",
1602 Py_TYPE(args)->tp_name);
1603 return 0;
1604 }
1605 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1606 return 0;
1607 addr->svm_family = s->sock_family;
1608 addr->svm_port = port;
1609 addr->svm_cid = cid;
1610 *len_ret = sizeof(*addr);
1611 return 1;
1612 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001613#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001614
1615
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001616#ifdef AF_RDS
1617 case AF_RDS:
1618 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001619#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 case AF_INET:
1622 {
1623 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001624 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 int port, result;
1626 if (!PyTuple_Check(args)) {
1627 PyErr_Format(
1628 PyExc_TypeError,
1629 "getsockaddrarg: "
1630 "AF_INET address must be tuple, not %.500s",
1631 Py_TYPE(args)->tp_name);
1632 return 0;
1633 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1635 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 return 0;
1637 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001640 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 if (result < 0)
1642 return 0;
1643 if (port < 0 || port > 0xffff) {
1644 PyErr_SetString(
1645 PyExc_OverflowError,
1646 "getsockaddrarg: port must be 0-65535.");
1647 return 0;
1648 }
1649 addr->sin_family = AF_INET;
1650 addr->sin_port = htons((short)port);
1651 *len_ret = sizeof *addr;
1652 return 1;
1653 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001655#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 case AF_INET6:
1657 {
1658 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001659 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001660 int port, result;
1661 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 flowinfo = scope_id = 0;
1663 if (!PyTuple_Check(args)) {
1664 PyErr_Format(
1665 PyExc_TypeError,
1666 "getsockaddrarg: "
1667 "AF_INET6 address must be tuple, not %.500s",
1668 Py_TYPE(args)->tp_name);
1669 return 0;
1670 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001671 if (!PyArg_ParseTuple(args, "O&i|II",
1672 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 &scope_id)) {
1674 return 0;
1675 }
1676 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001677 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001679 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 if (result < 0)
1681 return 0;
1682 if (port < 0 || port > 0xffff) {
1683 PyErr_SetString(
1684 PyExc_OverflowError,
1685 "getsockaddrarg: port must be 0-65535.");
1686 return 0;
1687 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001688 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001689 PyErr_SetString(
1690 PyExc_OverflowError,
1691 "getsockaddrarg: flowinfo must be 0-1048575.");
1692 return 0;
1693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 addr->sin6_family = s->sock_family;
1695 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001696 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 addr->sin6_scope_id = scope_id;
1698 *len_ret = sizeof *addr;
1699 return 1;
1700 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001701#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001702
Hye-Shik Chang81268602004-02-02 06:05:24 +00001703#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 case AF_BLUETOOTH:
1705 {
1706 switch (s->sock_proto) {
1707 case BTPROTO_L2CAP:
1708 {
1709 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001710 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 addr = (struct sockaddr_l2 *)addr_ret;
1713 memset(addr, 0, sizeof(struct sockaddr_l2));
1714 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1715 if (!PyArg_ParseTuple(args, "si", &straddr,
1716 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001717 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 "wrong format");
1719 return 0;
1720 }
1721 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1722 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 *len_ret = sizeof *addr;
1725 return 1;
1726 }
1727 case BTPROTO_RFCOMM:
1728 {
1729 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001730 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 addr = (struct sockaddr_rc *)addr_ret;
1733 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1734 if (!PyArg_ParseTuple(args, "si", &straddr,
1735 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001736 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 "wrong format");
1738 return 0;
1739 }
1740 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1741 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 *len_ret = sizeof *addr;
1744 return 1;
1745 }
1746 case BTPROTO_HCI:
1747 {
1748 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001749#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001750 const char *straddr;
1751 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1752 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001753 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001754 "wrong format");
1755 return 0;
1756 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001757 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001758 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1759 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001760#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1762 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001763 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 "wrong format");
1765 return 0;
1766 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001767#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 *len_ret = sizeof *addr;
1769 return 1;
1770 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001771#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 case BTPROTO_SCO:
1773 {
1774 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001775 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 addr = (struct sockaddr_sco *)addr_ret;
1778 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1779 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001780 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 "wrong format");
1782 return 0;
1783 }
1784 straddr = PyBytes_AS_STRING(args);
1785 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1786 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 *len_ret = sizeof *addr;
1789 return 1;
1790 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001791#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001793 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 return 0;
1795 }
1796 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001797#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001798
Antoine Pitroub156a462010-10-27 20:13:57 +00001799#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 case AF_PACKET:
1801 {
1802 struct sockaddr_ll* addr;
1803 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001804 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 int protoNumber;
1806 int hatype = 0;
1807 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001808 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (!PyTuple_Check(args)) {
1811 PyErr_Format(
1812 PyExc_TypeError,
1813 "getsockaddrarg: "
1814 "AF_PACKET address must be tuple, not %.500s",
1815 Py_TYPE(args)->tp_name);
1816 return 0;
1817 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001820 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 return 0;
1822 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1823 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1824 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1825 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001826 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return 0;
1828 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001829 if (haddr.buf && haddr.len > 8) {
1830 PyErr_SetString(PyExc_ValueError,
1831 "Hardware address must be 8 bytes or less");
1832 PyBuffer_Release(&haddr);
1833 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 }
1835 if (protoNumber < 0 || protoNumber > 0xffff) {
1836 PyErr_SetString(
1837 PyExc_OverflowError,
1838 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001839 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 return 0;
1841 }
1842 addr = (struct sockaddr_ll*)addr_ret;
1843 addr->sll_family = AF_PACKET;
1844 addr->sll_protocol = htons((short)protoNumber);
1845 addr->sll_ifindex = ifr.ifr_ifindex;
1846 addr->sll_pkttype = pkttype;
1847 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001848 if (haddr.buf) {
1849 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1850 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001852 else
1853 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001855 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 return 1;
1857 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001858#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001859
Christian Heimes043d6f62008-01-07 17:19:16 +00001860#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 case AF_TIPC:
1862 {
1863 unsigned int atype, v1, v2, v3;
1864 unsigned int scope = TIPC_CLUSTER_SCOPE;
1865 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (!PyTuple_Check(args)) {
1868 PyErr_Format(
1869 PyExc_TypeError,
1870 "getsockaddrarg: "
1871 "AF_TIPC address must be tuple, not %.500s",
1872 Py_TYPE(args)->tp_name);
1873 return 0;
1874 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (!PyArg_ParseTuple(args,
1877 "IIII|I;Invalid TIPC address format",
1878 &atype, &v1, &v2, &v3, &scope))
1879 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 addr = (struct sockaddr_tipc *) addr_ret;
1882 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 addr->family = AF_TIPC;
1885 addr->scope = scope;
1886 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 if (atype == TIPC_ADDR_NAMESEQ) {
1889 addr->addr.nameseq.type = v1;
1890 addr->addr.nameseq.lower = v2;
1891 addr->addr.nameseq.upper = v3;
1892 } else if (atype == TIPC_ADDR_NAME) {
1893 addr->addr.name.name.type = v1;
1894 addr->addr.name.name.instance = v2;
1895 } else if (atype == TIPC_ADDR_ID) {
1896 addr->addr.id.node = v1;
1897 addr->addr.id.ref = v2;
1898 } else {
1899 /* Shouldn't happen */
1900 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1901 return 0;
1902 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 return 1;
1907 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001908#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001909
Serhiy Storchakad3187152017-11-09 18:00:38 +02001910#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001911 case AF_CAN:
1912 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001913#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001914 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001915 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001916#endif
1917#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001918 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001919#endif
1920#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001921 {
1922 struct sockaddr_can *addr;
1923 PyObject *interfaceName;
1924 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001925 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001926 addr = (struct sockaddr_can *)addr_ret;
1927
Charles-François Natali47413c12011-10-06 19:47:44 +02001928 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1929 &interfaceName))
1930 return 0;
1931
1932 len = PyBytes_GET_SIZE(interfaceName);
1933
1934 if (len == 0) {
1935 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001936 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001937 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1938 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001939 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1940 s->errorhandler();
1941 Py_DECREF(interfaceName);
1942 return 0;
1943 }
1944 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001945 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001946 "AF_CAN interface name too long");
1947 Py_DECREF(interfaceName);
1948 return 0;
1949 }
1950
1951 addr->can_family = AF_CAN;
1952 addr->can_ifindex = ifr.ifr_ifindex;
1953
1954 *len_ret = sizeof(*addr);
1955 Py_DECREF(interfaceName);
1956 return 1;
1957 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001958#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001959
1960#ifdef CAN_ISOTP
1961 case CAN_ISOTP:
1962 {
1963 struct sockaddr_can *addr;
1964 PyObject *interfaceName;
1965 struct ifreq ifr;
1966 Py_ssize_t len;
1967 unsigned long int rx_id, tx_id;
1968
1969 addr = (struct sockaddr_can *)addr_ret;
1970
1971 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1972 &interfaceName,
1973 &rx_id,
1974 &tx_id))
1975 return 0;
1976
1977 len = PyBytes_GET_SIZE(interfaceName);
1978
1979 if (len == 0) {
1980 ifr.ifr_ifindex = 0;
1981 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1982 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1983 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1984 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1985 s->errorhandler();
1986 Py_DECREF(interfaceName);
1987 return 0;
1988 }
1989 } else {
1990 PyErr_SetString(PyExc_OSError,
1991 "AF_CAN interface name too long");
1992 Py_DECREF(interfaceName);
1993 return 0;
1994 }
1995
1996 addr->can_family = AF_CAN;
1997 addr->can_ifindex = ifr.ifr_ifindex;
1998 addr->can_addr.tp.rx_id = rx_id;
1999 addr->can_addr.tp.tx_id = tx_id;
2000
2001 *len_ret = sizeof(*addr);
2002 Py_DECREF(interfaceName);
2003 return 1;
2004 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002005#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002006 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002007 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002008 "getsockaddrarg: unsupported CAN protocol");
2009 return 0;
2010 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002011#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002012
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002013#ifdef PF_SYSTEM
2014 case PF_SYSTEM:
2015 switch (s->sock_proto) {
2016#ifdef SYSPROTO_CONTROL
2017 case SYSPROTO_CONTROL:
2018 {
2019 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002020
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002021 addr = (struct sockaddr_ctl *)addr_ret;
2022 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002023 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002024
2025 if (PyUnicode_Check(args)) {
2026 struct ctl_info info;
2027 PyObject *ctl_name;
2028
2029 if (!PyArg_Parse(args, "O&",
2030 PyUnicode_FSConverter, &ctl_name)) {
2031 return 0;
2032 }
2033
Victor Stinnerf50e1872015-03-20 11:32:24 +01002034 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002035 PyErr_SetString(PyExc_ValueError,
2036 "provided string is too long");
2037 Py_DECREF(ctl_name);
2038 return 0;
2039 }
2040 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2041 sizeof(info.ctl_name));
2042 Py_DECREF(ctl_name);
2043
2044 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2045 PyErr_SetString(PyExc_OSError,
2046 "cannot find kernel control with provided name");
2047 return 0;
2048 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002049
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002050 addr->sc_id = info.ctl_id;
2051 addr->sc_unit = 0;
2052 } else if (!PyArg_ParseTuple(args, "II",
2053 &(addr->sc_id), &(addr->sc_unit))) {
2054 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2055 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002056
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002057 return 0;
2058 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002059
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002060 *len_ret = sizeof(*addr);
2061 return 1;
2062 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002063#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002064 default:
2065 PyErr_SetString(PyExc_OSError,
2066 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2067 return 0;
2068 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002069#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002070#ifdef HAVE_SOCKADDR_ALG
2071 case AF_ALG:
2072 {
2073 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002074 const char *type;
2075 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002076 sa = (struct sockaddr_alg *)addr_ret;
2077
2078 memset(sa, 0, sizeof(*sa));
2079 sa->salg_family = AF_ALG;
2080
2081 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2082 &type, &name, &sa->salg_feat, &sa->salg_mask))
2083 return 0;
2084 /* sockaddr_alg has fixed-sized char arrays for type and name */
2085 if (strlen(type) > sizeof(sa->salg_type)) {
2086 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2087 return 0;
2088 }
2089 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2090 if (strlen(name) > sizeof(sa->salg_name)) {
2091 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2092 return 0;
2093 }
2094 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2095
2096 *len_ret = sizeof(*sa);
2097 return 1;
2098 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002099#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002104 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002108}
2109
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110
Guido van Rossum48a680c2001-03-02 06:34:14 +00002111/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002112 Return 1 if the family is known, 0 otherwise. The length is returned
2113 through len_ret. */
2114
2115static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002116getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002119
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002120#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 case AF_UNIX:
2122 {
2123 *len_ret = sizeof (struct sockaddr_un);
2124 return 1;
2125 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002126#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002127
Martin v. Löwis11017b12006-01-14 18:12:57 +00002128#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002129 case AF_NETLINK:
2130 {
2131 *len_ret = sizeof (struct sockaddr_nl);
2132 return 1;
2133 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002134#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002135
caaveryeffc12f2017-09-06 18:18:10 -04002136#if defined(AF_VSOCK)
2137 case AF_VSOCK:
2138 {
2139 *len_ret = sizeof (struct sockaddr_vm);
2140 return 1;
2141 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002142#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002143
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002144#ifdef AF_RDS
2145 case AF_RDS:
2146 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002147#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 case AF_INET:
2150 {
2151 *len_ret = sizeof (struct sockaddr_in);
2152 return 1;
2153 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002154
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002155#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 case AF_INET6:
2157 {
2158 *len_ret = sizeof (struct sockaddr_in6);
2159 return 1;
2160 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002161#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002162
Hye-Shik Chang81268602004-02-02 06:05:24 +00002163#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 case AF_BLUETOOTH:
2165 {
2166 switch(s->sock_proto)
2167 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 case BTPROTO_L2CAP:
2170 *len_ret = sizeof (struct sockaddr_l2);
2171 return 1;
2172 case BTPROTO_RFCOMM:
2173 *len_ret = sizeof (struct sockaddr_rc);
2174 return 1;
2175 case BTPROTO_HCI:
2176 *len_ret = sizeof (struct sockaddr_hci);
2177 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002178#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 case BTPROTO_SCO:
2180 *len_ret = sizeof (struct sockaddr_sco);
2181 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002182#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002184 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 "unknown BT protocol");
2186 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 }
2189 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002190#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002191
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002192#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 case AF_PACKET:
2194 {
2195 *len_ret = sizeof (struct sockaddr_ll);
2196 return 1;
2197 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002198#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002199
Christian Heimes043d6f62008-01-07 17:19:16 +00002200#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 case AF_TIPC:
2202 {
2203 *len_ret = sizeof (struct sockaddr_tipc);
2204 return 1;
2205 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002206#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002207
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002208#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002209 case AF_CAN:
2210 {
2211 *len_ret = sizeof (struct sockaddr_can);
2212 return 1;
2213 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002214#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002215
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002216#ifdef PF_SYSTEM
2217 case PF_SYSTEM:
2218 switch(s->sock_proto) {
2219#ifdef SYSPROTO_CONTROL
2220 case SYSPROTO_CONTROL:
2221 *len_ret = sizeof (struct sockaddr_ctl);
2222 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002223#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002224 default:
2225 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2226 "unknown PF_SYSTEM protocol");
2227 return 0;
2228 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002229#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002230#ifdef HAVE_SOCKADDR_ALG
2231 case AF_ALG:
2232 {
2233 *len_ret = sizeof (struct sockaddr_alg);
2234 return 1;
2235 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002236#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002241 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002245}
2246
2247
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002248/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2249 Currently, these methods are only compiled if the RFC 2292/3542
2250 CMSG_LEN() macro is available. Older systems seem to have used
2251 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2252 it may be possible to define CMSG_LEN() that way if it's not
2253 provided. Some architectures might need extra padding after the
2254 cmsghdr, however, and CMSG_LEN() would have to take account of
2255 this. */
2256#ifdef CMSG_LEN
2257/* If length is in range, set *result to CMSG_LEN(length) and return
2258 true; otherwise, return false. */
2259static int
2260get_CMSG_LEN(size_t length, size_t *result)
2261{
2262 size_t tmp;
2263
2264 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2265 return 0;
2266 tmp = CMSG_LEN(length);
2267 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2268 return 0;
2269 *result = tmp;
2270 return 1;
2271}
2272
2273#ifdef CMSG_SPACE
2274/* If length is in range, set *result to CMSG_SPACE(length) and return
2275 true; otherwise, return false. */
2276static int
2277get_CMSG_SPACE(size_t length, size_t *result)
2278{
2279 size_t tmp;
2280
2281 /* Use CMSG_SPACE(1) here in order to take account of the padding
2282 necessary before *and* after the data. */
2283 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2284 return 0;
2285 tmp = CMSG_SPACE(length);
2286 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2287 return 0;
2288 *result = tmp;
2289 return 1;
2290}
2291#endif
2292
2293/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2294 pointer in msg->msg_control with at least "space" bytes after it,
2295 and its cmsg_len member inside the buffer. */
2296static int
2297cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2298{
2299 size_t cmsg_offset;
2300 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2301 sizeof(cmsgh->cmsg_len));
2302
Charles-François Natali466517d2011-08-28 18:23:43 +02002303 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002304 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002305 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002306 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2307 annoying under OS X as it's unsigned there and so it triggers a
2308 tautological comparison warning under Clang when compared against 0.
2309 Since the check is valid on other platforms, silence the warning under
2310 Clang. */
2311 #ifdef __clang__
2312 #pragma clang diagnostic push
2313 #pragma clang diagnostic ignored "-Wtautological-compare"
2314 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002315 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002316 #pragma GCC diagnostic push
2317 #pragma GCC diagnostic ignored "-Wtype-limits"
2318 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002319 if (msg->msg_controllen < 0)
2320 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002321 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002322 #pragma GCC diagnostic pop
2323 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002324 #ifdef __clang__
2325 #pragma clang diagnostic pop
2326 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002327 if (space < cmsg_len_end)
2328 space = cmsg_len_end;
2329 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2330 return (cmsg_offset <= (size_t)-1 - space &&
2331 cmsg_offset + space <= msg->msg_controllen);
2332}
2333
2334/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2335 *space to number of bytes following it in the buffer and return
2336 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2337 msg->msg_controllen are valid. */
2338static int
2339get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2340{
2341 size_t data_offset;
2342 char *data_ptr;
2343
2344 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2345 return 0;
2346 data_offset = data_ptr - (char *)msg->msg_control;
2347 if (data_offset > msg->msg_controllen)
2348 return 0;
2349 *space = msg->msg_controllen - data_offset;
2350 return 1;
2351}
2352
2353/* If cmsgh is invalid or not contained in the buffer pointed to by
2354 msg->msg_control, return -1. If cmsgh is valid and its associated
2355 data is entirely contained in the buffer, set *data_len to the
2356 length of the associated data and return 0. If only part of the
2357 associated data is contained in the buffer but cmsgh is otherwise
2358 valid, set *data_len to the length contained in the buffer and
2359 return 1. */
2360static int
2361get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2362{
2363 size_t space, cmsg_data_len;
2364
2365 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2366 cmsgh->cmsg_len < CMSG_LEN(0))
2367 return -1;
2368 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2369 if (!get_cmsg_data_space(msg, cmsgh, &space))
2370 return -1;
2371 if (space >= cmsg_data_len) {
2372 *data_len = cmsg_data_len;
2373 return 0;
2374 }
2375 *data_len = space;
2376 return 1;
2377}
2378#endif /* CMSG_LEN */
2379
2380
Victor Stinner31bf2d52015-04-01 21:57:09 +02002381struct sock_accept {
2382 socklen_t *addrlen;
2383 sock_addr_t *addrbuf;
2384 SOCKET_T result;
2385};
2386
2387#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2388/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2389static int accept4_works = -1;
2390#endif
2391
2392static int
2393sock_accept_impl(PySocketSockObject *s, void *data)
2394{
2395 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002396 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2397 socklen_t *paddrlen = ctx->addrlen;
2398#ifdef HAVE_SOCKADDR_ALG
2399 /* AF_ALG does not support accept() with addr and raises
2400 * ECONNABORTED instead. */
2401 if (s->sock_family == AF_ALG) {
2402 addr = NULL;
2403 paddrlen = NULL;
2404 *ctx->addrlen = 0;
2405 }
2406#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002407
2408#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2409 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002410 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002411 SOCK_CLOEXEC);
2412 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2413 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2414 accept4_works = (errno != ENOSYS);
2415 }
2416 }
2417 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002418 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002419#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002420 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002421#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002422
2423#ifdef MS_WINDOWS
2424 return (ctx->result != INVALID_SOCKET);
2425#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002426 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002427#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002428}
2429
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002430/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002431
Guido van Rossum73624e91994-10-10 17:59:00 +00002432static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002433sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002436 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 socklen_t addrlen;
2438 PyObject *sock = NULL;
2439 PyObject *addr = NULL;
2440 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002441 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 if (!getsockaddrlen(s, &addrlen))
2444 return NULL;
2445 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (!IS_SELECTABLE(s))
2448 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002449
Victor Stinner31bf2d52015-04-01 21:57:09 +02002450 ctx.addrlen = &addrlen;
2451 ctx.addrbuf = &addrbuf;
2452 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002454 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002455
Victor Stinnerdaf45552013-08-28 00:53:59 +02002456#ifdef MS_WINDOWS
2457 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2458 PyErr_SetFromWindowsErr(0);
2459 SOCKETCLOSE(newfd);
2460 goto finally;
2461 }
2462#else
2463
2464#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2465 if (!accept4_works)
2466#endif
2467 {
2468 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2469 SOCKETCLOSE(newfd);
2470 goto finally;
2471 }
2472 }
2473#endif
2474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 sock = PyLong_FromSocket_t(newfd);
2476 if (sock == NULL) {
2477 SOCKETCLOSE(newfd);
2478 goto finally;
2479 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2482 addrlen, s->sock_proto);
2483 if (addr == NULL)
2484 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002487
Guido van Rossum67f7a382002-06-06 21:08:16 +00002488finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 Py_XDECREF(sock);
2490 Py_XDECREF(addr);
2491 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002492}
2493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002494PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002495"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002496\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002497Wait for an incoming connection. Return a new socket file descriptor\n\
2498representing the connection, and the address of the client.\n\
2499For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002500
Guido van Rossum11ba0942002-06-13 15:07:44 +00002501/* s.setblocking(flag) method. Argument:
2502 False -- non-blocking mode; same as settimeout(0)
2503 True -- blocking mode; same as settimeout(None)
2504*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002505
Guido van Rossum73624e91994-10-10 17:59:00 +00002506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002508{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002509 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 block = PyLong_AsLong(arg);
2512 if (block == -1 && PyErr_Occurred())
2513 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002514
Victor Stinner9001d802015-04-06 23:06:01 +02002515 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002516 if (internal_setblocking(s, block) == -1) {
2517 return NULL;
2518 }
2519 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002520}
Guido van Rossume4485b01994-09-07 14:32:49 +00002521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002523"setblocking(flag)\n\
2524\n\
2525Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002526setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002528
Yury Selivanovf11b4602018-01-28 17:27:38 -05002529/* s.getblocking() method.
2530 Returns True if socket is in blocking mode,
2531 False if it is in non-blocking mode.
2532*/
2533static PyObject *
2534sock_getblocking(PySocketSockObject *s)
2535{
2536 if (s->sock_timeout) {
2537 Py_RETURN_TRUE;
2538 }
2539 else {
2540 Py_RETURN_FALSE;
2541 }
2542}
2543
2544PyDoc_STRVAR(getblocking_doc,
2545"getblocking()\n\
2546\n\
2547Returns True if socket is in blocking mode, or False if it\n\
2548is in non-blocking mode.");
2549
Victor Stinner71694d52015-03-28 01:18:54 +01002550static int
2551socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2552{
2553#ifdef MS_WINDOWS
2554 struct timeval tv;
2555#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002556#ifndef HAVE_POLL
2557 _PyTime_t ms;
2558#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002559 int overflow = 0;
2560
2561 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002562 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002563 return 0;
2564 }
2565
Victor Stinner869e1772015-03-30 03:49:14 +02002566 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002567 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002568 return -1;
2569
2570 if (*timeout < 0) {
2571 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2572 return -1;
2573 }
2574
2575#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002576 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002577#endif
2578#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002579 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002580 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002581#endif
2582 if (overflow) {
2583 PyErr_SetString(PyExc_OverflowError,
2584 "timeout doesn't fit into C timeval");
2585 return -1;
2586 }
2587
2588 return 0;
2589}
2590
Guido van Rossum11ba0942002-06-13 15:07:44 +00002591/* s.settimeout(timeout) method. Argument:
2592 None -- no timeout, blocking mode; same as setblocking(True)
2593 0.0 -- non-blocking mode; same as setblocking(False)
2594 > 0 -- timeout mode; operations time out after timeout seconds
2595 < 0 -- illegal; raises an exception
2596*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002598sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599{
Victor Stinner71694d52015-03-28 01:18:54 +01002600 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002601
Victor Stinner71694d52015-03-28 01:18:54 +01002602 if (socket_parse_timeout(&timeout, arg) < 0)
2603 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002606
2607 int block = timeout < 0;
2608 /* Blocking mode for a Python socket object means that operations
2609 like :meth:`recv` or :meth:`sendall` will block the execution of
2610 the current thread until they are complete or aborted with a
2611 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2612 the underlying FD is in a blocking mode. When timeout is a positive
2613 number, the FD is in a non-blocking mode, and socket ops are
2614 implemented with a `select()` call.
2615
2616 When timeout is 0.0, the FD is in a non-blocking mode.
2617
2618 This table summarizes all states in which the socket object and
2619 its underlying FD can be:
2620
2621 ==================== ===================== ==============
2622 `gettimeout()` `getblocking()` FD
2623 ==================== ===================== ==============
2624 ``None`` ``True`` blocking
2625 ``0.0`` ``False`` non-blocking
2626 ``> 0`` ``True`` non-blocking
2627 */
2628
2629 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002630 return NULL;
2631 }
2632 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002633}
2634
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002635PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002636"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002638Set a timeout on socket operations. 'timeout' can be a float,\n\
2639giving in seconds, or None. Setting a timeout of None disables\n\
2640the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002641Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002642
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002643/* s.gettimeout() method.
2644 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002645static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002646sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002647{
Victor Stinner71694d52015-03-28 01:18:54 +01002648 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002649 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 }
Victor Stinner71694d52015-03-28 01:18:54 +01002651 else {
2652 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2653 return PyFloat_FromDouble(seconds);
2654 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655}
2656
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002657PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002658"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002660Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002661operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002662operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002663
Guido van Rossumaee08791992-09-08 09:05:33 +00002664/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002665 With an integer third argument, sets an integer optval with optlen=4.
2666 With None as third argument and an integer fourth argument, set
2667 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002668 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002669 use optional built-in module 'struct' to encode the string.
2670*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002671
Guido van Rossum73624e91994-10-10 17:59:00 +00002672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002673sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 int level;
2676 int optname;
2677 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002678 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002680 unsigned int optlen;
2681 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002682
caaveryeffc12f2017-09-06 18:18:10 -04002683#ifdef AF_VSOCK
2684 if (s->sock_family == AF_VSOCK) {
2685 uint64_t vflag; // Must be set width of 64 bits
2686 /* setsockopt(level, opt, flag) */
2687 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2688 &level, &optname, &vflag)) {
2689 // level should always be set to AF_VSOCK
2690 res = setsockopt(s->sock_fd, level, optname,
2691 (void*)&vflag, sizeof vflag);
2692 goto done;
2693 }
2694 return NULL;
2695 }
2696#endif
2697
Christian Heimesdffa3942016-09-05 23:54:41 +02002698 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 if (PyArg_ParseTuple(args, "iii:setsockopt",
2700 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002701 res = setsockopt(s->sock_fd, level, optname,
2702 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002703 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002705
2706 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002707 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002708 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2709 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2710 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002711 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002712 NULL, (socklen_t)optlen);
2713 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002715
2716 PyErr_Clear();
2717 /* setsockopt(level, opt, buffer) */
2718 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2719 &level, &optname, &optval))
2720 return NULL;
2721
2722#ifdef MS_WINDOWS
2723 if (optval.len > INT_MAX) {
2724 PyBuffer_Release(&optval);
2725 PyErr_Format(PyExc_OverflowError,
2726 "socket option is larger than %i bytes",
2727 INT_MAX);
2728 return NULL;
2729 }
2730 res = setsockopt(s->sock_fd, level, optname,
2731 optval.buf, (int)optval.len);
2732#else
2733 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2734#endif
2735 PyBuffer_Release(&optval);
2736
2737done:
Victor Stinnercc739322016-03-23 21:35:29 +01002738 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002740 }
2741
2742 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002743}
2744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002746"setsockopt(level, option, value: int)\n\
2747setsockopt(level, option, value: buffer)\n\
2748setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002749\n\
2750Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002751The value argument can either be an integer, a string buffer, or \n\
2752None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002754
Guido van Rossumaee08791992-09-08 09:05:33 +00002755/* s.getsockopt() method.
2756 With two arguments, retrieves an integer option.
2757 With a third integer argument, retrieves a string buffer of that size;
2758 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002759
Guido van Rossum73624e91994-10-10 17:59:00 +00002760static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002761sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 int level;
2764 int optname;
2765 int res;
2766 PyObject *buf;
2767 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002768 int flag = 0;
2769 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2772 &level, &optname, &buflen))
2773 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002776#ifdef AF_VSOCK
2777 if (s->sock_family == AF_VSOCK) {
2778 uint64_t vflag = 0; // Must be set width of 64 bits
2779 flagsize = sizeof vflag;
2780 res = getsockopt(s->sock_fd, level, optname,
2781 (void *)&vflag, &flagsize);
2782 if (res < 0)
2783 return s->errorhandler();
2784 return PyLong_FromUnsignedLong(vflag);
2785 }
2786#endif
2787 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 res = getsockopt(s->sock_fd, level, optname,
2789 (void *)&flag, &flagsize);
2790 if (res < 0)
2791 return s->errorhandler();
2792 return PyLong_FromLong(flag);
2793 }
caaveryeffc12f2017-09-06 18:18:10 -04002794#ifdef AF_VSOCK
2795 if (s->sock_family == AF_VSOCK) {
2796 PyErr_SetString(PyExc_OSError,
2797 "getsockopt string buffer not allowed");
2798 return NULL;
2799 }
2800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002802 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 "getsockopt buflen out of range");
2804 return NULL;
2805 }
2806 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2807 if (buf == NULL)
2808 return NULL;
2809 res = getsockopt(s->sock_fd, level, optname,
2810 (void *)PyBytes_AS_STRING(buf), &buflen);
2811 if (res < 0) {
2812 Py_DECREF(buf);
2813 return s->errorhandler();
2814 }
2815 _PyBytes_Resize(&buf, buflen);
2816 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002817}
2818
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002819PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002820"getsockopt(level, option[, buffersize]) -> value\n\
2821\n\
2822Get a socket option. See the Unix manual for level and option.\n\
2823If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002824string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002825
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002826
Fred Drake728819a2000-07-01 03:40:12 +00002827/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002828
Guido van Rossum73624e91994-10-10 17:59:00 +00002829static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002830sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 sock_addr_t addrbuf;
2833 int addrlen;
2834 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2837 return NULL;
2838 Py_BEGIN_ALLOW_THREADS
2839 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2840 Py_END_ALLOW_THREADS
2841 if (res < 0)
2842 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002843 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002844}
2845
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002846PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002847"bind(address)\n\
2848\n\
2849Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002850pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002851sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002852
Guido van Rossum30a685f1991-06-27 15:51:29 +00002853
2854/* s.close() method.
2855 Set the file descriptor to -1 so operations tried subsequently
2856 will surely fail. */
2857
Guido van Rossum73624e91994-10-10 17:59:00 +00002858static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002859sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002862 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002863
Victor Stinner19a8e842016-03-21 16:36:48 +01002864 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002865 if (fd != INVALID_SOCKET) {
2866 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002867
2868 /* We do not want to retry upon EINTR: see
2869 http://lwn.net/Articles/576478/ and
2870 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2871 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002873 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002875 /* bpo-30319: The peer can already have closed the connection.
2876 Python ignores ECONNRESET on close(). */
2877 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002878 return s->errorhandler();
2879 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002881 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002882}
2883
Christian Heimesd0e31b92018-01-27 09:54:13 +01002884PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002885"close()\n\
2886\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002888
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002889static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002890sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002891{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002892 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002893 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002894 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002895}
2896
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002897PyDoc_STRVAR(detach_doc,
2898"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002899\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002900Close the socket object without closing the underlying file descriptor.\n\
2901The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002902can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002903
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002904static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002905sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002906{
Victor Stinner81c41db2015-04-02 11:50:57 +02002907 int err;
2908 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002909
Victor Stinner81c41db2015-04-02 11:50:57 +02002910 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2911 /* getsockopt() failed */
2912 return 0;
2913 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002914
Victor Stinner81c41db2015-04-02 11:50:57 +02002915 if (err == EISCONN)
2916 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002917 if (err != 0) {
2918 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2919 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002920 return 0;
2921 }
2922 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002923}
2924
2925static int
2926internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2927 int raise)
2928{
2929 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002930
2931 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002933 Py_END_ALLOW_THREADS
2934
Victor Stinner70a46f62015-03-31 22:03:59 +02002935 if (!res) {
2936 /* connect() succeeded, the socket is connected */
2937 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002939
Victor Stinner81c41db2015-04-02 11:50:57 +02002940 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002941
Victor Stinner81c41db2015-04-02 11:50:57 +02002942 /* save error, PyErr_CheckSignals() can replace it */
2943 err = GET_SOCK_ERROR;
2944 if (CHECK_ERRNO(EINTR)) {
2945 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002946 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002947
2948 /* Issue #23618: when connect() fails with EINTR, the connection is
2949 running asynchronously.
2950
2951 If the socket is blocking or has a timeout, wait until the
2952 connection completes, fails or timed out using select(), and then
2953 get the connection status using getsockopt(SO_ERROR).
2954
2955 If the socket is non-blocking, raise InterruptedError. The caller is
2956 responsible to wait until the connection completes, fails or timed
2957 out (it's the case in asyncio for example). */
2958 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2959 }
2960 else {
2961 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2962 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002963 }
2964
Victor Stinner81c41db2015-04-02 11:50:57 +02002965 if (!wait_connect) {
2966 if (raise) {
2967 /* restore error, maybe replaced by PyErr_CheckSignals() */
2968 SET_SOCK_ERROR(err);
2969 s->errorhandler();
2970 return -1;
2971 }
2972 else
2973 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002974 }
2975
Victor Stinner81c41db2015-04-02 11:50:57 +02002976 if (raise) {
2977 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002978 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2979 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002980 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002981 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002982 else {
2983 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002984 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2985 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002986 return err;
2987 }
2988 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002989}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002990
Fred Drake728819a2000-07-01 03:40:12 +00002991/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002992
Guido van Rossum73624e91994-10-10 17:59:00 +00002993static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002994sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 sock_addr_t addrbuf;
2997 int addrlen;
2998 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3001 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003002
Victor Stinner81c41db2015-04-02 11:50:57 +02003003 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003004 if (res < 0)
3005 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003006
Victor Stinneree699e92015-03-31 21:28:42 +02003007 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003008}
3009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003010PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003011"connect(address)\n\
3012\n\
3013Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003014is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003015
Guido van Rossum30a685f1991-06-27 15:51:29 +00003016
Fred Drake728819a2000-07-01 03:40:12 +00003017/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003018
3019static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003020sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 sock_addr_t addrbuf;
3023 int addrlen;
3024 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3027 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003028
Victor Stinner81c41db2015-04-02 11:50:57 +02003029 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003030 if (res < 0)
3031 return NULL;
3032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003034}
3035
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003036PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003037"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003038\n\
3039This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003040instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003041
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003042
Guido van Rossumed233a51992-06-23 09:07:03 +00003043/* s.fileno() method */
3044
Guido van Rossum73624e91994-10-10 17:59:00 +00003045static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003046sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003049}
3050
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003051PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003052"fileno() -> integer\n\
3053\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003054Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003055
Guido van Rossumed233a51992-06-23 09:07:03 +00003056
Guido van Rossumc89705d1992-11-26 08:54:07 +00003057/* s.getsockname() method */
3058
Guido van Rossum73624e91994-10-10 17:59:00 +00003059static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003060sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 sock_addr_t addrbuf;
3063 int res;
3064 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 if (!getsockaddrlen(s, &addrlen))
3067 return NULL;
3068 memset(&addrbuf, 0, addrlen);
3069 Py_BEGIN_ALLOW_THREADS
3070 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3071 Py_END_ALLOW_THREADS
3072 if (res < 0)
3073 return s->errorhandler();
3074 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3075 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003076}
3077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003078PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003079"getsockname() -> address info\n\
3080\n\
3081Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003083
Guido van Rossumc89705d1992-11-26 08:54:07 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003086/* s.getpeername() method */
3087
Guido van Rossum73624e91994-10-10 17:59:00 +00003088static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003089sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 sock_addr_t addrbuf;
3092 int res;
3093 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 if (!getsockaddrlen(s, &addrlen))
3096 return NULL;
3097 memset(&addrbuf, 0, addrlen);
3098 Py_BEGIN_ALLOW_THREADS
3099 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3100 Py_END_ALLOW_THREADS
3101 if (res < 0)
3102 return s->errorhandler();
3103 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3104 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003105}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003107PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108"getpeername() -> address info\n\
3109\n\
3110Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003112
Guido van Rossumb6775db1994-08-01 11:34:53 +00003113#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003114
3115
Guido van Rossum30a685f1991-06-27 15:51:29 +00003116/* s.listen(n) method */
3117
Guido van Rossum73624e91994-10-10 17:59:00 +00003118static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003119sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003120{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003121 /* We try to choose a default backlog high enough to avoid connection drops
3122 * for common workloads, yet not too high to limit resource usage. */
3123 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003125
Charles-François Natali644b8f52014-05-22 19:45:39 +01003126 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003130 /* To avoid problems on systems that don't allow a negative backlog
3131 * (which doesn't make sense anyway) we force a minimum value of 0. */
3132 if (backlog < 0)
3133 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 res = listen(s->sock_fd, backlog);
3135 Py_END_ALLOW_THREADS
3136 if (res < 0)
3137 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003138 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003139}
3140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003141PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003142"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003143\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003144Enable a server to accept connections. If backlog is specified, it must be\n\
3145at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003146unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003147connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003148
Victor Stinner31bf2d52015-04-01 21:57:09 +02003149struct sock_recv {
3150 char *cbuf;
3151 Py_ssize_t len;
3152 int flags;
3153 Py_ssize_t result;
3154};
3155
3156static int
3157sock_recv_impl(PySocketSockObject *s, void *data)
3158{
3159 struct sock_recv *ctx = data;
3160
3161#ifdef MS_WINDOWS
3162 if (ctx->len > INT_MAX)
3163 ctx->len = INT_MAX;
3164 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3165#else
3166 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3167#endif
3168 return (ctx->result >= 0);
3169}
3170
Guido van Rossum82a5c661998-07-07 20:45:43 +00003171
Thomas Wouters477c8d52006-05-27 19:21:47 +00003172/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003173 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003174 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003175 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003176 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003177 * also possible that we return a number of bytes smaller than the request
3178 * bytes.
3179 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003180
Antoine Pitrou19467d22010-08-17 19:33:30 +00003181static Py_ssize_t
3182sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003183{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003184 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 if (!IS_SELECTABLE(s)) {
3187 select_error();
3188 return -1;
3189 }
3190 if (len == 0) {
3191 /* If 0 bytes were requested, do nothing. */
3192 return 0;
3193 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003194
Victor Stinner31bf2d52015-04-01 21:57:09 +02003195 ctx.cbuf = cbuf;
3196 ctx.len = len;
3197 ctx.flags = flags;
3198 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003200
3201 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003202}
3203
Guido van Rossum48a680c2001-03-02 06:34:14 +00003204
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003205/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206
Guido van Rossum73624e91994-10-10 17:59:00 +00003207static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003208sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003209{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003210 Py_ssize_t recvlen, outlen;
3211 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003213
Antoine Pitrou19467d22010-08-17 19:33:30 +00003214 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (recvlen < 0) {
3218 PyErr_SetString(PyExc_ValueError,
3219 "negative buffersize in recv");
3220 return NULL;
3221 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 /* Allocate a new string. */
3224 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3225 if (buf == NULL)
3226 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 /* Call the guts */
3229 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3230 if (outlen < 0) {
3231 /* An error occurred, release the string and return an
3232 error. */
3233 Py_DECREF(buf);
3234 return NULL;
3235 }
3236 if (outlen != recvlen) {
3237 /* We did not read as many bytes as we anticipated, resize the
3238 string if possible and be successful. */
3239 _PyBytes_Resize(&buf, outlen);
3240 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003243}
3244
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003245PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003246"recv(buffersize[, flags]) -> data\n\
3247\n\
3248Receive up to buffersize bytes from the socket. For the optional flags\n\
3249argument, see the Unix manual. When no data is available, block until\n\
3250at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003251the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003252
Guido van Rossum30a685f1991-06-27 15:51:29 +00003253
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003254/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003255
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003257sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003260
Antoine Pitrou19467d22010-08-17 19:33:30 +00003261 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_buffer pbuf;
3263 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003264 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003267 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 &pbuf, &recvlen, &flags))
3269 return NULL;
3270 buf = pbuf.buf;
3271 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 if (recvlen < 0) {
3274 PyBuffer_Release(&pbuf);
3275 PyErr_SetString(PyExc_ValueError,
3276 "negative buffersize in recv_into");
3277 return NULL;
3278 }
3279 if (recvlen == 0) {
3280 /* If nbytes was not specified, use the buffer's length */
3281 recvlen = buflen;
3282 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 /* Check if the buffer is large enough */
3285 if (buflen < recvlen) {
3286 PyBuffer_Release(&pbuf);
3287 PyErr_SetString(PyExc_ValueError,
3288 "buffer too small for requested bytes");
3289 return NULL;
3290 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 /* Call the guts */
3293 readlen = sock_recv_guts(s, buf, recvlen, flags);
3294 if (readlen < 0) {
3295 /* Return an error. */
3296 PyBuffer_Release(&pbuf);
3297 return NULL;
3298 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 PyBuffer_Release(&pbuf);
3301 /* Return the number of bytes read. Note that we do not do anything
3302 special here in the case that readlen < recvlen. */
3303 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304}
3305
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003306PyDoc_STRVAR(recv_into_doc,
3307"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003308\n\
3309A version of recv() that stores its data into a buffer rather than creating \n\
3310a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3311is not specified (or 0), receive up to the size available in the given buffer.\n\
3312\n\
3313See recv() for documentation about the flags.");
3314
Victor Stinner31bf2d52015-04-01 21:57:09 +02003315struct sock_recvfrom {
3316 char* cbuf;
3317 Py_ssize_t len;
3318 int flags;
3319 socklen_t *addrlen;
3320 sock_addr_t *addrbuf;
3321 Py_ssize_t result;
3322};
3323
3324static int
3325sock_recvfrom_impl(PySocketSockObject *s, void *data)
3326{
3327 struct sock_recvfrom *ctx = data;
3328
3329 memset(ctx->addrbuf, 0, *ctx->addrlen);
3330
3331#ifdef MS_WINDOWS
3332 if (ctx->len > INT_MAX)
3333 ctx->len = INT_MAX;
3334 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3335 SAS2SA(ctx->addrbuf), ctx->addrlen);
3336#else
3337 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3338 SAS2SA(ctx->addrbuf), ctx->addrlen);
3339#endif
3340 return (ctx->result >= 0);
3341}
3342
Thomas Wouters477c8d52006-05-27 19:21:47 +00003343
3344/*
Christian Heimes99170a52007-12-19 02:07:34 +00003345 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3346 * into a char buffer. If you have any inc/def ref to do to the objects that
3347 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003348 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003349 * that it is also possible that we return a number of bytes smaller than the
3350 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003351 *
3352 * 'addr' is a return value for the address object. Note that you must decref
3353 * it yourself.
3354 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003355static Py_ssize_t
3356sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003361 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 if (!getsockaddrlen(s, &addrlen))
3366 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 if (!IS_SELECTABLE(s)) {
3369 select_error();
3370 return -1;
3371 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003372
Victor Stinner31bf2d52015-04-01 21:57:09 +02003373 ctx.cbuf = cbuf;
3374 ctx.len = len;
3375 ctx.flags = flags;
3376 ctx.addrbuf = &addrbuf;
3377 ctx.addrlen = &addrlen;
3378 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380
Victor Stinner31bf2d52015-04-01 21:57:09 +02003381 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3382 s->sock_proto);
3383 if (*addr == NULL)
3384 return -1;
3385
3386 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003387}
3388
3389/* s.recvfrom(nbytes [,flags]) method */
3390
3391static PyObject *
3392sock_recvfrom(PySocketSockObject *s, PyObject *args)
3393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 PyObject *buf = NULL;
3395 PyObject *addr = NULL;
3396 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003397 int flags = 0;
3398 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003399
Antoine Pitrou19467d22010-08-17 19:33:30 +00003400 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 if (recvlen < 0) {
3404 PyErr_SetString(PyExc_ValueError,
3405 "negative buffersize in recvfrom");
3406 return NULL;
3407 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3410 if (buf == NULL)
3411 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3414 recvlen, flags, &addr);
3415 if (outlen < 0) {
3416 goto finally;
3417 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 if (outlen != recvlen) {
3420 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003421 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003423 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 goto finally;
3425 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003428
3429finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 Py_XDECREF(buf);
3431 Py_XDECREF(addr);
3432 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003433}
3434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003435PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003436"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3437\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003438Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003439
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003441/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003442
3443static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003444sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003447
Antoine Pitrou19467d22010-08-17 19:33:30 +00003448 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 Py_buffer pbuf;
3450 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003451 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003454
Antoine Pitrou19467d22010-08-17 19:33:30 +00003455 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 kwlist, &pbuf,
3457 &recvlen, &flags))
3458 return NULL;
3459 buf = pbuf.buf;
3460 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 if (recvlen < 0) {
3463 PyBuffer_Release(&pbuf);
3464 PyErr_SetString(PyExc_ValueError,
3465 "negative buffersize in recvfrom_into");
3466 return NULL;
3467 }
3468 if (recvlen == 0) {
3469 /* If nbytes was not specified, use the buffer's length */
3470 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003471 } else if (recvlen > buflen) {
3472 PyBuffer_Release(&pbuf);
3473 PyErr_SetString(PyExc_ValueError,
3474 "nbytes is greater than the length of the buffer");
3475 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003476 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3479 if (readlen < 0) {
3480 PyBuffer_Release(&pbuf);
3481 /* Return an error */
3482 Py_XDECREF(addr);
3483 return NULL;
3484 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 PyBuffer_Release(&pbuf);
3487 /* Return the number of bytes read and the address. Note that we do
3488 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003489 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003490}
3491
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003492PyDoc_STRVAR(recvfrom_into_doc,
3493"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003494\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003495Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003496
Victor Stinner35bee932015-04-02 12:28:07 +02003497/* The sendmsg() and recvmsg[_into]() methods require a working
3498 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3499#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003500struct sock_recvmsg {
3501 struct msghdr *msg;
3502 int flags;
3503 ssize_t result;
3504};
3505
3506static int
3507sock_recvmsg_impl(PySocketSockObject *s, void *data)
3508{
3509 struct sock_recvmsg *ctx = data;
3510
3511 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3512 return (ctx->result >= 0);
3513}
3514
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003515/*
3516 * Call recvmsg() with the supplied iovec structures, flags, and
3517 * ancillary data buffer size (controllen). Returns the tuple return
3518 * value for recvmsg() or recvmsg_into(), with the first item provided
3519 * by the supplied makeval() function. makeval() will be called with
3520 * the length read and makeval_data as arguments, and must return a
3521 * new reference (which will be decrefed if there is a subsequent
3522 * error). On error, closes any file descriptors received via
3523 * SCM_RIGHTS.
3524 */
3525static PyObject *
3526sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3527 int flags, Py_ssize_t controllen,
3528 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3529{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003530 sock_addr_t addrbuf;
3531 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003532 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533 PyObject *cmsg_list = NULL, *retval = NULL;
3534 void *controlbuf = NULL;
3535 struct cmsghdr *cmsgh;
3536 size_t cmsgdatalen = 0;
3537 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003538 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003539
3540 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3541 ignored" when the socket is connected (Linux fills them in
3542 anyway for AF_UNIX sockets at least). Normally msg_namelen
3543 seems to be set to 0 if there's no address, but try to
3544 initialize msg_name to something that won't be mistaken for a
3545 real address if that doesn't happen. */
3546 if (!getsockaddrlen(s, &addrbuflen))
3547 return NULL;
3548 memset(&addrbuf, 0, addrbuflen);
3549 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3550
3551 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3552 PyErr_SetString(PyExc_ValueError,
3553 "invalid ancillary data buffer length");
3554 return NULL;
3555 }
3556 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3557 return PyErr_NoMemory();
3558
3559 /* Make the system call. */
3560 if (!IS_SELECTABLE(s)) {
3561 select_error();
3562 goto finally;
3563 }
3564
Victor Stinner31bf2d52015-04-01 21:57:09 +02003565 msg.msg_name = SAS2SA(&addrbuf);
3566 msg.msg_namelen = addrbuflen;
3567 msg.msg_iov = iov;
3568 msg.msg_iovlen = iovlen;
3569 msg.msg_control = controlbuf;
3570 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003571
Victor Stinner31bf2d52015-04-01 21:57:09 +02003572 ctx.msg = &msg;
3573 ctx.flags = flags;
3574 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003575 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003576
3577 /* Make list of (level, type, data) tuples from control messages. */
3578 if ((cmsg_list = PyList_New(0)) == NULL)
3579 goto err_closefds;
3580 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3581 implementations didn't do so. */
3582 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3583 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3584 PyObject *bytes, *tuple;
3585 int tmp;
3586
3587 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3588 if (cmsg_status != 0) {
3589 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3590 "received malformed or improperly-truncated "
3591 "ancillary data", 1) == -1)
3592 goto err_closefds;
3593 }
3594 if (cmsg_status < 0)
3595 break;
3596 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003597 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003598 goto err_closefds;
3599 }
3600
3601 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3602 cmsgdatalen);
3603 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3604 (int)cmsgh->cmsg_type, bytes);
3605 if (tuple == NULL)
3606 goto err_closefds;
3607 tmp = PyList_Append(cmsg_list, tuple);
3608 Py_DECREF(tuple);
3609 if (tmp != 0)
3610 goto err_closefds;
3611
3612 if (cmsg_status != 0)
3613 break;
3614 }
3615
3616 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003617 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 cmsg_list,
3619 (int)msg.msg_flags,
3620 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3621 ((msg.msg_namelen > addrbuflen) ?
3622 addrbuflen : msg.msg_namelen),
3623 s->sock_proto));
3624 if (retval == NULL)
3625 goto err_closefds;
3626
3627finally:
3628 Py_XDECREF(cmsg_list);
3629 PyMem_Free(controlbuf);
3630 return retval;
3631
3632err_closefds:
3633#ifdef SCM_RIGHTS
3634 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3635 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3636 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3637 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3638 if (cmsg_status < 0)
3639 break;
3640 if (cmsgh->cmsg_level == SOL_SOCKET &&
3641 cmsgh->cmsg_type == SCM_RIGHTS) {
3642 size_t numfds;
3643 int *fdp;
3644
3645 numfds = cmsgdatalen / sizeof(int);
3646 fdp = (int *)CMSG_DATA(cmsgh);
3647 while (numfds-- > 0)
3648 close(*fdp++);
3649 }
3650 if (cmsg_status != 0)
3651 break;
3652 }
3653#endif /* SCM_RIGHTS */
3654 goto finally;
3655}
3656
3657
3658static PyObject *
3659makeval_recvmsg(ssize_t received, void *data)
3660{
3661 PyObject **buf = data;
3662
3663 if (received < PyBytes_GET_SIZE(*buf))
3664 _PyBytes_Resize(buf, received);
3665 Py_XINCREF(*buf);
3666 return *buf;
3667}
3668
3669/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3670
3671static PyObject *
3672sock_recvmsg(PySocketSockObject *s, PyObject *args)
3673{
3674 Py_ssize_t bufsize, ancbufsize = 0;
3675 int flags = 0;
3676 struct iovec iov;
3677 PyObject *buf = NULL, *retval = NULL;
3678
3679 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3680 return NULL;
3681
3682 if (bufsize < 0) {
3683 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3684 return NULL;
3685 }
3686 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3687 return NULL;
3688 iov.iov_base = PyBytes_AS_STRING(buf);
3689 iov.iov_len = bufsize;
3690
3691 /* Note that we're passing a pointer to *our pointer* to the bytes
3692 object here (&buf); makeval_recvmsg() may incref the object, or
3693 deallocate it and set our pointer to NULL. */
3694 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3695 &makeval_recvmsg, &buf);
3696 Py_XDECREF(buf);
3697 return retval;
3698}
3699
3700PyDoc_STRVAR(recvmsg_doc,
3701"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3702\n\
3703Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3704socket. The ancbufsize argument sets the size in bytes of the\n\
3705internal buffer used to receive the ancillary data; it defaults to 0,\n\
3706meaning that no ancillary data will be received. Appropriate buffer\n\
3707sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3708CMSG_LEN(), and items which do not fit into the buffer might be\n\
3709truncated or discarded. The flags argument defaults to 0 and has the\n\
3710same meaning as for recv().\n\
3711\n\
3712The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3713The data item is a bytes object holding the non-ancillary data\n\
3714received. The ancdata item is a list of zero or more tuples\n\
3715(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3716(control messages) received: cmsg_level and cmsg_type are integers\n\
3717specifying the protocol level and protocol-specific type respectively,\n\
3718and cmsg_data is a bytes object holding the associated data. The\n\
3719msg_flags item is the bitwise OR of various flags indicating\n\
3720conditions on the received message; see your system documentation for\n\
3721details. If the receiving socket is unconnected, address is the\n\
3722address of the sending socket, if available; otherwise, its value is\n\
3723unspecified.\n\
3724\n\
3725If recvmsg() raises an exception after the system call returns, it\n\
3726will first attempt to close any file descriptors received via the\n\
3727SCM_RIGHTS mechanism.");
3728
3729
3730static PyObject *
3731makeval_recvmsg_into(ssize_t received, void *data)
3732{
3733 return PyLong_FromSsize_t(received);
3734}
3735
3736/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3737
3738static PyObject *
3739sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3740{
3741 Py_ssize_t ancbufsize = 0;
3742 int flags = 0;
3743 struct iovec *iovs = NULL;
3744 Py_ssize_t i, nitems, nbufs = 0;
3745 Py_buffer *bufs = NULL;
3746 PyObject *buffers_arg, *fast, *retval = NULL;
3747
3748 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3749 &buffers_arg, &ancbufsize, &flags))
3750 return NULL;
3751
3752 if ((fast = PySequence_Fast(buffers_arg,
3753 "recvmsg_into() argument 1 must be an "
3754 "iterable")) == NULL)
3755 return NULL;
3756 nitems = PySequence_Fast_GET_SIZE(fast);
3757 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003758 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003759 goto finally;
3760 }
3761
3762 /* Fill in an iovec for each item, and save the Py_buffer
3763 structs to release afterwards. */
3764 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3765 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3766 PyErr_NoMemory();
3767 goto finally;
3768 }
3769 for (; nbufs < nitems; nbufs++) {
3770 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3771 "w*;recvmsg_into() argument 1 must be an iterable "
3772 "of single-segment read-write buffers",
3773 &bufs[nbufs]))
3774 goto finally;
3775 iovs[nbufs].iov_base = bufs[nbufs].buf;
3776 iovs[nbufs].iov_len = bufs[nbufs].len;
3777 }
3778
3779 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3780 &makeval_recvmsg_into, NULL);
3781finally:
3782 for (i = 0; i < nbufs; i++)
3783 PyBuffer_Release(&bufs[i]);
3784 PyMem_Free(bufs);
3785 PyMem_Free(iovs);
3786 Py_DECREF(fast);
3787 return retval;
3788}
3789
3790PyDoc_STRVAR(recvmsg_into_doc,
3791"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3792\n\
3793Receive normal data and ancillary data from the socket, scattering the\n\
3794non-ancillary data into a series of buffers. The buffers argument\n\
3795must be an iterable of objects that export writable buffers\n\
3796(e.g. bytearray objects); these will be filled with successive chunks\n\
3797of the non-ancillary data until it has all been written or there are\n\
3798no more buffers. The ancbufsize argument sets the size in bytes of\n\
3799the internal buffer used to receive the ancillary data; it defaults to\n\
38000, meaning that no ancillary data will be received. Appropriate\n\
3801buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3802or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3803truncated or discarded. The flags argument defaults to 0 and has the\n\
3804same meaning as for recv().\n\
3805\n\
3806The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3807The nbytes item is the total number of bytes of non-ancillary data\n\
3808written into the buffers. The ancdata item is a list of zero or more\n\
3809tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3810data (control messages) received: cmsg_level and cmsg_type are\n\
3811integers specifying the protocol level and protocol-specific type\n\
3812respectively, and cmsg_data is a bytes object holding the associated\n\
3813data. The msg_flags item is the bitwise OR of various flags\n\
3814indicating conditions on the received message; see your system\n\
3815documentation for details. If the receiving socket is unconnected,\n\
3816address is the address of the sending socket, if available; otherwise,\n\
3817its value is unspecified.\n\
3818\n\
3819If recvmsg_into() raises an exception after the system call returns,\n\
3820it will first attempt to close any file descriptors received via the\n\
3821SCM_RIGHTS mechanism.");
3822#endif /* CMSG_LEN */
3823
3824
Victor Stinner31bf2d52015-04-01 21:57:09 +02003825struct sock_send {
3826 char *buf;
3827 Py_ssize_t len;
3828 int flags;
3829 Py_ssize_t result;
3830};
3831
3832static int
3833sock_send_impl(PySocketSockObject *s, void *data)
3834{
3835 struct sock_send *ctx = data;
3836
3837#ifdef MS_WINDOWS
3838 if (ctx->len > INT_MAX)
3839 ctx->len = INT_MAX;
3840 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3841#else
3842 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3843#endif
3844 return (ctx->result >= 0);
3845}
3846
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003847/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003848
Guido van Rossum73624e91994-10-10 17:59:00 +00003849static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003850sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003851{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003852 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003854 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3857 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 if (!IS_SELECTABLE(s)) {
3860 PyBuffer_Release(&pbuf);
3861 return select_error();
3862 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003863 ctx.buf = pbuf.buf;
3864 ctx.len = pbuf.len;
3865 ctx.flags = flags;
3866 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003867 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 return NULL;
3869 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003870 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003871
3872 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003873}
3874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003875PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003876"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003877\n\
3878Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003879argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003880sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003881
3882
3883/* s.sendall(data [,flags]) method */
3884
3885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003886sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003889 Py_ssize_t len, n;
3890 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003892 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003893 int has_timeout = (s->sock_timeout > 0);
3894 _PyTime_t interval = s->sock_timeout;
3895 _PyTime_t deadline = 0;
3896 int deadline_initialized = 0;
3897 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3900 return NULL;
3901 buf = pbuf.buf;
3902 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 if (!IS_SELECTABLE(s)) {
3905 PyBuffer_Release(&pbuf);
3906 return select_error();
3907 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003910 if (has_timeout) {
3911 if (deadline_initialized) {
3912 /* recompute the timeout */
3913 interval = deadline - _PyTime_GetMonotonicClock();
3914 }
3915 else {
3916 deadline_initialized = 1;
3917 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3918 }
3919
3920 if (interval <= 0) {
3921 PyErr_SetString(socket_timeout, "timed out");
3922 goto done;
3923 }
3924 }
3925
Victor Stinner02f32ab2015-04-01 22:53:26 +02003926 ctx.buf = buf;
3927 ctx.len = len;
3928 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003929 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3930 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003931 n = ctx.result;
3932 assert(n >= 0);
3933
3934 buf += n;
3935 len -= n;
3936
3937 /* We must run our signal handlers before looping again.
3938 send() can return a successful partial write when it is
3939 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003940 if (PyErr_CheckSignals())
3941 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003942 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Victor Stinner8912d142015-04-06 23:16:34 +02003945 Py_INCREF(Py_None);
3946 res = Py_None;
3947
3948done:
3949 PyBuffer_Release(&pbuf);
3950 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003951}
3952
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003953PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003954"sendall(data[, flags])\n\
3955\n\
3956Send a data string to the socket. For the optional flags\n\
3957argument, see the Unix manual. This calls send() repeatedly\n\
3958until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003959to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003960
Guido van Rossum30a685f1991-06-27 15:51:29 +00003961
Victor Stinner31bf2d52015-04-01 21:57:09 +02003962struct sock_sendto {
3963 char *buf;
3964 Py_ssize_t len;
3965 int flags;
3966 int addrlen;
3967 sock_addr_t *addrbuf;
3968 Py_ssize_t result;
3969};
3970
3971static int
3972sock_sendto_impl(PySocketSockObject *s, void *data)
3973{
3974 struct sock_sendto *ctx = data;
3975
3976#ifdef MS_WINDOWS
3977 if (ctx->len > INT_MAX)
3978 ctx->len = INT_MAX;
3979 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3980 SAS2SA(ctx->addrbuf), ctx->addrlen);
3981#else
3982 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3983 SAS2SA(ctx->addrbuf), ctx->addrlen);
3984#endif
3985 return (ctx->result >= 0);
3986}
3987
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003988/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003989
Guido van Rossum73624e91994-10-10 17:59:00 +00003990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003991sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 Py_buffer pbuf;
3994 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003995 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003996 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003997 int addrlen, flags;
3998 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004001 arglen = PyTuple_Size(args);
4002 switch (arglen) {
4003 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004004 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4005 return NULL;
4006 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004007 break;
4008 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004009 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4010 &pbuf, &flags, &addro)) {
4011 return NULL;
4012 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004013 break;
4014 default:
4015 PyErr_Format(PyExc_TypeError,
4016 "sendto() takes 2 or 3 arguments (%d given)",
4017 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004018 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 if (!IS_SELECTABLE(s)) {
4022 PyBuffer_Release(&pbuf);
4023 return select_error();
4024 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4027 PyBuffer_Release(&pbuf);
4028 return NULL;
4029 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004030
Victor Stinner31bf2d52015-04-01 21:57:09 +02004031 ctx.buf = pbuf.buf;
4032 ctx.len = pbuf.len;
4033 ctx.flags = flags;
4034 ctx.addrlen = addrlen;
4035 ctx.addrbuf = &addrbuf;
4036 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004037 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 return NULL;
4039 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004040 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004041
4042 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004043}
4044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004045PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004046"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004047\n\
4048Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004049For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004050
Guido van Rossum30a685f1991-06-27 15:51:29 +00004051
Victor Stinner35bee932015-04-02 12:28:07 +02004052/* The sendmsg() and recvmsg[_into]() methods require a working
4053 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4054#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004055struct sock_sendmsg {
4056 struct msghdr *msg;
4057 int flags;
4058 ssize_t result;
4059};
4060
4061static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004062sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4063 struct msghdr *msg,
4064 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4065 Py_ssize_t ndataparts, ndatabufs = 0;
4066 int result = -1;
4067 struct iovec *iovs = NULL;
4068 PyObject *data_fast = NULL;
4069 Py_buffer *databufs = NULL;
4070
4071 /* Fill in an iovec for each message part, and save the Py_buffer
4072 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004073 data_fast = PySequence_Fast(data_arg,
4074 "sendmsg() argument 1 must be an "
4075 "iterable");
4076 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004077 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004078 }
4079
Christian Heimesdffa3942016-09-05 23:54:41 +02004080 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4081 if (ndataparts > INT_MAX) {
4082 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4083 goto finally;
4084 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004085
Christian Heimesdffa3942016-09-05 23:54:41 +02004086 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004087 if (ndataparts > 0) {
4088 iovs = PyMem_New(struct iovec, ndataparts);
4089 if (iovs == NULL) {
4090 PyErr_NoMemory();
4091 goto finally;
4092 }
4093 msg->msg_iov = iovs;
4094
4095 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004096 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004097 PyErr_NoMemory();
4098 goto finally;
4099 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004100 }
4101 for (; ndatabufs < ndataparts; ndatabufs++) {
4102 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4103 "y*;sendmsg() argument 1 must be an iterable of "
4104 "bytes-like objects",
4105 &databufs[ndatabufs]))
4106 goto finally;
4107 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4108 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4109 }
4110 result = 0;
4111 finally:
4112 *databufsout = databufs;
4113 *ndatabufsout = ndatabufs;
4114 Py_XDECREF(data_fast);
4115 return result;
4116}
4117
4118static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004119sock_sendmsg_impl(PySocketSockObject *s, void *data)
4120{
4121 struct sock_sendmsg *ctx = data;
4122
4123 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4124 return (ctx->result >= 0);
4125}
4126
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4128
4129static PyObject *
4130sock_sendmsg(PySocketSockObject *s, PyObject *args)
4131{
Christian Heimesdffa3942016-09-05 23:54:41 +02004132 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004133 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004134 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004135 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004136 struct cmsginfo {
4137 int level;
4138 int type;
4139 Py_buffer data;
4140 } *cmsgs = NULL;
4141 void *controlbuf = NULL;
4142 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004143 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004144 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004145 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004146 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004147
4148 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004149 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004150 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004151 }
4152
4153 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004155 /* Parse destination address. */
4156 if (addr_arg != NULL && addr_arg != Py_None) {
4157 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4158 goto finally;
4159 msg.msg_name = &addrbuf;
4160 msg.msg_namelen = addrlen;
4161 }
4162
4163 /* Fill in an iovec for each message part, and save the Py_buffer
4164 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004165 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004166 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004167 }
4168
4169 if (cmsg_arg == NULL)
4170 ncmsgs = 0;
4171 else {
4172 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4173 "sendmsg() argument 2 must be an "
4174 "iterable")) == NULL)
4175 goto finally;
4176 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4177 }
4178
4179#ifndef CMSG_SPACE
4180 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004181 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004182 "sending multiple control messages is not supported "
4183 "on this system");
4184 goto finally;
4185 }
4186#endif
4187 /* Save level, type and Py_buffer for each control message,
4188 and calculate total size. */
4189 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4190 PyErr_NoMemory();
4191 goto finally;
4192 }
4193 controllen = controllen_last = 0;
4194 while (ncmsgbufs < ncmsgs) {
4195 size_t bufsize, space;
4196
4197 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4198 "(iiy*):[sendmsg() ancillary data items]",
4199 &cmsgs[ncmsgbufs].level,
4200 &cmsgs[ncmsgbufs].type,
4201 &cmsgs[ncmsgbufs].data))
4202 goto finally;
4203 bufsize = cmsgs[ncmsgbufs++].data.len;
4204
4205#ifdef CMSG_SPACE
4206 if (!get_CMSG_SPACE(bufsize, &space)) {
4207#else
4208 if (!get_CMSG_LEN(bufsize, &space)) {
4209#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004210 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004211 goto finally;
4212 }
4213 controllen += space;
4214 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004215 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004216 goto finally;
4217 }
4218 controllen_last = controllen;
4219 }
4220
4221 /* Construct ancillary data block from control message info. */
4222 if (ncmsgbufs > 0) {
4223 struct cmsghdr *cmsgh = NULL;
4224
Victor Stinner52d61e42016-09-12 11:41:58 +02004225 controlbuf = PyMem_Malloc(controllen);
4226 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004227 PyErr_NoMemory();
4228 goto finally;
4229 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004230 msg.msg_control = controlbuf;
4231
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004232 msg.msg_controllen = controllen;
4233
4234 /* Need to zero out the buffer as a workaround for glibc's
4235 CMSG_NXTHDR() implementation. After getting the pointer to
4236 the next header, it checks its (uninitialized) cmsg_len
4237 member to see if the "message" fits in the buffer, and
4238 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004239 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240 memset(controlbuf, 0, controllen);
4241
4242 for (i = 0; i < ncmsgbufs; i++) {
4243 size_t msg_len, data_len = cmsgs[i].data.len;
4244 int enough_space = 0;
4245
4246 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4247 if (cmsgh == NULL) {
4248 PyErr_Format(PyExc_RuntimeError,
4249 "unexpected NULL result from %s()",
4250 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4251 goto finally;
4252 }
4253 if (!get_CMSG_LEN(data_len, &msg_len)) {
4254 PyErr_SetString(PyExc_RuntimeError,
4255 "item size out of range for CMSG_LEN()");
4256 goto finally;
4257 }
4258 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4259 size_t space;
4260
4261 cmsgh->cmsg_len = msg_len;
4262 if (get_cmsg_data_space(&msg, cmsgh, &space))
4263 enough_space = (space >= data_len);
4264 }
4265 if (!enough_space) {
4266 PyErr_SetString(PyExc_RuntimeError,
4267 "ancillary data does not fit in calculated "
4268 "space");
4269 goto finally;
4270 }
4271 cmsgh->cmsg_level = cmsgs[i].level;
4272 cmsgh->cmsg_type = cmsgs[i].type;
4273 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4274 }
4275 }
4276
4277 /* Make the system call. */
4278 if (!IS_SELECTABLE(s)) {
4279 select_error();
4280 goto finally;
4281 }
4282
Victor Stinner31bf2d52015-04-01 21:57:09 +02004283 ctx.msg = &msg;
4284 ctx.flags = flags;
4285 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004286 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004287
4288 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004289
4290finally:
4291 PyMem_Free(controlbuf);
4292 for (i = 0; i < ncmsgbufs; i++)
4293 PyBuffer_Release(&cmsgs[i].data);
4294 PyMem_Free(cmsgs);
4295 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004296 PyMem_Free(msg.msg_iov);
4297 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004298 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004299 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004300 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004301 return retval;
4302}
4303
4304PyDoc_STRVAR(sendmsg_doc,
4305"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4306\n\
4307Send normal and ancillary data to the socket, gathering the\n\
4308non-ancillary data from a series of buffers and concatenating it into\n\
4309a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004310data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004311The ancdata argument specifies the ancillary data (control messages)\n\
4312as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4313cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4314protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004315is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004316argument defaults to 0 and has the same meaning as for send(). If\n\
4317address is supplied and not None, it sets a destination address for\n\
4318the message. The return value is the number of bytes of non-ancillary\n\
4319data sent.");
4320#endif /* CMSG_LEN */
4321
Christian Heimesdffa3942016-09-05 23:54:41 +02004322#ifdef HAVE_SOCKADDR_ALG
4323static PyObject*
4324sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4325{
4326 PyObject *retval = NULL;
4327
4328 Py_ssize_t i, ndatabufs = 0;
4329 Py_buffer *databufs = NULL;
4330 PyObject *data_arg = NULL;
4331
4332 Py_buffer iv = {NULL, NULL};
4333
4334 PyObject *opobj = NULL;
4335 int op = -1;
4336
4337 PyObject *assoclenobj = NULL;
4338 int assoclen = -1;
4339
4340 unsigned int *uiptr;
4341 int flags = 0;
4342
4343 struct msghdr msg;
4344 struct cmsghdr *header = NULL;
4345 struct af_alg_iv *alg_iv = NULL;
4346 struct sock_sendmsg ctx;
4347 Py_ssize_t controllen;
4348 void *controlbuf = NULL;
4349 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4350
4351 if (self->sock_family != AF_ALG) {
4352 PyErr_SetString(PyExc_OSError,
4353 "algset is only supported for AF_ALG");
4354 return NULL;
4355 }
4356
4357 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4358 "|O$O!y*O!i:sendmsg_afalg", keywords,
4359 &data_arg,
4360 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004361 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004362 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004363 }
4364
4365 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004366
4367 /* op is a required, keyword-only argument >= 0 */
4368 if (opobj != NULL) {
4369 op = _PyLong_AsInt(opobj);
4370 }
4371 if (op < 0) {
4372 /* override exception from _PyLong_AsInt() */
4373 PyErr_SetString(PyExc_TypeError,
4374 "Invalid or missing argument 'op'");
4375 goto finally;
4376 }
4377 /* assoclen is optional but must be >= 0 */
4378 if (assoclenobj != NULL) {
4379 assoclen = _PyLong_AsInt(assoclenobj);
4380 if (assoclen == -1 && PyErr_Occurred()) {
4381 goto finally;
4382 }
4383 if (assoclen < 0) {
4384 PyErr_SetString(PyExc_TypeError,
4385 "assoclen must be positive");
4386 goto finally;
4387 }
4388 }
4389
4390 controllen = CMSG_SPACE(4);
4391 if (iv.buf != NULL) {
4392 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4393 }
4394 if (assoclen >= 0) {
4395 controllen += CMSG_SPACE(4);
4396 }
4397
4398 controlbuf = PyMem_Malloc(controllen);
4399 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004400 PyErr_NoMemory();
4401 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004402 }
4403 memset(controlbuf, 0, controllen);
4404
Christian Heimesdffa3942016-09-05 23:54:41 +02004405 msg.msg_controllen = controllen;
4406 msg.msg_control = controlbuf;
4407
4408 /* Fill in an iovec for each message part, and save the Py_buffer
4409 structs to release afterwards. */
4410 if (data_arg != NULL) {
4411 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4412 goto finally;
4413 }
4414 }
4415
4416 /* set operation to encrypt or decrypt */
4417 header = CMSG_FIRSTHDR(&msg);
4418 if (header == NULL) {
4419 PyErr_SetString(PyExc_RuntimeError,
4420 "unexpected NULL result from CMSG_FIRSTHDR");
4421 goto finally;
4422 }
4423 header->cmsg_level = SOL_ALG;
4424 header->cmsg_type = ALG_SET_OP;
4425 header->cmsg_len = CMSG_LEN(4);
4426 uiptr = (void*)CMSG_DATA(header);
4427 *uiptr = (unsigned int)op;
4428
4429 /* set initialization vector */
4430 if (iv.buf != NULL) {
4431 header = CMSG_NXTHDR(&msg, header);
4432 if (header == NULL) {
4433 PyErr_SetString(PyExc_RuntimeError,
4434 "unexpected NULL result from CMSG_NXTHDR(iv)");
4435 goto finally;
4436 }
4437 header->cmsg_level = SOL_ALG;
4438 header->cmsg_type = ALG_SET_IV;
4439 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4440 alg_iv = (void*)CMSG_DATA(header);
4441 alg_iv->ivlen = iv.len;
4442 memcpy(alg_iv->iv, iv.buf, iv.len);
4443 }
4444
4445 /* set length of associated data for AEAD */
4446 if (assoclen >= 0) {
4447 header = CMSG_NXTHDR(&msg, header);
4448 if (header == NULL) {
4449 PyErr_SetString(PyExc_RuntimeError,
4450 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4451 goto finally;
4452 }
4453 header->cmsg_level = SOL_ALG;
4454 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4455 header->cmsg_len = CMSG_LEN(4);
4456 uiptr = (void*)CMSG_DATA(header);
4457 *uiptr = (unsigned int)assoclen;
4458 }
4459
4460 ctx.msg = &msg;
4461 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004462 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004463 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004464 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004465
4466 retval = PyLong_FromSsize_t(ctx.result);
4467
4468 finally:
4469 PyMem_Free(controlbuf);
4470 if (iv.buf != NULL) {
4471 PyBuffer_Release(&iv);
4472 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004473 PyMem_Free(msg.msg_iov);
4474 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004475 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004476 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004477 PyMem_Free(databufs);
4478 return retval;
4479}
4480
4481PyDoc_STRVAR(sendmsg_afalg_doc,
4482"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4483\n\
4484Set operation mode, IV and length of associated data for an AF_ALG\n\
4485operation socket.");
4486#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004487
Guido van Rossum30a685f1991-06-27 15:51:29 +00004488/* s.shutdown(how) method */
4489
Guido van Rossum73624e91994-10-10 17:59:00 +00004490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004491sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 int how;
4494 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004495
Serhiy Storchaka78980432013-01-15 01:12:17 +02004496 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 if (how == -1 && PyErr_Occurred())
4498 return NULL;
4499 Py_BEGIN_ALLOW_THREADS
4500 res = shutdown(s->sock_fd, how);
4501 Py_END_ALLOW_THREADS
4502 if (res < 0)
4503 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004504 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004505}
4506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004507PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004508"shutdown(flag)\n\
4509\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004510Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4511of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004512
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004513#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004514static PyObject*
4515sock_ioctl(PySocketSockObject *s, PyObject *arg)
4516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 unsigned long cmd = SIO_RCVALL;
4518 PyObject *argO;
4519 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4522 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 switch (cmd) {
4525 case SIO_RCVALL: {
4526 unsigned int option = RCVALL_ON;
4527 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4528 return NULL;
4529 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4530 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4531 return set_error();
4532 }
4533 return PyLong_FromUnsignedLong(recv); }
4534 case SIO_KEEPALIVE_VALS: {
4535 struct tcp_keepalive ka;
4536 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4537 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4538 return NULL;
4539 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4540 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4541 return set_error();
4542 }
4543 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004544#if defined(SIO_LOOPBACK_FAST_PATH)
4545 case SIO_LOOPBACK_FAST_PATH: {
4546 unsigned int option;
4547 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4548 return NULL;
4549 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4550 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4551 return set_error();
4552 }
4553 return PyLong_FromUnsignedLong(recv); }
4554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 default:
4556 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4557 return NULL;
4558 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004559}
4560PyDoc_STRVAR(sock_ioctl_doc,
4561"ioctl(cmd, option) -> long\n\
4562\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004563Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4564SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004565SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4566SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004567#endif
4568
4569#if defined(MS_WINDOWS)
4570static PyObject*
4571sock_share(PySocketSockObject *s, PyObject *arg)
4572{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004573 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004574 DWORD processId;
4575 int result;
4576
4577 if (!PyArg_ParseTuple(arg, "I", &processId))
4578 return NULL;
4579
4580 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004581 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004582 Py_END_ALLOW_THREADS
4583 if (result == SOCKET_ERROR)
4584 return set_error();
4585 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4586}
4587PyDoc_STRVAR(sock_share_doc,
4588"share(process_id) -> bytes\n\
4589\n\
4590Share the socket with another process. The target process id\n\
4591must be provided and the resulting bytes object passed to the target\n\
4592process. There the shared socket can be instantiated by calling\n\
4593socket.fromshare().");
4594
Christian Heimesfaf2f632008-01-06 16:59:19 +00004595
4596#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004597
4598/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004599
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004600static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4602 accept_doc},
4603 {"bind", (PyCFunction)sock_bind, METH_O,
4604 bind_doc},
4605 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004606 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 {"connect", (PyCFunction)sock_connect, METH_O,
4608 connect_doc},
4609 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4610 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004611 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4612 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4614 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004615#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 {"getpeername", (PyCFunction)sock_getpeername,
4617 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 {"getsockname", (PyCFunction)sock_getsockname,
4620 METH_NOARGS, getsockname_doc},
4621 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4622 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004623#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4625 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004626#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004627#if defined(MS_WINDOWS)
4628 {"share", (PyCFunction)sock_share, METH_VARARGS,
4629 sock_share_doc},
4630#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004631 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 listen_doc},
4633 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4634 recv_doc},
4635 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4636 recv_into_doc},
4637 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4638 recvfrom_doc},
4639 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4640 recvfrom_into_doc},
4641 {"send", (PyCFunction)sock_send, METH_VARARGS,
4642 send_doc},
4643 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4644 sendall_doc},
4645 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4646 sendto_doc},
4647 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4648 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004649 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4650 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4652 settimeout_doc},
4653 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4654 gettimeout_doc},
4655 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4656 setsockopt_doc},
4657 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4658 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004659#ifdef CMSG_LEN
4660 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4661 recvmsg_doc},
4662 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4663 recvmsg_into_doc,},
4664 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4665 sendmsg_doc},
4666#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004667#ifdef HAVE_SOCKADDR_ALG
4668 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4669 sendmsg_afalg_doc},
4670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004672};
4673
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004674/* SockObject members */
4675static PyMemberDef sock_memberlist[] = {
4676 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4677 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4678 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004679 {0},
4680};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004681
Victor Stinner71694d52015-03-28 01:18:54 +01004682static PyGetSetDef sock_getsetlist[] = {
4683 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4684 {NULL} /* sentinel */
4685};
4686
Guido van Rossum73624e91994-10-10 17:59:00 +00004687/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004688 First close the file description. */
4689
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004690static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004691sock_finalize(PySocketSockObject *s)
4692{
4693 SOCKET_T fd;
4694 PyObject *error_type, *error_value, *error_traceback;
4695
4696 /* Save the current exception, if any. */
4697 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4698
Victor Stinnerd3afb622016-07-22 17:47:09 +02004699 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004700 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4701 /* Spurious errors can appear at shutdown */
4702 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4703 PyErr_WriteUnraisable((PyObject *)s);
4704 }
4705 }
4706
4707 /* Only close the socket *after* logging the ResourceWarning warning
4708 to allow the logger to call socket methods like
4709 socket.getsockname(). If the socket is closed before, socket
4710 methods fails with the EBADF error. */
4711 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004712 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004713
4714 /* We do not want to retry upon EINTR: see sock_close() */
4715 Py_BEGIN_ALLOW_THREADS
4716 (void) SOCKETCLOSE(fd);
4717 Py_END_ALLOW_THREADS
4718 }
4719
4720 /* Restore the saved exception. */
4721 PyErr_Restore(error_type, error_value, error_traceback);
4722}
4723
4724static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004725sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004726{
Victor Stinner19a8e842016-03-21 16:36:48 +01004727 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4728 return;
4729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004731}
4732
Guido van Rossum30a685f1991-06-27 15:51:29 +00004733
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004734static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004735sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004736{
Victor Stinnere254e532014-07-26 14:36:55 +02004737 long sock_fd;
4738 /* On Windows, this test is needed because SOCKET_T is unsigned */
4739 if (s->sock_fd == INVALID_SOCKET) {
4740 sock_fd = -1;
4741 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004742#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004743 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 /* this can occur on Win64, and actually there is a special
4745 ugly printf formatter for decimal pointer length integer
4746 printing, only bother if necessary*/
4747 PyErr_SetString(PyExc_OverflowError,
4748 "no printf formatter to display "
4749 "the socket descriptor in decimal");
4750 return NULL;
4751 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004752#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004753 else
4754 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 return PyUnicode_FromFormat(
4756 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004757 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 s->sock_type,
4759 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004760}
4761
4762
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004763/* Create a new, uninitialized socket object. */
4764
4765static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004766sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 new = type->tp_alloc(type, 0);
4771 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004772 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004773 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 ((PySocketSockObject *)new)->errorhandler = &set_error;
4775 }
4776 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004777}
4778
4779
4780/* Initialize a new socket object. */
4781
Victor Stinnerdaf45552013-08-28 00:53:59 +02004782#ifdef SOCK_CLOEXEC
4783/* socket() and socketpair() fail with EINVAL on Linux kernel older
4784 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4785static int sock_cloexec_works = -1;
4786#endif
4787
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004788/*ARGSUSED*/
4789static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004790sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 PySocketSockObject *s = (PySocketSockObject *)self;
4793 PyObject *fdobj = NULL;
4794 SOCKET_T fd = INVALID_SOCKET;
4795 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4796 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004797#ifndef MS_WINDOWS
4798#ifdef SOCK_CLOEXEC
4799 int *atomic_flag_works = &sock_cloexec_works;
4800#else
4801 int *atomic_flag_works = NULL;
4802#endif
4803#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4806 "|iiiO:socket", keywords,
4807 &family, &type, &proto, &fdobj))
4808 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004811#ifdef MS_WINDOWS
4812 /* recreate a socket that was duplicated */
4813 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004814 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004815 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4816 PyErr_Format(PyExc_ValueError,
4817 "socket descriptor string has wrong size, "
4818 "should be %zu bytes.", sizeof(info));
4819 return -1;
4820 }
4821 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4822 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004823 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004824 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4825 Py_END_ALLOW_THREADS
4826 if (fd == INVALID_SOCKET) {
4827 set_error();
4828 return -1;
4829 }
4830 family = info.iAddressFamily;
4831 type = info.iSocketType;
4832 proto = info.iProtocol;
4833 }
4834 else
4835#endif
4836 {
4837 fd = PyLong_AsSocket_t(fdobj);
4838 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4839 return -1;
4840 if (fd == INVALID_SOCKET) {
4841 PyErr_SetString(PyExc_ValueError,
4842 "can't use invalid socket value");
4843 return -1;
4844 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 }
4846 }
4847 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004848#ifdef MS_WINDOWS
4849 /* Windows implementation */
4850#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4851#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4852#endif
4853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004855 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004856 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004857 NULL, 0,
4858 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4859 if (fd == INVALID_SOCKET) {
4860 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4861 support_wsa_no_inherit = 0;
4862 fd = socket(family, type, proto);
4863 }
4864 }
4865 else {
4866 fd = socket(family, type, proto);
4867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 if (fd == INVALID_SOCKET) {
4871 set_error();
4872 return -1;
4873 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004874
4875 if (!support_wsa_no_inherit) {
4876 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4877 closesocket(fd);
4878 PyErr_SetFromWindowsErr(0);
4879 return -1;
4880 }
4881 }
4882#else
4883 /* UNIX */
4884 Py_BEGIN_ALLOW_THREADS
4885#ifdef SOCK_CLOEXEC
4886 if (sock_cloexec_works != 0) {
4887 fd = socket(family, type | SOCK_CLOEXEC, proto);
4888 if (sock_cloexec_works == -1) {
4889 if (fd >= 0) {
4890 sock_cloexec_works = 1;
4891 }
4892 else if (errno == EINVAL) {
4893 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4894 sock_cloexec_works = 0;
4895 fd = socket(family, type, proto);
4896 }
4897 }
4898 }
4899 else
4900#endif
4901 {
4902 fd = socket(family, type, proto);
4903 }
4904 Py_END_ALLOW_THREADS
4905
4906 if (fd == INVALID_SOCKET) {
4907 set_error();
4908 return -1;
4909 }
4910
4911 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4912 SOCKETCLOSE(fd);
4913 return -1;
4914 }
4915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004917 if (init_sockobject(s, fd, family, type, proto) == -1) {
4918 SOCKETCLOSE(fd);
4919 return -1;
4920 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004923
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004924}
4925
4926
Guido van Rossumb6775db1994-08-01 11:34:53 +00004927/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004928
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004929static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4931 "_socket.socket", /* tp_name */
4932 sizeof(PySocketSockObject), /* tp_basicsize */
4933 0, /* tp_itemsize */
4934 (destructor)sock_dealloc, /* tp_dealloc */
4935 0, /* tp_print */
4936 0, /* tp_getattr */
4937 0, /* tp_setattr */
4938 0, /* tp_reserved */
4939 (reprfunc)sock_repr, /* tp_repr */
4940 0, /* tp_as_number */
4941 0, /* tp_as_sequence */
4942 0, /* tp_as_mapping */
4943 0, /* tp_hash */
4944 0, /* tp_call */
4945 0, /* tp_str */
4946 PyObject_GenericGetAttr, /* tp_getattro */
4947 0, /* tp_setattro */
4948 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004949 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4950 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 sock_doc, /* tp_doc */
4952 0, /* tp_traverse */
4953 0, /* tp_clear */
4954 0, /* tp_richcompare */
4955 0, /* tp_weaklistoffset */
4956 0, /* tp_iter */
4957 0, /* tp_iternext */
4958 sock_methods, /* tp_methods */
4959 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004960 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 0, /* tp_base */
4962 0, /* tp_dict */
4963 0, /* tp_descr_get */
4964 0, /* tp_descr_set */
4965 0, /* tp_dictoffset */
4966 sock_initobj, /* tp_init */
4967 PyType_GenericAlloc, /* tp_alloc */
4968 sock_new, /* tp_new */
4969 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004970 0, /* tp_is_gc */
4971 0, /* tp_bases */
4972 0, /* tp_mro */
4973 0, /* tp_cache */
4974 0, /* tp_subclasses */
4975 0, /* tp_weaklist */
4976 0, /* tp_del */
4977 0, /* tp_version_tag */
4978 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004979};
4980
Guido van Rossum30a685f1991-06-27 15:51:29 +00004981
Guido van Rossum81194471991-07-27 21:42:02 +00004982/* Python interface to gethostname(). */
4983
4984/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004985static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004986socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004987{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004988#ifdef MS_WINDOWS
4989 /* Don't use winsock's gethostname, as this returns the ANSI
4990 version of the hostname, whereas we need a Unicode string.
4991 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004992 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004993 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004994 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004995 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004996
4997 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004998 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004999
5000 if (GetLastError() != ERROR_MORE_DATA)
5001 return PyErr_SetFromWindowsErr(0);
5002
5003 if (size == 0)
5004 return PyUnicode_New(0, 0);
5005
5006 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5007 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005008 name = PyMem_New(wchar_t, size);
5009 if (!name) {
5010 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005011 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005012 }
Victor Stinner74168972011-11-17 01:11:36 +01005013 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5014 name,
5015 &size))
5016 {
5017 PyMem_Free(name);
5018 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005019 }
Victor Stinner74168972011-11-17 01:11:36 +01005020
5021 result = PyUnicode_FromWideChar(name, size);
5022 PyMem_Free(name);
5023 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005024#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 char buf[1024];
5026 int res;
5027 Py_BEGIN_ALLOW_THREADS
5028 res = gethostname(buf, (int) sizeof buf - 1);
5029 Py_END_ALLOW_THREADS
5030 if (res < 0)
5031 return set_error();
5032 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005033 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005034#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005035}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005037PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005038"gethostname() -> string\n\
5039\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005040Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005041
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005042#ifdef HAVE_SETHOSTNAME
5043PyDoc_STRVAR(sethostname_doc,
5044"sethostname(name)\n\n\
5045Sets the hostname to name.");
5046
5047static PyObject *
5048socket_sethostname(PyObject *self, PyObject *args)
5049{
5050 PyObject *hnobj;
5051 Py_buffer buf;
5052 int res, flag = 0;
5053
Christian Heimesd2774c72013-06-19 02:06:29 +02005054#ifdef _AIX
5055/* issue #18259, not declared in any useful header file */
5056extern int sethostname(const char *, size_t);
5057#endif
5058
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005059 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5060 PyErr_Clear();
5061 if (!PyArg_ParseTuple(args, "O&:sethostname",
5062 PyUnicode_FSConverter, &hnobj))
5063 return NULL;
5064 flag = 1;
5065 }
5066 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5067 if (!res) {
5068 res = sethostname(buf.buf, buf.len);
5069 PyBuffer_Release(&buf);
5070 }
5071 if (flag)
5072 Py_DECREF(hnobj);
5073 if (res)
5074 return set_error();
5075 Py_RETURN_NONE;
5076}
5077#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005078
Guido van Rossum30a685f1991-06-27 15:51:29 +00005079/* Python interface to gethostbyname(name). */
5080
5081/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005083socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 char *name;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005086 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005087 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005088
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005089 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 return NULL;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005091 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005092 goto finally;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005093 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005094finally:
5095 PyMem_Free(name);
5096 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005097}
5098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005099PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005100"gethostbyname(host) -> address\n\
5101\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005102Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005103
5104
Victor Stinner72400302016-01-28 15:41:01 +01005105static PyObject*
5106sock_decode_hostname(const char *name)
5107{
5108#ifdef MS_WINDOWS
5109 /* Issue #26227: gethostbyaddr() returns a string encoded
5110 * to the ANSI code page */
5111 return PyUnicode_DecodeFSDefault(name);
5112#else
5113 /* Decode from UTF-8 */
5114 return PyUnicode_FromString(name);
5115#endif
5116}
5117
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005118/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5119
5120static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005121gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 char **pch;
5124 PyObject *rtn_tuple = (PyObject *)NULL;
5125 PyObject *name_list = (PyObject *)NULL;
5126 PyObject *addr_list = (PyObject *)NULL;
5127 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005128 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 if (h == NULL) {
5131 /* Let's get real error message to return */
5132 set_herror(h_errno);
5133 return NULL;
5134 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 if (h->h_addrtype != af) {
5137 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005138 errno = EAFNOSUPPORT;
5139 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 return NULL;
5141 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 case AF_INET:
5146 if (alen < sizeof(struct sockaddr_in))
5147 return NULL;
5148 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005149
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005150#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 case AF_INET6:
5152 if (alen < sizeof(struct sockaddr_in6))
5153 return NULL;
5154 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005155#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 if ((name_list = PyList_New(0)) == NULL)
5160 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 if ((addr_list = PyList_New(0)) == NULL)
5163 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 /* SF #1511317: h_aliases can be NULL */
5166 if (h->h_aliases) {
5167 for (pch = h->h_aliases; *pch != NULL; pch++) {
5168 int status;
5169 tmp = PyUnicode_FromString(*pch);
5170 if (tmp == NULL)
5171 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 status = PyList_Append(name_list, tmp);
5174 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 if (status)
5177 goto err;
5178 }
5179 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5182 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 case AF_INET:
5187 {
5188 struct sockaddr_in sin;
5189 memset(&sin, 0, sizeof(sin));
5190 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005191#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005195 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 if (pch == h->h_addr_list && alen >= sizeof(sin))
5198 memcpy((char *) addr, &sin, sizeof(sin));
5199 break;
5200 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005201
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005202#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 case AF_INET6:
5204 {
5205 struct sockaddr_in6 sin6;
5206 memset(&sin6, 0, sizeof(sin6));
5207 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005208#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005212 tmp = makeipaddr((struct sockaddr *)&sin6,
5213 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5216 memcpy((char *) addr, &sin6, sizeof(sin6));
5217 break;
5218 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005219#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005222 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 "unsupported address family");
5224 return NULL;
5225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 if (tmp == NULL)
5228 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 status = PyList_Append(addr_list, tmp);
5231 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 if (status)
5234 goto err;
5235 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005236
Victor Stinner72400302016-01-28 15:41:01 +01005237 name = sock_decode_hostname(h->h_name);
5238 if (name == NULL)
5239 goto err;
5240 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005241
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005242 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 Py_XDECREF(name_list);
5244 Py_XDECREF(addr_list);
5245 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005246}
5247
5248
5249/* Python interface to gethostbyname_ex(name). */
5250
5251/*ARGSUSED*/
5252static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005253socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 char *name;
5256 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005257 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005259 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005260#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005262#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005264#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 char buf[16384];
5266 int buf_len = (sizeof buf) - 1;
5267 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005268#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005269#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005271#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005272#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005273
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005274 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005276 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005277 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005279#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005280#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005281 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005283#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005285#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 memset((void *) &data, '\0', sizeof(data));
5287 result = gethostbyname_r(name, &hp_allocated, &data);
5288 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005289#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005290#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005291#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005293#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005294 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005296#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 Py_END_ALLOW_THREADS
5298 /* Some C libraries would require addr.__ss_family instead of
5299 addr.ss_family.
5300 Therefore, we cast the sockaddr_storage into sockaddr to
5301 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005302 sa = SAS2SA(&addr);
5303 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005305#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005307#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005308finally:
5309 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005311}
5312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005313PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005314"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5315\n\
5316Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005317for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005318
5319
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005320/* Python interface to gethostbyaddr(IP). */
5321
5322/*ARGSUSED*/
5323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005324socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005325{
Charles-François Natali8b759652011-12-23 16:44:51 +01005326 sock_addr_t addr;
5327 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 char *ip_num;
5329 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005330 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005331#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005333#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 /* glibcs up to 2.10 assume that the buf argument to
5337 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5338 does not ensure. The attribute below instructs the compiler
5339 to maintain this alignment. */
5340 char buf[16384] Py_ALIGNED(8);
5341 int buf_len = (sizeof buf) - 1;
5342 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005343#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005344#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005346#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005347#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005348 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 int al;
5350 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005351
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005352 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 return NULL;
5354 af = AF_UNSPEC;
5355 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005356 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 af = sa->sa_family;
5358 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005359 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 switch (af) {
5361 case AF_INET:
5362 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5363 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5364 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005365#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 case AF_INET6:
5367 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5368 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5369 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005372 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005373 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 }
5375 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005376#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005377#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005378 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 &hp_allocated, buf, buf_len,
5380 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005381#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 h = gethostbyaddr_r(ap, al, af,
5383 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005384#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 memset((void *) &data, '\0', sizeof(data));
5386 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5387 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005388#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005389#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005390#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005392#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005393 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005395#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005397 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005398#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005400#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005401finally:
5402 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005404}
5405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005406PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005407"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5408\n\
5409Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005410for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005411
Guido van Rossum30a685f1991-06-27 15:51:29 +00005412
5413/* Python interface to getservbyname(name).
5414 This only returns the port number, since the other info is already
5415 known or not useful (like the list of aliases). */
5416
5417/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005418static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005419socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005420{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005421 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 struct servent *sp;
5423 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5424 return NULL;
5425 Py_BEGIN_ALLOW_THREADS
5426 sp = getservbyname(name, proto);
5427 Py_END_ALLOW_THREADS
5428 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005429 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 return NULL;
5431 }
5432 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005433}
5434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005435PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005436"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005437\n\
5438Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005439The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5440otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005441
Guido van Rossum30a685f1991-06-27 15:51:29 +00005442
Barry Warsaw11b91a02004-06-28 00:50:43 +00005443/* Python interface to getservbyport(port).
5444 This only returns the service name, since the other info is already
5445 known or not useful (like the list of aliases). */
5446
5447/*ARGSUSED*/
5448static PyObject *
5449socket_getservbyport(PyObject *self, PyObject *args)
5450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005452 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 struct servent *sp;
5454 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5455 return NULL;
5456 if (port < 0 || port > 0xffff) {
5457 PyErr_SetString(
5458 PyExc_OverflowError,
5459 "getservbyport: port must be 0-65535.");
5460 return NULL;
5461 }
5462 Py_BEGIN_ALLOW_THREADS
5463 sp = getservbyport(htons((short)port), proto);
5464 Py_END_ALLOW_THREADS
5465 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005466 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 return NULL;
5468 }
5469 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005470}
5471
5472PyDoc_STRVAR(getservbyport_doc,
5473"getservbyport(port[, protocolname]) -> string\n\
5474\n\
5475Return the service name from a port number and protocol name.\n\
5476The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5477otherwise any protocol will match.");
5478
Guido van Rossum3901d851996-12-19 16:35:04 +00005479/* Python interface to getprotobyname(name).
5480 This only returns the protocol number, since the other info is
5481 already known or not useful (like the list of aliases). */
5482
5483/*ARGSUSED*/
5484static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005485socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005486{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005487 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 struct protoent *sp;
5489 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5490 return NULL;
5491 Py_BEGIN_ALLOW_THREADS
5492 sp = getprotobyname(name);
5493 Py_END_ALLOW_THREADS
5494 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005495 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 return NULL;
5497 }
5498 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005499}
5500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005501PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005502"getprotobyname(name) -> integer\n\
5503\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005504Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005505
Christian Heimesd0e31b92018-01-27 09:54:13 +01005506static PyObject *
5507socket_close(PyObject *self, PyObject *fdobj)
5508{
5509 SOCKET_T fd;
5510 int res;
5511
5512 fd = PyLong_AsSocket_t(fdobj);
5513 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5514 return NULL;
5515 Py_BEGIN_ALLOW_THREADS
5516 res = SOCKETCLOSE(fd);
5517 Py_END_ALLOW_THREADS
5518 /* bpo-30319: The peer can already have closed the connection.
5519 Python ignores ECONNRESET on close(). */
5520 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5521 return set_error();
5522 }
5523 Py_RETURN_NONE;
5524}
5525
5526PyDoc_STRVAR(close_doc,
5527"close(integer) -> None\n\
5528\n\
5529Close an integer socket file descriptor. This is like os.close(), but for\n\
5530sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005531
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005532#ifndef NO_DUP
5533/* dup() function for socket fds */
5534
5535static PyObject *
5536socket_dup(PyObject *self, PyObject *fdobj)
5537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 SOCKET_T fd, newfd;
5539 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005540#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005541 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005542#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 fd = PyLong_AsSocket_t(fdobj);
5545 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5546 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005547
Victor Stinnerdaf45552013-08-28 00:53:59 +02005548#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005549 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005550 return set_error();
5551
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005552 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005553 FROM_PROTOCOL_INFO,
5554 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 if (newfd == INVALID_SOCKET)
5556 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005557
Victor Stinnerdaf45552013-08-28 00:53:59 +02005558 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5559 closesocket(newfd);
5560 PyErr_SetFromWindowsErr(0);
5561 return NULL;
5562 }
5563#else
5564 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5565 newfd = _Py_dup(fd);
5566 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005567 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005568#endif
5569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 newfdobj = PyLong_FromSocket_t(newfd);
5571 if (newfdobj == NULL)
5572 SOCKETCLOSE(newfd);
5573 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005574}
5575
5576PyDoc_STRVAR(dup_doc,
5577"dup(integer) -> integer\n\
5578\n\
5579Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5580sockets; on some platforms os.dup() won't work for socket file descriptors.");
5581#endif
5582
5583
Dave Cole331708b2004-08-09 04:51:41 +00005584#ifdef HAVE_SOCKETPAIR
5585/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005586 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005587 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005588
5589/*ARGSUSED*/
5590static PyObject *
5591socket_socketpair(PyObject *self, PyObject *args)
5592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 PySocketSockObject *s0 = NULL, *s1 = NULL;
5594 SOCKET_T sv[2];
5595 int family, type = SOCK_STREAM, proto = 0;
5596 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005597#ifdef SOCK_CLOEXEC
5598 int *atomic_flag_works = &sock_cloexec_works;
5599#else
5600 int *atomic_flag_works = NULL;
5601#endif
5602 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005603
5604#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5610 &family, &type, &proto))
5611 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005614 Py_BEGIN_ALLOW_THREADS
5615#ifdef SOCK_CLOEXEC
5616 if (sock_cloexec_works != 0) {
5617 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5618 if (sock_cloexec_works == -1) {
5619 if (ret >= 0) {
5620 sock_cloexec_works = 1;
5621 }
5622 else if (errno == EINVAL) {
5623 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5624 sock_cloexec_works = 0;
5625 ret = socketpair(family, type, proto, sv);
5626 }
5627 }
5628 }
5629 else
5630#endif
5631 {
5632 ret = socketpair(family, type, proto, sv);
5633 }
5634 Py_END_ALLOW_THREADS
5635
5636 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005638
5639 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5640 goto finally;
5641 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5642 goto finally;
5643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 s0 = new_sockobject(sv[0], family, type, proto);
5645 if (s0 == NULL)
5646 goto finally;
5647 s1 = new_sockobject(sv[1], family, type, proto);
5648 if (s1 == NULL)
5649 goto finally;
5650 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005651
5652finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 if (res == NULL) {
5654 if (s0 == NULL)
5655 SOCKETCLOSE(sv[0]);
5656 if (s1 == NULL)
5657 SOCKETCLOSE(sv[1]);
5658 }
5659 Py_XDECREF(s0);
5660 Py_XDECREF(s1);
5661 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005662}
5663
5664PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005665"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005666\n\
5667Create a pair of socket objects from the sockets returned by the platform\n\
5668socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005669The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005670AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005671
5672#endif /* HAVE_SOCKETPAIR */
5673
5674
Guido van Rossum006bf911996-06-12 04:04:55 +00005675static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005676socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005677{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005678 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005679
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005680 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 return NULL;
5682 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005683 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005685 "ntohs: can't convert negative Python int to C "
5686 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 return NULL;
5688 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005689 if (x > 0xffff) {
5690 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5691 "ntohs: Python int too large to convert to C "
5692 "16-bit unsigned integer (The silent truncation "
5693 "is deprecated)",
5694 1)) {
5695 return NULL;
5696 }
5697 }
5698 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005699}
5700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005701PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005702"ntohs(integer) -> integer\n\
5703\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005704Convert a 16-bit unsigned integer from network to host byte order.\n\
5705Note that in case the received integer does not fit in 16-bit unsigned\n\
5706integer, but does fit in a positive C int, it is silently truncated to\n\
570716-bit unsigned integer.\n\
5708However, this silent truncation feature is deprecated, and will raise an \n\
5709exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005710
5711
Guido van Rossum006bf911996-06-12 04:04:55 +00005712static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005713socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 if (PyLong_Check(arg)) {
5718 x = PyLong_AsUnsignedLong(arg);
5719 if (x == (unsigned long) -1 && PyErr_Occurred())
5720 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005721#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 {
5723 unsigned long y;
5724 /* only want the trailing 32 bits */
5725 y = x & 0xFFFFFFFFUL;
5726 if (y ^ x)
5727 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005728 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 x = y;
5730 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 }
5733 else
5734 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005735 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005738}
5739
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005740PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005741"ntohl(integer) -> integer\n\
5742\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005743Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005744
5745
Guido van Rossum006bf911996-06-12 04:04:55 +00005746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005747socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005748{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005749 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005750
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005751 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 return NULL;
5753 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005754 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005756 "htons: can't convert negative Python int to C "
5757 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 return NULL;
5759 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005760 if (x > 0xffff) {
5761 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5762 "htons: Python int too large to convert to C "
5763 "16-bit unsigned integer (The silent truncation "
5764 "is deprecated)",
5765 1)) {
5766 return NULL;
5767 }
5768 }
5769 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005770}
5771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005772PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005773"htons(integer) -> integer\n\
5774\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005775Convert a 16-bit unsigned integer from host to network byte order.\n\
5776Note that in case the received integer does not fit in 16-bit unsigned\n\
5777integer, but does fit in a positive C int, it is silently truncated to\n\
577816-bit unsigned integer.\n\
5779However, this silent truncation feature is deprecated, and will raise an \n\
5780exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005781
5782
Guido van Rossum006bf911996-06-12 04:04:55 +00005783static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005784socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 if (PyLong_Check(arg)) {
5789 x = PyLong_AsUnsignedLong(arg);
5790 if (x == (unsigned long) -1 && PyErr_Occurred())
5791 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005792#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 {
5794 unsigned long y;
5795 /* only want the trailing 32 bits */
5796 y = x & 0xFFFFFFFFUL;
5797 if (y ^ x)
5798 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005799 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 x = y;
5801 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 }
5804 else
5805 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005806 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 Py_TYPE(arg)->tp_name);
5808 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005809}
5810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005811PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005812"htonl(integer) -> integer\n\
5813\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005814Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005815
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005816/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005817
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005818PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005819"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005820\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005821Convert 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 +00005822binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005823
5824static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005825socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005826{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005827#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005829#endif
5830
5831#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005832#if (SIZEOF_INT != 4)
5833#error "Not sure if in_addr_t exists and int is not 32-bits."
5834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 /* Have to use inet_addr() instead */
5836 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005837#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005838 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5841 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005842
Tim Peters1df9fdd2003-02-13 03:13:40 +00005843
5844#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005845
5846#ifdef USE_INET_ATON_WEAKLINK
5847 if (inet_aton != NULL) {
5848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 if (inet_aton(ip_addr, &buf))
5850 return PyBytes_FromStringAndSize((char *)(&buf),
5851 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005852
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005853 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 "illegal IP address string passed to inet_aton");
5855 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005856
Thomas Wouters477c8d52006-05-27 19:21:47 +00005857#ifdef USE_INET_ATON_WEAKLINK
5858 } else {
5859#endif
5860
5861#endif
5862
5863#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 /* special-case this address as inet_addr might return INADDR_NONE
5866 * for this */
5867 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005868 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005870
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005871 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 "illegal IP address string passed to inet_aton");
5877 return NULL;
5878 }
5879 }
5880 return PyBytes_FromStringAndSize((char *) &packed_addr,
5881 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005882
5883#ifdef USE_INET_ATON_WEAKLINK
5884 }
5885#endif
5886
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005887#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005888}
5889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005890PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005891"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005892\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005893Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005894
5895static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005896socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005897{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005898 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005900
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005901 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 return NULL;
5903 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005904
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005905 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005906 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005908 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 return NULL;
5910 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005911
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005912 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5913 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005914
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005915 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005917}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005918
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005919#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005920
5921PyDoc_STRVAR(inet_pton_doc,
5922"inet_pton(af, ip) -> packed IP address string\n\
5923\n\
5924Convert an IP address from string format to a packed string suitable\n\
5925for use with low-level network functions.");
5926
5927static PyObject *
5928socket_inet_pton(PyObject *self, PyObject *args)
5929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005931 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005933#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005934 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005935#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5939 return NULL;
5940 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005941
Martin v. Löwis04697e82004-06-02 12:35:29 +00005942#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005944 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 "can't use AF_INET6, IPv6 is disabled");
5946 return NULL;
5947 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005948#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 retval = inet_pton(af, ip, packed);
5951 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005952 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 return NULL;
5954 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005955 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 "illegal IP address string passed to inet_pton");
5957 return NULL;
5958 } else if (af == AF_INET) {
5959 return PyBytes_FromStringAndSize(packed,
5960 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005961#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 } else if (af == AF_INET6) {
5963 return PyBytes_FromStringAndSize(packed,
5964 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005967 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 return NULL;
5969 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005970}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005971
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005972PyDoc_STRVAR(inet_ntop_doc,
5973"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5974\n\
5975Convert a packed IP address of the given family to string format.");
5976
5977static PyObject *
5978socket_inet_ntop(PyObject *self, PyObject *args)
5979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005981 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005983#ifdef ENABLE_IPV6
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005984 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005985#else
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005986 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005987#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005988
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005989 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5990 memset((void *) &ip[0], '\0', sizeof(ip));
5991
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005992 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 return NULL;
5994 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005997 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 PyErr_SetString(PyExc_ValueError,
5999 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006000 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 return NULL;
6002 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006003#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006005 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 PyErr_SetString(PyExc_ValueError,
6007 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006008 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 return NULL;
6010 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 } else {
6013 PyErr_Format(PyExc_ValueError,
6014 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006015 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 return NULL;
6017 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006018
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006019 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6020 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006022 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 return NULL;
6024 } else {
6025 return PyUnicode_FromString(retval);
6026 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006027}
6028
6029#endif /* HAVE_INET_PTON */
6030
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006031/* Python interface to getaddrinfo(host, port). */
6032
6033/*ARGSUSED*/
6034static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006035socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006036{
Victor Stinner77af1722011-05-26 14:05:59 +02006037 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006038 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 struct addrinfo hints, *res;
6040 struct addrinfo *res0 = NULL;
6041 PyObject *hobj = NULL;
6042 PyObject *pobj = (PyObject *)NULL;
6043 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006044 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 int family, socktype, protocol, flags;
6046 int error;
6047 PyObject *all = (PyObject *)NULL;
6048 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006049
Georg Brandl6083a4b2013-10-14 06:51:46 +02006050 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006052 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006053 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 &protocol, &flags)) {
6055 return NULL;
6056 }
6057 if (hobj == Py_None) {
6058 hptr = NULL;
6059 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006060 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 if (!idna)
6062 return NULL;
6063 assert(PyBytes_Check(idna));
6064 hptr = PyBytes_AS_STRING(idna);
6065 } else if (PyBytes_Check(hobj)) {
6066 hptr = PyBytes_AsString(hobj);
6067 } else {
6068 PyErr_SetString(PyExc_TypeError,
6069 "getaddrinfo() argument 1 must be string or None");
6070 return NULL;
6071 }
6072 if (PyLong_CheckExact(pobj)) {
6073 long value = PyLong_AsLong(pobj);
6074 if (value == -1 && PyErr_Occurred())
6075 goto err;
6076 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6077 pptr = pbuf;
6078 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006079 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006080 if (pptr == NULL)
6081 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006083 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 } else if (pobj == Py_None) {
6085 pptr = (char *)NULL;
6086 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006087 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 goto err;
6089 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006090#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006091 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6092 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006093 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6094 * This workaround avoids a segfault in libsystem.
6095 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006096 pptr = "00";
6097 }
6098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 memset(&hints, 0, sizeof(hints));
6100 hints.ai_family = family;
6101 hints.ai_socktype = socktype;
6102 hints.ai_protocol = protocol;
6103 hints.ai_flags = flags;
6104 Py_BEGIN_ALLOW_THREADS
6105 ACQUIRE_GETADDRINFO_LOCK
6106 error = getaddrinfo(hptr, pptr, &hints, &res0);
6107 Py_END_ALLOW_THREADS
6108 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6109 if (error) {
6110 set_gaierror(error);
6111 goto err;
6112 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006113
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006114 all = PyList_New(0);
6115 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 goto err;
6117 for (res = res0; res; res = res->ai_next) {
6118 PyObject *single;
6119 PyObject *addr =
6120 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6121 if (addr == NULL)
6122 goto err;
6123 single = Py_BuildValue("iiisO", res->ai_family,
6124 res->ai_socktype, res->ai_protocol,
6125 res->ai_canonname ? res->ai_canonname : "",
6126 addr);
6127 Py_DECREF(addr);
6128 if (single == NULL)
6129 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 if (PyList_Append(all, single))
6132 goto err;
6133 Py_XDECREF(single);
6134 }
6135 Py_XDECREF(idna);
6136 if (res0)
6137 freeaddrinfo(res0);
6138 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006139 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 Py_XDECREF(all);
6141 Py_XDECREF(idna);
6142 if (res0)
6143 freeaddrinfo(res0);
6144 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006145}
6146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006147PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006148"getaddrinfo(host, port [, family, type, proto, flags])\n\
6149 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006151Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006152
6153/* Python interface to getnameinfo(sa, flags). */
6154
6155/*ARGSUSED*/
6156static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006157socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 PyObject *sa = (PyObject *)NULL;
6160 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006161 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006162 int port;
6163 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6165 struct addrinfo hints, *res = NULL;
6166 int error;
6167 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006168 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 flags = flowinfo = scope_id = 0;
6171 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6172 return NULL;
6173 if (!PyTuple_Check(sa)) {
6174 PyErr_SetString(PyExc_TypeError,
6175 "getnameinfo() argument 1 must be a tuple");
6176 return NULL;
6177 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006178 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006180 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006182 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006183 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006184 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006185 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006186 return NULL;
6187 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6189 memset(&hints, 0, sizeof(hints));
6190 hints.ai_family = AF_UNSPEC;
6191 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006192 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 Py_BEGIN_ALLOW_THREADS
6194 ACQUIRE_GETADDRINFO_LOCK
6195 error = getaddrinfo(hostp, pbuf, &hints, &res);
6196 Py_END_ALLOW_THREADS
6197 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6198 if (error) {
6199 set_gaierror(error);
6200 goto fail;
6201 }
6202 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006203 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 "sockaddr resolved to multiple addresses");
6205 goto fail;
6206 }
6207 switch (res->ai_family) {
6208 case AF_INET:
6209 {
6210 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006211 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 "IPv4 sockaddr must be 2 tuple");
6213 goto fail;
6214 }
6215 break;
6216 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006217#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 case AF_INET6:
6219 {
6220 struct sockaddr_in6 *sin6;
6221 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006222 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 sin6->sin6_scope_id = scope_id;
6224 break;
6225 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006228 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6230 if (error) {
6231 set_gaierror(error);
6232 goto fail;
6233 }
Victor Stinner72400302016-01-28 15:41:01 +01006234
6235 name = sock_decode_hostname(hbuf);
6236 if (name == NULL)
6237 goto fail;
6238 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006239
6240fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 if (res)
6242 freeaddrinfo(res);
6243 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006244}
6245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006246PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006247"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006248\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006249Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006250
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006251
6252/* Python API to getting and setting the default timeout value. */
6253
6254static PyObject *
6255socket_getdefaulttimeout(PyObject *self)
6256{
Victor Stinner71694d52015-03-28 01:18:54 +01006257 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006258 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 }
Victor Stinner71694d52015-03-28 01:18:54 +01006260 else {
6261 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6262 return PyFloat_FromDouble(seconds);
6263 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006264}
6265
6266PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006267"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006268\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006269Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006270A value of None indicates that new socket objects have no timeout.\n\
6271When the socket module is first imported, the default is None.");
6272
6273static PyObject *
6274socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6275{
Victor Stinner71694d52015-03-28 01:18:54 +01006276 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006277
Victor Stinner71694d52015-03-28 01:18:54 +01006278 if (socket_parse_timeout(&timeout, arg) < 0)
6279 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006282
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006283 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006284}
6285
6286PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006287"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006288\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006289Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006290A value of None indicates that new socket objects have no timeout.\n\
6291When the socket module is first imported, the default is None.");
6292
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006293#ifdef HAVE_IF_NAMEINDEX
6294/* Python API for getting interface indices and names */
6295
6296static PyObject *
6297socket_if_nameindex(PyObject *self, PyObject *arg)
6298{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006299 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006300 int i;
6301 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006302
Charles-François Natali60713592011-05-20 16:55:06 +02006303 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006304 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006305 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006306 return NULL;
6307 }
6308
6309 list = PyList_New(0);
6310 if (list == NULL) {
6311 if_freenameindex(ni);
6312 return NULL;
6313 }
6314
Charles-François Natali60713592011-05-20 16:55:06 +02006315 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6316 PyObject *ni_tuple = Py_BuildValue("IO&",
6317 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006318
6319 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6320 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006321 Py_DECREF(list);
6322 if_freenameindex(ni);
6323 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006324 }
6325 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006326 }
6327
6328 if_freenameindex(ni);
6329 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006330}
6331
6332PyDoc_STRVAR(if_nameindex_doc,
6333"if_nameindex()\n\
6334\n\
6335Returns a list of network interface information (index, name) tuples.");
6336
Charles-François Natali60713592011-05-20 16:55:06 +02006337static PyObject *
6338socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006339{
Charles-François Natali60713592011-05-20 16:55:06 +02006340 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006341 unsigned long index;
6342
Charles-François Natali60713592011-05-20 16:55:06 +02006343 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6344 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006345 return NULL;
6346
Charles-François Natali60713592011-05-20 16:55:06 +02006347 index = if_nametoindex(PyBytes_AS_STRING(oname));
6348 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006349 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006350 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006351 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006352 return NULL;
6353 }
6354
6355 return PyLong_FromUnsignedLong(index);
6356}
6357
6358PyDoc_STRVAR(if_nametoindex_doc,
6359"if_nametoindex(if_name)\n\
6360\n\
6361Returns the interface index corresponding to the interface name if_name.");
6362
Charles-François Natali60713592011-05-20 16:55:06 +02006363static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006364socket_if_indextoname(PyObject *self, PyObject *arg)
6365{
Charles-François Natali60713592011-05-20 16:55:06 +02006366 unsigned long index;
6367 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006368
Charles-François Natali60713592011-05-20 16:55:06 +02006369 index = PyLong_AsUnsignedLong(arg);
6370 if (index == (unsigned long) -1)
6371 return NULL;
6372
6373 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006374 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006375 return NULL;
6376 }
6377
Charles-François Natali60713592011-05-20 16:55:06 +02006378 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006379}
6380
6381PyDoc_STRVAR(if_indextoname_doc,
6382"if_indextoname(if_index)\n\
6383\n\
6384Returns the interface name corresponding to the interface index if_index.");
6385
6386#endif /* HAVE_IF_NAMEINDEX */
6387
6388
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006389#ifdef CMSG_LEN
6390/* Python interface to CMSG_LEN(length). */
6391
6392static PyObject *
6393socket_CMSG_LEN(PyObject *self, PyObject *args)
6394{
6395 Py_ssize_t length;
6396 size_t result;
6397
6398 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6399 return NULL;
6400 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6401 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6402 return NULL;
6403 }
6404 return PyLong_FromSize_t(result);
6405}
6406
6407PyDoc_STRVAR(CMSG_LEN_doc,
6408"CMSG_LEN(length) -> control message length\n\
6409\n\
6410Return the total length, without trailing padding, of an ancillary\n\
6411data item with associated data of the given length. This value can\n\
6412often be used as the buffer size for recvmsg() to receive a single\n\
6413item of ancillary data, but RFC 3542 requires portable applications to\n\
6414use CMSG_SPACE() and thus include space for padding, even when the\n\
6415item will be the last in the buffer. Raises OverflowError if length\n\
6416is outside the permissible range of values.");
6417
6418
6419#ifdef CMSG_SPACE
6420/* Python interface to CMSG_SPACE(length). */
6421
6422static PyObject *
6423socket_CMSG_SPACE(PyObject *self, PyObject *args)
6424{
6425 Py_ssize_t length;
6426 size_t result;
6427
6428 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6429 return NULL;
6430 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6431 PyErr_SetString(PyExc_OverflowError,
6432 "CMSG_SPACE() argument out of range");
6433 return NULL;
6434 }
6435 return PyLong_FromSize_t(result);
6436}
6437
6438PyDoc_STRVAR(CMSG_SPACE_doc,
6439"CMSG_SPACE(length) -> buffer size\n\
6440\n\
6441Return the buffer size needed for recvmsg() to receive an ancillary\n\
6442data item with associated data of the given length, along with any\n\
6443trailing padding. The buffer space needed to receive multiple items\n\
6444is the sum of the CMSG_SPACE() values for their associated data\n\
6445lengths. Raises OverflowError if length is outside the permissible\n\
6446range of values.");
6447#endif /* CMSG_SPACE */
6448#endif /* CMSG_LEN */
6449
6450
Guido van Rossum30a685f1991-06-27 15:51:29 +00006451/* List of functions exported by this module. */
6452
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006453static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 {"gethostbyname", socket_gethostbyname,
6455 METH_VARARGS, gethostbyname_doc},
6456 {"gethostbyname_ex", socket_gethostbyname_ex,
6457 METH_VARARGS, ghbn_ex_doc},
6458 {"gethostbyaddr", socket_gethostbyaddr,
6459 METH_VARARGS, gethostbyaddr_doc},
6460 {"gethostname", socket_gethostname,
6461 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006462#ifdef HAVE_SETHOSTNAME
6463 {"sethostname", socket_sethostname,
6464 METH_VARARGS, sethostname_doc},
6465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 {"getservbyname", socket_getservbyname,
6467 METH_VARARGS, getservbyname_doc},
6468 {"getservbyport", socket_getservbyport,
6469 METH_VARARGS, getservbyport_doc},
6470 {"getprotobyname", socket_getprotobyname,
6471 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006472 {"close", socket_close,
6473 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006474#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 {"dup", socket_dup,
6476 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006477#endif
Dave Cole331708b2004-08-09 04:51:41 +00006478#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 {"socketpair", socket_socketpair,
6480 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 {"ntohs", socket_ntohs,
6483 METH_VARARGS, ntohs_doc},
6484 {"ntohl", socket_ntohl,
6485 METH_O, ntohl_doc},
6486 {"htons", socket_htons,
6487 METH_VARARGS, htons_doc},
6488 {"htonl", socket_htonl,
6489 METH_O, htonl_doc},
6490 {"inet_aton", socket_inet_aton,
6491 METH_VARARGS, inet_aton_doc},
6492 {"inet_ntoa", socket_inet_ntoa,
6493 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006494#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 {"inet_pton", socket_inet_pton,
6496 METH_VARARGS, inet_pton_doc},
6497 {"inet_ntop", socket_inet_ntop,
6498 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006499#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006500 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6501 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 {"getnameinfo", socket_getnameinfo,
6503 METH_VARARGS, getnameinfo_doc},
6504 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6505 METH_NOARGS, getdefaulttimeout_doc},
6506 {"setdefaulttimeout", socket_setdefaulttimeout,
6507 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006508#ifdef HAVE_IF_NAMEINDEX
6509 {"if_nameindex", socket_if_nameindex,
6510 METH_NOARGS, if_nameindex_doc},
6511 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006512 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006513 {"if_indextoname", socket_if_indextoname,
6514 METH_O, if_indextoname_doc},
6515#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006516#ifdef CMSG_LEN
6517 {"CMSG_LEN", socket_CMSG_LEN,
6518 METH_VARARGS, CMSG_LEN_doc},
6519#ifdef CMSG_SPACE
6520 {"CMSG_SPACE", socket_CMSG_SPACE,
6521 METH_VARARGS, CMSG_SPACE_doc},
6522#endif
6523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006525};
6526
Guido van Rossum30a685f1991-06-27 15:51:29 +00006527
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006528#ifdef MS_WINDOWS
6529#define OS_INIT_DEFINED
6530
6531/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006532
6533static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006534os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006537}
6538
6539static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006540os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542 WSADATA WSAData;
6543 int ret;
6544 ret = WSAStartup(0x0101, &WSAData);
6545 switch (ret) {
6546 case 0: /* No error */
6547 Py_AtExit(os_cleanup);
6548 return 1; /* Success */
6549 case WSASYSNOTREADY:
6550 PyErr_SetString(PyExc_ImportError,
6551 "WSAStartup failed: network not ready");
6552 break;
6553 case WSAVERNOTSUPPORTED:
6554 case WSAEINVAL:
6555 PyErr_SetString(
6556 PyExc_ImportError,
6557 "WSAStartup failed: requested version not supported");
6558 break;
6559 default:
6560 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6561 break;
6562 }
6563 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006564}
6565
Guido van Rossum8d665e61996-06-26 18:22:49 +00006566#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006567
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006568
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006569
6570#ifndef OS_INIT_DEFINED
6571static int
6572os_init(void)
6573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006575}
6576#endif
6577
6578
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006579/* C API table - always add new things to the end for binary
6580 compatibility. */
6581static
6582PySocketModule_APIObject PySocketModuleAPI =
6583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006585 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006587};
6588
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006589
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006590/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006591
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006592 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006593 "socket.py" which implements some additional functionality.
6594 The import of "_socket" may fail with an ImportError exception if
6595 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006596 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006597 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006598*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006600PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006601"Implementation module for socket operations.\n\
6602\n\
6603See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006604
Martin v. Löwis1a214512008-06-11 05:26:20 +00006605static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 PyModuleDef_HEAD_INIT,
6607 PySocket_MODULE_NAME,
6608 socket_doc,
6609 -1,
6610 socket_methods,
6611 NULL,
6612 NULL,
6613 NULL,
6614 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006615};
6616
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006617PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006618PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 if (!os_init())
6623 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006624
Victor Stinnerdaf45552013-08-28 00:53:59 +02006625#ifdef MS_WINDOWS
6626 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006627 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006628 }
6629#endif
6630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631 Py_TYPE(&sock_type) = &PyType_Type;
6632 m = PyModule_Create(&socketmodule);
6633 if (m == NULL)
6634 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006635
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006636 Py_INCREF(PyExc_OSError);
6637 PySocketModuleAPI.error = PyExc_OSError;
6638 Py_INCREF(PyExc_OSError);
6639 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006641 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642 if (socket_herror == NULL)
6643 return NULL;
6644 Py_INCREF(socket_herror);
6645 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006646 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 NULL);
6648 if (socket_gaierror == NULL)
6649 return NULL;
6650 Py_INCREF(socket_gaierror);
6651 PyModule_AddObject(m, "gaierror", socket_gaierror);
6652 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006653 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654 if (socket_timeout == NULL)
6655 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006656 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 Py_INCREF(socket_timeout);
6658 PyModule_AddObject(m, "timeout", socket_timeout);
6659 Py_INCREF((PyObject *)&sock_type);
6660 if (PyModule_AddObject(m, "SocketType",
6661 (PyObject *)&sock_type) != 0)
6662 return NULL;
6663 Py_INCREF((PyObject *)&sock_type);
6664 if (PyModule_AddObject(m, "socket",
6665 (PyObject *)&sock_type) != 0)
6666 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006667
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006668#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006670#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 Py_INCREF(has_ipv6);
6674 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 /* Export C API */
6677 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6678 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6679 ) != 0)
6680 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006683#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006685#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006687#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006689#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006690#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006693#endif
6694#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006696#endif
6697#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006700#endif
6701#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006704#endif
6705#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006708#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006709#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006712#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006713#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006716#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006717#ifdef HAVE_SOCKADDR_ALG
6718 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6719#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006720#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006723#endif
6724#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006726#endif
6727#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006730#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006731#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006734#endif
6735#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006738#endif
6739#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006740 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006742#endif
6743#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006746#endif
6747#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, AF_NETLINK);
6750 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006751#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006753#endif
6754#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006756#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6758 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006759#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006761#endif
6762#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006764#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006765#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006767#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006768#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006770#endif
6771#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006773#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006775#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006777#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006778#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006780#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006781#ifdef NETLINK_CRYPTO
6782 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6783#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006784#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006785
6786#ifdef AF_VSOCK
6787 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6788 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6789 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6790 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6791 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6792 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6793 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6794 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6795 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6796#endif
6797
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006798#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006801#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006802#ifdef AF_LINK
6803 PyModule_AddIntMacro(m, AF_LINK);
6804#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006805#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006808#endif
6809#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006812#endif
6813#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006816#endif
6817#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006820#endif
6821#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006824#endif
6825#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006828#endif
6829#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006832#endif
6833#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006834 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006836#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006837
Hye-Shik Chang81268602004-02-02 06:05:24 +00006838#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6840 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6841 PyModule_AddIntMacro(m, BTPROTO_HCI);
6842 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006843#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006845#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006846#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006847#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006849#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6851 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006852#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6855 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006856#endif
6857
Charles-François Natali47413c12011-10-06 19:47:44 +02006858#ifdef AF_CAN
6859 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006861#endif
6862#ifdef PF_CAN
6863 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006865#endif
6866
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006867/* Reliable Datagram Sockets */
6868#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006870#endif
6871#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006873#endif
6874
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006875/* Kernel event messages */
6876#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006878#endif
6879#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006881#endif
6882
Antoine Pitroub156a462010-10-27 20:13:57 +00006883#ifdef AF_PACKET
6884 PyModule_AddIntMacro(m, AF_PACKET);
6885#endif
6886#ifdef PF_PACKET
6887 PyModule_AddIntMacro(m, PF_PACKET);
6888#endif
6889#ifdef PACKET_HOST
6890 PyModule_AddIntMacro(m, PACKET_HOST);
6891#endif
6892#ifdef PACKET_BROADCAST
6893 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6894#endif
6895#ifdef PACKET_MULTICAST
6896 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6897#endif
6898#ifdef PACKET_OTHERHOST
6899 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6900#endif
6901#ifdef PACKET_OUTGOING
6902 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6903#endif
6904#ifdef PACKET_LOOPBACK
6905 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6906#endif
6907#ifdef PACKET_FASTROUTE
6908 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006909#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006910
Christian Heimes043d6f62008-01-07 17:19:16 +00006911#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006914 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6916 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6917 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006918
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6920 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6921 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, SOL_TIPC);
6925 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6926 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6927 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6928 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006929
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6931 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6932 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6933 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6937 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006938#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006941#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6943 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6944 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6945 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6946 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6947 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006948#endif
6949
Christian Heimesdffa3942016-09-05 23:54:41 +02006950#ifdef HAVE_SOCKADDR_ALG
6951 /* Socket options */
6952 PyModule_AddIntMacro(m, ALG_SET_KEY);
6953 PyModule_AddIntMacro(m, ALG_SET_IV);
6954 PyModule_AddIntMacro(m, ALG_SET_OP);
6955 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6956 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6957 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6958
6959 /* Operations */
6960 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6961 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6962 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6963 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6964#endif
6965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SOCK_STREAM);
6968 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006969/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006970#ifdef SOCK_RAW
6971 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006973#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006975#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006977#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006978#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006980#endif
6981#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006983#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006988#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006991#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006993#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006994#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006996#endif
6997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007004#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007007#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007014 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007015#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007016#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007019#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007045#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007047#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007048#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007050#endif
7051#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007053#endif
7054#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007056#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007057#ifdef SO_PASSSEC
7058 PyModule_AddIntMacro(m, SO_PASSSEC);
7059#endif
7060#ifdef SO_PEERSEC
7061 PyModule_AddIntMacro(m, SO_PEERSEC);
7062#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007063#ifdef SO_BINDTODEVICE
7064 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7065#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007066#ifdef SO_PRIORITY
7067 PyModule_AddIntMacro(m, SO_PRIORITY);
7068#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007069#ifdef SO_MARK
7070 PyModule_AddIntMacro(m, SO_MARK);
7071#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007072#ifdef SO_DOMAIN
7073 PyModule_AddIntMacro(m, SO_DOMAIN);
7074#endif
7075#ifdef SO_PROTOCOL
7076 PyModule_AddIntMacro(m, SO_PROTOCOL);
7077#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079 /* Maximum number of connections for "listen" */
7080#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007082#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007084#endif
7085
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007086 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007087#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007089#endif
7090#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007092#endif
7093#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007094 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007095#endif
7096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097 /* Flags for send, recv */
7098#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007127#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007128#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007130#endif
7131#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007133#endif
7134#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007136#endif
7137#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007139#endif
7140#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007142#endif
7143#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007145#endif
7146#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007148#endif
7149#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007151#endif
7152#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007154#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007155#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007157#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159 /* Protocol level and numbers, usable for [gs]etsockopt */
7160#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007165#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007190#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007192#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007193#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007195#endif
7196#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7198 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007199#endif
7200#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7202 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7203 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007204
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7206 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7207 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007208#ifdef CAN_ISOTP
7209 PyModule_AddIntMacro(m, CAN_ISOTP);
7210#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007211#endif
7212#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7214 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7215 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7216 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007217#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007218#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7219 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7220#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007221#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007223 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7224 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7225 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7226 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7227 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7228 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7229 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7230 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7231 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7232 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7233 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7234 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7235#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007236#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007238#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007239#ifdef HAVE_SOCKADDR_ALG
7240 PyModule_AddIntMacro(m, SOL_ALG);
7241#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007242#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007244#endif
7245#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007247#endif
7248#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007250#endif
7251#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007253#endif
7254#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007256#endif
7257#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007262#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007270#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007290#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007301#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007319#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007325#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007356 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007358#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007359 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007360#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007361#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#endif
7367/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007370#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007375#endif
7376
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007377#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007379#endif
7380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381 /* Some port configuration */
7382#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007384#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007385 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
7392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393 /* Some reserved IP v.4 addresses */
7394#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007396#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007401#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007406#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007411#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414#ifdef INADDR_ALLHOSTS_GROUP
7415 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7416 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007417#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007422#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007427#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007429#endif
7430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431 /* IPv4 [gs]etsockopt options */
7432#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007441#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007456#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007459#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007462#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007465#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007474#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007477#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007479#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007480#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007482#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7485#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007504#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007508#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007510#endif
7511#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007513#endif
7514#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007516#endif
7517#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007519#endif
7520#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007522#endif
7523#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007525#endif
7526#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007528#endif
7529#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007531#endif
7532#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007534#endif
7535#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007537#endif
7538#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007540#endif
7541#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007543#endif
7544#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007546#endif
7547#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007549#endif
7550#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007552#endif
7553#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007555#endif
7556#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007558#endif
7559#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007561#endif
7562#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007564#endif
7565#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007567#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569 /* TCP options */
7570#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007605#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007606#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007608#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007609#ifdef TCP_CONGESTION
7610 PyModule_AddIntMacro(m, TCP_CONGESTION);
7611#endif
7612#ifdef TCP_USER_TIMEOUT
7613 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7614#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007615#ifdef TCP_NOTSENT_LOWAT
7616 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7617#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619 /* IPX options */
7620#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007622#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007623
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007624/* Reliable Datagram Sockets */
7625#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007627#endif
7628#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007630#endif
7631#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007633#endif
7634#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007636#endif
7637#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007639#endif
7640#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007642#endif
7643#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007645#endif
7646#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007648#endif
7649#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007651#endif
7652#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007654#endif
7655#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007657#endif
7658#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007660#endif
7661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007663#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007665#endif
7666#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007668#endif
7669#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007671#endif
7672#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007674#endif
7675#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007677#endif
7678#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007680#endif
7681#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007683#endif
7684#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007686#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007687#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007689#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007690#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007692#endif
7693#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007695#endif
7696#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007698#endif
7699#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007701#endif
7702#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007704#endif
7705#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007707#endif
7708#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007710#endif
7711#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007713#endif
7714#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007716#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007717#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007719#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007720#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007722#endif
7723#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007725#endif
7726#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007728#endif
7729#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007731#endif
7732#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007734#endif
7735#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007737#endif
7738#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007740#endif
7741#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007743#endif
7744#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007746#endif
7747#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007749#endif
7750#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007751 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007752#endif
7753#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007755#endif
7756#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007757 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007758#endif
7759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007760 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007761#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007763#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007764 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007765#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007767#endif
7768#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007769 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007770#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007771 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007772#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007773 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007774#endif
7775#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007777#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007778 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007779#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007780 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007781#endif
7782
Christian Heimesfaf2f632008-01-06 16:59:19 +00007783#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007784 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007785 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7786#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007787 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007788#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007789 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007790 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7791#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007792 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007793#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007794 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007795 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007796 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007797 PyObject *tmp;
7798 tmp = PyLong_FromUnsignedLong(codes[i]);
7799 if (tmp == NULL)
7800 return NULL;
7801 PyModule_AddObject(m, names[i], tmp);
7802 }
7803 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, RCVALL_OFF);
7805 PyModule_AddIntMacro(m, RCVALL_ON);
7806 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007807#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007809#endif
7810#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007812#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007813#endif /* _MSTCPIP_ */
7814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007815 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007816#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007820}