blob: a47f0314605c2d11d64cc8c33b6939ec73d4b068 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Bjorn Anderssonbb816512018-09-26 06:47:52 -070010 portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are
11 supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Bjorn Anderssonbb816512018-09-26 06:47:52 -070058- an AF_QIPCRTR socket address is a (node, port) tuple where the
59 node and port are non-negative integers.
Christian Heimes043d6f62008-01-07 17:19:16 +000060- an AF_TIPC socket address is expressed as
61 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000063 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000065 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if addr_type is TIPC_ADDR_NAME:
67 v1 is the server type
68 v2 is the port identifier
69 v3 is ignored
70 if addr_type is TIPC_ADDR_NAMESEQ:
71 v1 is the server type
72 v2 is the lower port number
73 v3 is the upper port number
74 if addr_type is TIPC_ADDR_ID:
75 v1 is the node
76 v2 is the ref
77 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000078
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000082- names starting with sock_ are socket object methods
83- names starting with socket_ are module-level functions
84- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Thomas Wouters477c8d52006-05-27 19:21:47 +000088#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110089#include <AvailabilityMacros.h>
90/* for getaddrinfo thread safety test on old versions of OS X */
91#ifndef MAC_OS_X_VERSION_10_5
92#define MAC_OS_X_VERSION_10_5 1050
93#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 /*
95 * inet_aton is not available on OSX 10.3, yet we want to use a binary
96 * that was build on 10.4 or later to work on that release, weak linking
97 * comes to the rescue.
98 */
99# pragma weak inet_aton
100#endif
101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000103#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000105/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100107"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
108socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109\n\
110Open a socket of the given type. The family argument specifies the\n\
111address family; it defaults to AF_INET. The type argument specifies\n\
112whether this is a stream (SOCK_STREAM, this is the default)\n\
113or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
114specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200115The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000116\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100117When a fileno is passed in, family, type and proto are auto-detected,\n\
118unless they are explicitly set.\n\
119\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000120A socket object represents one endpoint of a network connection.\n\
121\n\
122Methods of socket objects (keyword arguments not allowed):\n\
123\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000124_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125bind(addr) -- bind the socket to a local address\n\
126close() -- close the socket\n\
127connect(addr) -- connect the socket to a remote address\n\
128connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200129dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130fileno() -- return underlying file descriptor\n\
131getpeername() -- return remote address [*]\n\
132getsockname() -- return local address\n\
133getsockopt(level, optname[, buflen]) -- get socket options\n\
134gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100135listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000136recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000137recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000138recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000139recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000140 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141sendall(data[, flags]) -- send all data\n\
142send(data[, flags]) -- send data, may not send all of it\n\
143sendto(data[, flags], addr) -- send data to a given address\n\
144setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500145getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200146setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000147settimeout(None | float) -- set or clear the timeout\n\
148shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700149if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700150if_nametoindex(name) -- return the corresponding interface index\n\
151if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000152\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000153 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000154
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000155/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000156 I hope some day someone can clean this up please... */
157
Guido van Rossum9376b741999-09-15 22:01:40 +0000158/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
159 script doesn't get this right, so we hardcode some platform checks below.
160 On the other hand, not all Linux versions agree, so there the settings
161 computed by the configure script are needed! */
162
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700163#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164# undef HAVE_GETHOSTBYNAME_R_3_ARG
165# undef HAVE_GETHOSTBYNAME_R_5_ARG
166# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000167#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000168
Victor Stinner710d27e2011-08-23 10:57:32 +0200169#if defined(__OpenBSD__)
170# include <sys/uio.h>
171#endif
172
Stefan Krah1f9eb872016-05-22 17:35:34 +0200173#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000175#endif
176
Guido van Rossume7de2061999-03-24 17:24:33 +0000177#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000178# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define HAVE_GETHOSTBYNAME_R_3_ARG
180# elif defined(__sun) || defined(__sgi)
181# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700182# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000183/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000184# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
185# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000186# else
187# undef HAVE_GETHOSTBYNAME_R
188# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000189#endif
190
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200191#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000192# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000193#endif
194
Ned Deilye1d4e582016-02-23 22:05:29 +1100195/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000196#ifdef HAVE_SYS_PARAM_H
197#include <sys/param.h>
198#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000199/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100200 (this includes the getaddrinfo emulation) protect access with a lock.
201
202 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
203 a mix of code including an unsafe implementation from an old BSD's
204 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
205 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100207
Ned Deilye1d4e582016-02-23 22:05:29 +1100208 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
209 http://www.openbsd.org/plus54.html
210
211 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
212
213http://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 +1100214 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200215#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100216 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000217 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100218 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
219 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100220 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000221#define USE_GETADDRINFO_LOCK
222#endif
223
224#ifdef USE_GETADDRINFO_LOCK
225#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
226#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
227#else
228#define ACQUIRE_GETADDRINFO_LOCK
229#define RELEASE_GETADDRINFO_LOCK
230#endif
231
232#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000234#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000235
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000236
Serhiy Storchakad3187152017-11-09 18:00:38 +0200237#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100238# include <sys/ioctl.h>
239#endif
240
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243/* make sure that the reentrant (gethostbyaddr_r etc)
244 functions are declared correctly if compiling with
245 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000249#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000252#undef _XOPEN_SOURCE
253#include <sys/socket.h>
254#include <sys/types.h>
255#include <netinet/in.h>
256#ifdef _SS_ALIGNSIZE
257#define HAVE_GETADDRINFO 1
258#define HAVE_GETNAMEINFO 1
259#endif
260
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000261#define HAVE_INET_PTON
262#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000263#endif
264
Benjamin Peterson06930632017-09-04 16:36:05 -0700265/* Solaris fails to define this variable at all. */
266#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000267#define INET_ADDRSTRLEN 16
268#endif
269
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700275#ifdef HAVE_SYS_SOCKET_H
276#include <sys/socket.h>
277#endif
278
279#ifdef HAVE_NET_IF_H
280#include <net/if.h>
281#endif
282
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000283/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000285#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286
287/* Addressing includes */
288
Guido van Rossum6f489d91996-06-28 20:15:15 +0000289#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Non-MS WINDOWS includes */
292# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000293# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000294
Guido van Rossum9376b741999-09-15 22:01:40 +0000295/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000297
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000300#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000303# ifdef HAVE_FCNTL_H
304# include <fcntl.h>
305# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Steve Dower65e4cb12014-11-22 12:54:57 -0800307/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200308#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800309
animalize19e7d482018-02-27 02:10:36 +0800310/* remove some flags on older version Windows during run-time.
311 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
312typedef struct {
313 DWORD build_number; /* available starting with this Win10 BuildNumber */
314 const char flag_name[20];
315} FlagRuntimeInfo;
316
317/* IMPORTANT: make sure the list ordered by descending build_number */
318static FlagRuntimeInfo win_runtime_flags[] = {
319 /* available starting with Windows 10 1709 */
320 {16299, "TCP_KEEPIDLE"},
321 {16299, "TCP_KEEPINTVL"},
322 /* available starting with Windows 10 1703 */
323 {15063, "TCP_KEEPCNT"},
324 /* available starting with Windows 10 1607 */
325 {14393, "TCP_FASTOPEN"}
326};
327
328static void
329remove_unusable_flags(PyObject *m)
330{
331 PyObject *dict;
332 OSVERSIONINFOEX info;
333 DWORDLONG dwlConditionMask;
334
335 dict = PyModule_GetDict(m);
336 if (dict == NULL) {
337 return;
338 }
339
340 /* set to Windows 10, except BuildNumber. */
341 memset(&info, 0, sizeof(info));
342 info.dwOSVersionInfoSize = sizeof(info);
343 info.dwMajorVersion = 10;
344 info.dwMinorVersion = 0;
345
346 /* set Condition Mask */
347 dwlConditionMask = 0;
348 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
349 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
350 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
351
352 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
353 info.dwBuildNumber = win_runtime_flags[i].build_number;
354 /* greater than or equal to the specified version?
355 Compatibility Mode will not cheat VerifyVersionInfo(...) */
356 if (VerifyVersionInfo(
357 &info,
358 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
359 dwlConditionMask)) {
360 break;
361 }
362 else {
363 if (PyDict_GetItemString(
364 dict,
365 win_runtime_flags[i].flag_name) != NULL) {
366 PyDict_DelItemString(
367 dict,
368 win_runtime_flags[i].flag_name);
369 }
370 }
371 }
372}
373
Jeremy Hylton22308652001-02-02 03:23:09 +0000374#endif
375
Skip Montanaro7befb992004-02-10 16:50:21 +0000376#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000377
Neal Norwitz39d22e52002-11-02 19:55:21 +0000378#ifndef O_NONBLOCK
379# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380#endif
381
Trent Micka708d6e2004-09-07 17:48:26 +0000382/* include Python's addrinfo.h unless it causes trouble */
383#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
384 /* Do not include addinfo.h on some newer IRIX versions.
385 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
386 * for example, but not by 6.5.10.
387 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000389 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
390 * EAI_* constants are defined in (the already included) ws2tcpip.h.
391 */
392#else
393# include "addrinfo.h"
394#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000395
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000396#ifdef __APPLE__
397/* On OS X, getaddrinfo returns no error indication of lookup
398 failure, so we must use the emulation instead of the libinfo
399 implementation. Unfortunately, performing an autoconf test
400 for this bug would require DNS access for the machine performing
401 the configuration, which is not acceptable. Therefore, we
402 determine the bug just by checking for __APPLE__. If this bug
403 gets ever fixed, perhaps checking for sys/version.h would be
404 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000405#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600406/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000407 Find to check for Jaguar is that it has getnameinfo(), which
408 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000409#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000410#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000411
412#ifdef HAVE_INET_ATON
413#define USE_INET_ATON_WEAKLINK
414#endif
415
Jack Jansen84262fb2002-07-02 14:40:42 +0000416#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000418/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000419#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000420/* avoid clashes with the C library definition of the symbol. */
421#define getaddrinfo fake_getaddrinfo
422#define gai_strerror fake_gai_strerror
423#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000424#include "getaddrinfo.c"
425#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000426#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000427#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000428#include "getnameinfo.c"
429#endif
430
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000431#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000432#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000433#endif
434
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000436#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000437#define EAFNOSUPPORT WSAEAFNOSUPPORT
438#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000439#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000440
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000441#ifndef SOCKETCLOSE
442#define SOCKETCLOSE close
443#endif
444
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000445#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000446#define USE_BLUETOOTH 1
447#if defined(__FreeBSD__)
448#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
449#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000450#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000451#define SOL_HCI SOL_HCI_RAW
452#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000453#define sockaddr_l2 sockaddr_l2cap
454#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000455#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000456#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
457#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000458#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000459#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460#define sockaddr_l2 sockaddr_bt
461#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000462#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000464#define SOL_HCI BTPROTO_HCI
465#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
467#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000468#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000469#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000470#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000471#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
472#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000473#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000474#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
475#endif
476#endif
477
Charles-François Natali8b759652011-12-23 16:44:51 +0100478/* Convert "sock_addr_t *" to "struct sockaddr *". */
479#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480
Martin v. Löwise9416172003-05-03 10:12:45 +0000481/*
482 * Constants for getnameinfo()
483 */
484#if !defined(NI_MAXHOST)
485#define NI_MAXHOST 1025
486#endif
487#if !defined(NI_MAXSERV)
488#define NI_MAXSERV 32
489#endif
490
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000491#ifndef INVALID_SOCKET /* MS defines this */
492#define INVALID_SOCKET (-1)
493#endif
494
Charles-François Natali0cc86852013-09-13 19:53:08 +0200495#ifndef INADDR_NONE
496#define INADDR_NONE (-1)
497#endif
498
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000499/* XXX There's a problem here: *static* functions are not supposed to have
500 a Py prefix (or use CapitalizedWords). Later... */
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* Global variable holding the exception type for errors detected
503 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000504static PyObject *socket_herror;
505static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000506static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Tim Peters643a7fc2002-02-17 04:13:21 +0000508/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509 The sock_type variable contains pointers to various functions,
510 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000511 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000512static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000513
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514#if defined(HAVE_POLL_H)
515#include <poll.h>
516#elif defined(HAVE_SYS_POLL_H)
517#include <sys/poll.h>
518#endif
519
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000520/* Largest value to try to store in a socklen_t (used when handling
521 ancillary data). POSIX requires socklen_t to hold at least
522 (2**31)-1 and recommends against storing larger values, but
523 socklen_t was originally int in the BSD interface, so to be on the
524 safe side we use the smaller of (2**31)-1 and INT_MAX. */
525#if INT_MAX > 0x7fffffff
526#define SOCKLEN_T_LIMIT 0x7fffffff
527#else
528#define SOCKLEN_T_LIMIT INT_MAX
529#endif
530
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200531#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000532/* Instead of select(), we'll use poll() since poll() works on any fd. */
533#define IS_SELECTABLE(s) 1
534/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000535#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200536/* If there's no timeout left, we don't have to call select, so it's a safe,
537 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100538#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000539#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000540
541static PyObject*
542select_error(void)
543{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200544 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000546}
547
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000548#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000549#ifndef WSAEAGAIN
550#define WSAEAGAIN WSAEWOULDBLOCK
551#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000552#define CHECK_ERRNO(expected) \
553 (WSAGetLastError() == WSA ## expected)
554#else
555#define CHECK_ERRNO(expected) \
556 (errno == expected)
557#endif
558
Victor Stinnerdaf45552013-08-28 00:53:59 +0200559#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200560# define GET_SOCK_ERROR WSAGetLastError()
561# define SET_SOCK_ERROR(err) WSASetLastError(err)
562# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
563# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
564#else
565# define GET_SOCK_ERROR errno
566# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
567# define SOCK_TIMEOUT_ERR EWOULDBLOCK
568# define SOCK_INPROGRESS_ERR EINPROGRESS
569#endif
570
Erik Janssens874809e2018-09-05 08:29:42 +0200571#ifdef _MSC_VER
572# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
573#else
574# define SUPPRESS_DEPRECATED_CALL
575#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200576
577#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200578/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
579static int support_wsa_no_inherit = -1;
580#endif
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582/* Convenience function to raise an error according to errno
583 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000584
Guido van Rossum73624e91994-10-10 17:59:00 +0000585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000586set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000588#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 int err_no = WSAGetLastError();
590 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
591 recognizes the error codes used by both GetLastError() and
592 WSAGetLastError */
593 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200594 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000595#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000596
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200597 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598}
599
Guido van Rossum30a685f1991-06-27 15:51:29 +0000600
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000601static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000602set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605
606#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000608#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (v != NULL) {
612 PyErr_SetObject(socket_herror, v);
613 Py_DECREF(v);
614 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617}
618
619
620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000621set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624
Martin v. Löwis272cb402002-03-01 08:31:07 +0000625#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* EAI_SYSTEM is not available on Windows XP. */
627 if (error == EAI_SYSTEM)
628 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000629#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000631#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 if (v != NULL) {
637 PyErr_SetObject(socket_gaierror, v);
638 Py_DECREF(v);
639 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642}
643
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000644/* Function to perform the setting of socket blocking mode
645 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646static int
647internal_setblocking(PySocketSockObject *s, int block)
648{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400649 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200650#ifdef MS_WINDOWS
651 u_long arg;
652#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100653#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100654 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100655 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000659#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100660#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200662 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400663 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100664#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200666 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400667 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100669 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 else
Victor Stinner9a954832013-12-04 00:41:24 +0100671 new_delay_flag = delay_flag | O_NONBLOCK;
672 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200673 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400674 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100675#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000676#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200677 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200678 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400679 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400681
682 result = 0;
683
684 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686
Yury Selivanovfa22b292016-10-18 16:03:52 -0400687 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200688#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200690#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200692#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400693 }
694
695 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000696}
697
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000698static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200699internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
700 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100703#ifdef HAVE_POLL
704 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200705 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100706#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200707 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200708 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100709#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000710
Victor Stinnerb7df3142015-03-27 22:59:32 +0100711 /* must be called with the GIL held */
712 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100713
Victor Stinner416f2e62015-03-31 13:56:29 +0200714 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200715 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200718 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* Prefer poll, if available, since you can poll() any fd
722 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000723#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100724 pollfd.fd = s->sock_fd;
725 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200726 if (connect) {
727 /* On Windows, the socket becomes writable on connection success,
728 but a connection failure is notified as an error. On POSIX, the
729 socket becomes writable on connection success or on connection
730 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200731 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000733
Victor Stinner71694d52015-03-28 01:18:54 +0100734 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200735 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200736 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000737
Victor Stinner71694d52015-03-28 01:18:54 +0100738 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200739 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100740 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000741#else
Victor Stinnerced11742015-04-09 10:27:25 +0200742 if (interval >= 0) {
743 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
744 tvp = &tv;
745 }
746 else
747 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000748
Victor Stinner71694d52015-03-28 01:18:54 +0100749 FD_ZERO(&fds);
750 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200751 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200752 if (connect) {
753 /* On Windows, the socket becomes writable on connection success,
754 but a connection failure is notified as an error. On POSIX, the
755 socket becomes writable on connection success or on connection
756 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200757 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 }
Victor Stinner71694d52015-03-28 01:18:54 +0100759
760 /* See if the socket is ready */
761 Py_BEGIN_ALLOW_THREADS;
762 if (writing)
763 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200764 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100765 else
766 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200767 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100768 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000769#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 if (n < 0)
772 return -1;
773 if (n == 0)
774 return 1;
775 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000776}
777
Victor Stinner31bf2d52015-04-01 21:57:09 +0200778/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000779
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 On error, raise an exception and return -1 if err is set, or fill err and
781 return -1 otherwise. If a signal was received and the signal handler raised
782 an exception, return -1, and set err to -1 if err is set.
783
784 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100785
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786 If the socket has a timeout, wait until the socket is ready before calling
787 the function: wait until the socket is writable if writing is nonzero, wait
788 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100789
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200791 the function, except if the signal handler raised an exception (PEP 475).
792
793 When the function is retried, recompute the timeout using a monotonic clock.
794
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 sock_call_ex() must be called with the GIL held. The socket function is
796 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200797static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200798sock_call_ex(PySocketSockObject *s,
799 int writing,
800 int (*sock_func) (PySocketSockObject *s, void *data),
801 void *data,
802 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200803 int *err,
804 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805{
Victor Stinner8912d142015-04-06 23:16:34 +0200806 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 _PyTime_t deadline = 0;
808 int deadline_initialized = 0;
809 int res;
810
811 /* sock_call() must be called with the GIL held. */
812 assert(PyGILState_Check());
813
814 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200816 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 /* For connect(), poll even for blocking socket. The connection
818 runs asynchronously. */
819 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200821 _PyTime_t interval;
822
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 if (deadline_initialized) {
824 /* recompute the timeout */
825 interval = deadline - _PyTime_GetMonotonicClock();
826 }
827 else {
828 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200829 deadline = _PyTime_GetMonotonicClock() + timeout;
830 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200831 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200832
Victor Stinner10550cd2015-04-03 13:22:27 +0200833 if (interval >= 0)
834 res = internal_select(s, writing, interval, connect);
835 else
836 res = 1;
837 }
838 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200839 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200840 }
841
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 if (err)
844 *err = GET_SOCK_ERROR;
845
Victor Stinner31bf2d52015-04-01 21:57:09 +0200846 if (CHECK_ERRNO(EINTR)) {
847 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200848 if (PyErr_CheckSignals()) {
849 if (err)
850 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200852 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200853
854 /* retry select() */
855 continue;
856 }
857
858 /* select() failed */
859 s->errorhandler();
860 return -1;
861 }
862
863 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200864 if (err)
865 *err = SOCK_TIMEOUT_ERR;
866 else
867 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200868 return -1;
869 }
870
871 /* the socket is ready */
872 }
873
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 /* inner loop to retry sock_func() when sock_func() is interrupted
875 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876 while (1) {
877 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200878 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200879 Py_END_ALLOW_THREADS
880
881 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200882 /* sock_func() succeeded */
883 if (err)
884 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200885 return 0;
886 }
887
Victor Stinner81c41db2015-04-02 11:50:57 +0200888 if (err)
889 *err = GET_SOCK_ERROR;
890
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891 if (!CHECK_ERRNO(EINTR))
892 break;
893
Victor Stinner81c41db2015-04-02 11:50:57 +0200894 /* sock_func() was interrupted by a signal */
895 if (PyErr_CheckSignals()) {
896 if (err)
897 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200899 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200900
Victor Stinner81c41db2015-04-02 11:50:57 +0200901 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902 }
903
904 if (s->sock_timeout > 0
905 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200906 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200907
908 For example, select() could indicate a socket is ready for
909 reading, but the data then discarded by the OS because of a
910 wrong checksum.
911
912 Loop on select() to recheck for socket readyness. */
913 continue;
914 }
915
Victor Stinner81c41db2015-04-02 11:50:57 +0200916 /* sock_func() failed */
917 if (!err)
918 s->errorhandler();
919 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000920 return -1;
921 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200922}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000923
Victor Stinner81c41db2015-04-02 11:50:57 +0200924static int
925sock_call(PySocketSockObject *s,
926 int writing,
927 int (*func) (PySocketSockObject *s, void *data),
928 void *data)
929{
Victor Stinner8912d142015-04-06 23:16:34 +0200930 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200931}
932
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000933
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000934/* Initialize a new socket object. */
935
Victor Stinner88ed6402015-04-09 10:23:12 +0200936/* Default timeout for new sockets */
937static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000938
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200939static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000940init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 s->sock_fd = fd;
944 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500947
948 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
949 on some OSes as part of socket.type. We want to reset them here,
950 to make socket.type be set to the same value on all platforms.
951 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
952 not portable.
953 */
954#ifdef SOCK_NONBLOCK
955 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
956#endif
957#ifdef SOCK_CLOEXEC
958 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
959#endif
960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000964#ifdef SOCK_NONBLOCK
965 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100966 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000967 else
968#endif
969 {
970 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200971 if (defaulttimeout >= 0) {
972 if (internal_setblocking(s, 0) == -1) {
973 return -1;
974 }
975 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000976 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200977 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000978}
979
980
Guido van Rossum30a685f1991-06-27 15:51:29 +0000981/* Create a new socket object.
982 This just creates the object and initializes it.
983 If the creation fails, return NULL and set an exception (implicit
984 in NEWOBJ()). */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000987new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 PySocketSockObject *s;
990 s = (PySocketSockObject *)
991 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200992 if (s == NULL)
993 return NULL;
994 if (init_sockobject(s, fd, family, type, proto) == -1) {
995 Py_DECREF(s);
996 return NULL;
997 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000999}
1000
Guido van Rossum30a685f1991-06-27 15:51:29 +00001001
Guido van Rossum48a680c2001-03-02 06:34:14 +00001002/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001003 thread to be in gethostbyname or getaddrinfo */
1004#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001005static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001006#endif
1007
1008
Guido van Rossum30a685f1991-06-27 15:51:29 +00001009/* Convert a string specifying a host name or one of a few symbolic
1010 names to a numeric IP address. This usually calls gethostbyname()
1011 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001012 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013 an error occurred; then an exception is raised. */
1014
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001016setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 struct addrinfo hints, *res;
1019 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1022 if (name[0] == '\0') {
1023 int siz;
1024 memset(&hints, 0, sizeof(hints));
1025 hints.ai_family = af;
1026 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1027 hints.ai_flags = AI_PASSIVE;
1028 Py_BEGIN_ALLOW_THREADS
1029 ACQUIRE_GETADDRINFO_LOCK
1030 error = getaddrinfo(NULL, "0", &hints, &res);
1031 Py_END_ALLOW_THREADS
1032 /* We assume that those thread-unsafe getaddrinfo() versions
1033 *are* safe regarding their return value, ie. that a
1034 subsequent call to getaddrinfo() does not destroy the
1035 outcome of the first call. */
1036 RELEASE_GETADDRINFO_LOCK
1037 if (error) {
1038 set_gaierror(error);
1039 return -1;
1040 }
1041 switch (res->ai_family) {
1042 case AF_INET:
1043 siz = 4;
1044 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001045#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 case AF_INET6:
1047 siz = 16;
1048 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 default:
1051 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001052 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 "unsupported address family");
1054 return -1;
1055 }
1056 if (res->ai_next) {
1057 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001058 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 "wildcard resolved to multiple address");
1060 return -1;
1061 }
1062 if (res->ai_addrlen < addr_ret_size)
1063 addr_ret_size = res->ai_addrlen;
1064 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1065 freeaddrinfo(res);
1066 return siz;
1067 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001068 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001069 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001070 if (strcmp(name, "255.255.255.255") == 0 ||
1071 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 struct sockaddr_in *sin;
1073 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 "address family mismatched");
1076 return -1;
1077 }
1078 sin = (struct sockaddr_in *)addr_ret;
1079 memset((void *) sin, '\0', sizeof(*sin));
1080 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001081#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 sin->sin_addr.s_addr = INADDR_BROADCAST;
1085 return sizeof(sin->sin_addr);
1086 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001087
1088 /* avoid a name resolution in case of numeric address */
1089#ifdef HAVE_INET_PTON
1090 /* check for an IPv4 address */
1091 if (af == AF_UNSPEC || af == AF_INET) {
1092 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1093 memset(sin, 0, sizeof(*sin));
1094 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1095 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001096#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001097 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001098#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001099 return 4;
1100 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001102#ifdef ENABLE_IPV6
1103 /* check for an IPv6 address - if the address contains a scope ID, we
1104 * fallback to getaddrinfo(), which can handle translation from interface
1105 * name to interface index */
1106 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1107 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1108 memset(sin, 0, sizeof(*sin));
1109 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1110 sin->sin6_family = AF_INET6;
1111#ifdef HAVE_SOCKADDR_SA_LEN
1112 sin->sin6_len = sizeof(*sin);
1113#endif
1114 return 16;
1115 }
1116 }
1117#endif /* ENABLE_IPV6 */
1118#else /* HAVE_INET_PTON */
1119 /* check for an IPv4 address */
1120 if (af == AF_INET || af == AF_UNSPEC) {
1121 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1122 memset(sin, 0, sizeof(*sin));
1123 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1124 sin->sin_family = AF_INET;
1125#ifdef HAVE_SOCKADDR_SA_LEN
1126 sin->sin_len = sizeof(*sin);
1127#endif
1128 return 4;
1129 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001130 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001131#endif /* HAVE_INET_PTON */
1132
1133 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 memset(&hints, 0, sizeof(hints));
1135 hints.ai_family = af;
1136 Py_BEGIN_ALLOW_THREADS
1137 ACQUIRE_GETADDRINFO_LOCK
1138 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001139#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 if (error == EAI_NONAME && af == AF_UNSPEC) {
1141 /* On Tru64 V5.1, numeric-to-addr conversion fails
1142 if no address family is given. Assume IPv4 for now.*/
1143 hints.ai_family = AF_INET;
1144 error = getaddrinfo(name, NULL, &hints, &res);
1145 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 Py_END_ALLOW_THREADS
1148 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1149 if (error) {
1150 set_gaierror(error);
1151 return -1;
1152 }
1153 if (res->ai_addrlen < addr_ret_size)
1154 addr_ret_size = res->ai_addrlen;
1155 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1156 freeaddrinfo(res);
1157 switch (addr_ret->sa_family) {
1158 case AF_INET:
1159 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001160#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 case AF_INET6:
1162 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001165 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return -1;
1167 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168}
1169
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
Коренберг Марк7766b962018-02-13 00:47:42 +05001171/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Guido van Rossum73624e91994-10-10 17:59:00 +00001173static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001174make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175{
Коренберг Марк7766b962018-02-13 00:47:42 +05001176 char buf[INET_ADDRSTRLEN];
1177 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1178 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 return NULL;
1180 }
1181 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182}
1183
Коренберг Марк7766b962018-02-13 00:47:42 +05001184#ifdef ENABLE_IPV6
1185/* Convert IPv6 sockaddr to a Python str. */
1186
1187static PyObject *
1188make_ipv6_addr(const struct sockaddr_in6 *addr)
1189{
1190 char buf[INET6_ADDRSTRLEN];
1191 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1192 PyErr_SetFromErrno(PyExc_OSError);
1193 return NULL;
1194 }
1195 return PyUnicode_FromString(buf);
1196}
1197#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001198
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001199#ifdef USE_BLUETOOTH
1200/* Convert a string representation of a Bluetooth address into a numeric
1201 address. Returns the length (6), or raises an exception and returns -1 if
1202 an error occurred. */
1203
1204static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001205setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 unsigned int b0, b1, b2, b3, b4, b5;
1208 char ch;
1209 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1212 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1213 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1214 bdaddr->b[0] = b0;
1215 bdaddr->b[1] = b1;
1216 bdaddr->b[2] = b2;
1217 bdaddr->b[3] = b3;
1218 bdaddr->b[4] = b4;
1219 bdaddr->b[5] = b5;
1220 return 6;
1221 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001222 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 return -1;
1224 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001225}
1226
1227/* Create a string representation of the Bluetooth address. This is always a
1228 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1229 value (zero padded if necessary). */
1230
1231static PyObject *
1232makebdaddr(bdaddr_t *bdaddr)
1233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1237 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1238 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1239 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001240}
1241#endif
1242
1243
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244/* Create an object representing the given socket address,
1245 suitable for passing it back to bind(), connect() etc.
1246 The family field of the sockaddr structure is inspected
1247 to determine what kind of address it really is. */
1248
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001249/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001250static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001251makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (addrlen == 0) {
1254 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001255 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 case AF_INET:
1261 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001262 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1263 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 PyObject *ret = NULL;
1265 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1267 Py_DECREF(addrobj);
1268 }
1269 return ret;
1270 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001271
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001272#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case AF_UNIX:
1274 {
1275 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001276#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001277 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1278 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1279 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 }
1281 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001282#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 {
1284 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001285 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
1287 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001288#endif /* AF_UNIX */
1289
Martin v. Löwis11017b12006-01-14 18:12:57 +00001290#if defined(AF_NETLINK)
1291 case AF_NETLINK:
1292 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1294 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001295 }
1296#endif /* AF_NETLINK */
1297
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001298#if defined(AF_QIPCRTR)
1299 case AF_QIPCRTR:
1300 {
1301 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1302 return Py_BuildValue("II", a->sq_node, a->sq_port);
1303 }
1304#endif /* AF_QIPCRTR */
1305
caaveryeffc12f2017-09-06 18:18:10 -04001306#if defined(AF_VSOCK)
1307 case AF_VSOCK:
1308 {
1309 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1310 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1311 }
1312#endif /* AF_VSOCK */
1313
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001314#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 case AF_INET6:
1316 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001317 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1318 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 PyObject *ret = NULL;
1320 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001321 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 addrobj,
1323 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001324 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 a->sin6_scope_id);
1326 Py_DECREF(addrobj);
1327 }
1328 return ret;
1329 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001330#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001331
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001332#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 case AF_BLUETOOTH:
1334 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case BTPROTO_L2CAP:
1337 {
1338 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1339 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1340 PyObject *ret = NULL;
1341 if (addrobj) {
1342 ret = Py_BuildValue("Oi",
1343 addrobj,
1344 _BT_L2_MEMB(a, psm));
1345 Py_DECREF(addrobj);
1346 }
1347 return ret;
1348 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 case BTPROTO_RFCOMM:
1351 {
1352 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1353 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1354 PyObject *ret = NULL;
1355 if (addrobj) {
1356 ret = Py_BuildValue("Oi",
1357 addrobj,
1358 _BT_RC_MEMB(a, channel));
1359 Py_DECREF(addrobj);
1360 }
1361 return ret;
1362 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 case BTPROTO_HCI:
1365 {
1366 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001367#if defined(__NetBSD__) || defined(__DragonFly__)
1368 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001369#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 PyObject *ret = NULL;
1371 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1372 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001373#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001375
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001376#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 case BTPROTO_SCO:
1378 {
1379 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1380 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1381 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001382#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 default:
1385 PyErr_SetString(PyExc_ValueError,
1386 "Unknown Bluetooth protocol");
1387 return NULL;
1388 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001389#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001390
Antoine Pitroub156a462010-10-27 20:13:57 +00001391#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 case AF_PACKET:
1393 {
1394 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001395 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 struct ifreq ifr;
1397 /* need to look up interface name give index */
1398 if (a->sll_ifindex) {
1399 ifr.ifr_ifindex = a->sll_ifindex;
1400 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1401 ifname = ifr.ifr_name;
1402 }
1403 return Py_BuildValue("shbhy#",
1404 ifname,
1405 ntohs(a->sll_protocol),
1406 a->sll_pkttype,
1407 a->sll_hatype,
1408 a->sll_addr,
1409 a->sll_halen);
1410 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001411#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001412
Christian Heimes043d6f62008-01-07 17:19:16 +00001413#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 case AF_TIPC:
1415 {
1416 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1417 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1418 return Py_BuildValue("IIIII",
1419 a->addrtype,
1420 a->addr.nameseq.type,
1421 a->addr.nameseq.lower,
1422 a->addr.nameseq.upper,
1423 a->scope);
1424 } else if (a->addrtype == TIPC_ADDR_NAME) {
1425 return Py_BuildValue("IIIII",
1426 a->addrtype,
1427 a->addr.name.name.type,
1428 a->addr.name.name.instance,
1429 a->addr.name.name.instance,
1430 a->scope);
1431 } else if (a->addrtype == TIPC_ADDR_ID) {
1432 return Py_BuildValue("IIIII",
1433 a->addrtype,
1434 a->addr.id.node,
1435 a->addr.id.ref,
1436 0,
1437 a->scope);
1438 } else {
1439 PyErr_SetString(PyExc_ValueError,
1440 "Invalid address type");
1441 return NULL;
1442 }
1443 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001444#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001445
Serhiy Storchakad3187152017-11-09 18:00:38 +02001446#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001447 case AF_CAN:
1448 {
1449 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001450 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001451 struct ifreq ifr;
1452 /* need to look up interface name given index */
1453 if (a->can_ifindex) {
1454 ifr.ifr_ifindex = a->can_ifindex;
1455 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1456 ifname = ifr.ifr_name;
1457 }
1458
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001459 switch (proto) {
1460#ifdef CAN_ISOTP
1461 case CAN_ISOTP:
1462 {
1463 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1464 ifname,
1465 a->can_addr.tp.rx_id,
1466 a->can_addr.tp.tx_id);
1467 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001468#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001469 default:
1470 {
1471 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1472 ifname);
1473 }
1474 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001475 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001476#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001477
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001478#ifdef PF_SYSTEM
1479 case PF_SYSTEM:
1480 switch(proto) {
1481#ifdef SYSPROTO_CONTROL
1482 case SYSPROTO_CONTROL:
1483 {
1484 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1485 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1486 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001487#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001488 default:
1489 PyErr_SetString(PyExc_ValueError,
1490 "Invalid address type");
1491 return 0;
1492 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001493#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001494
Christian Heimesdffa3942016-09-05 23:54:41 +02001495#ifdef HAVE_SOCKADDR_ALG
1496 case AF_ALG:
1497 {
1498 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1499 return Py_BuildValue("s#s#HH",
1500 a->salg_type,
1501 strnlen((const char*)a->salg_type,
1502 sizeof(a->salg_type)),
1503 a->salg_name,
1504 strnlen((const char*)a->salg_name,
1505 sizeof(a->salg_name)),
1506 a->salg_feat,
1507 a->salg_mask);
1508 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001509#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 default:
1514 /* If we don't know the address family, don't raise an
1515 exception -- return it as an (int, bytes) tuple. */
1516 return Py_BuildValue("iy#",
1517 addr->sa_family,
1518 addr->sa_data,
1519 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522}
1523
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001524/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1525 (in particular, numeric IP addresses). */
1526struct maybe_idna {
1527 PyObject *obj;
1528 char *buf;
1529};
1530
1531static void
1532idna_cleanup(struct maybe_idna *data)
1533{
1534 Py_CLEAR(data->obj);
1535}
1536
1537static int
1538idna_converter(PyObject *obj, struct maybe_idna *data)
1539{
1540 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001541 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001542 if (obj == NULL) {
1543 idna_cleanup(data);
1544 return 1;
1545 }
1546 data->obj = NULL;
1547 len = -1;
1548 if (PyBytes_Check(obj)) {
1549 data->buf = PyBytes_AsString(obj);
1550 len = PyBytes_Size(obj);
1551 }
1552 else if (PyByteArray_Check(obj)) {
1553 data->buf = PyByteArray_AsString(obj);
1554 len = PyByteArray_Size(obj);
1555 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001556 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001557 if (PyUnicode_READY(obj) == -1) {
1558 return 0;
1559 }
1560 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001561 data->buf = PyUnicode_DATA(obj);
1562 len = PyUnicode_GET_LENGTH(obj);
1563 }
1564 else {
1565 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1566 if (!obj2) {
1567 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1568 return 0;
1569 }
1570 assert(PyBytes_Check(obj2));
1571 data->obj = obj2;
1572 data->buf = PyBytes_AS_STRING(obj2);
1573 len = PyBytes_GET_SIZE(obj2);
1574 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001575 }
1576 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001577 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1578 obj->ob_type->tp_name);
1579 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001580 }
1581 if (strlen(data->buf) != len) {
1582 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001583 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001584 return 0;
1585 }
1586 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001587}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588
1589/* Parse a socket address argument according to the socket object's
1590 address family. Return 1 if the address was in the proper format,
1591 0 of not. The address is returned through addr_ret, its length
1592 through len_ret. */
1593
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001594static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001595getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001596 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001599
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001600#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 case AF_UNIX:
1602 {
1603 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001604 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001605 int retval = 0;
1606
1607 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1608 allow embedded nulls on Linux. */
1609 if (PyUnicode_Check(args)) {
1610 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1611 return 0;
1612 }
1613 else
1614 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001615 if (!PyArg_Parse(args, "y*", &path)) {
1616 Py_DECREF(args);
1617 return retval;
1618 }
1619 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001622#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001623 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001625 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001626 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001628 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 }
1630 }
1631 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001632#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 {
1634 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001635 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001636 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001638 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001640 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 }
1642 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001643 memcpy(addr->sun_path, path.buf, path.len);
1644 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001645 retval = 1;
1646 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001647 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001648 Py_DECREF(args);
1649 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001651#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652
Martin v. Löwis11017b12006-01-14 18:12:57 +00001653#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 case AF_NETLINK:
1655 {
1656 struct sockaddr_nl* addr;
1657 int pid, groups;
1658 addr = (struct sockaddr_nl *)addr_ret;
1659 if (!PyTuple_Check(args)) {
1660 PyErr_Format(
1661 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001662 "%s(): AF_NETLINK address must be tuple, not %.500s",
1663 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 return 0;
1665 }
Oren Milman735171e2018-09-11 19:51:29 +03001666 if (!PyArg_ParseTuple(args,
1667 "II;AF_NETLINK address must be a pair "
1668 "(pid, groups)",
1669 &pid, &groups))
1670 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001672 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 addr->nl_family = AF_NETLINK;
1674 addr->nl_pid = pid;
1675 addr->nl_groups = groups;
1676 *len_ret = sizeof(*addr);
1677 return 1;
1678 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001679#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001680
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001681#if defined(AF_QIPCRTR)
1682 case AF_QIPCRTR:
1683 {
1684 struct sockaddr_qrtr* addr;
1685 unsigned int node, port;
1686 addr = (struct sockaddr_qrtr *)addr_ret;
1687 if (!PyTuple_Check(args)) {
1688 PyErr_Format(
1689 PyExc_TypeError,
1690 "getsockaddrarg: "
1691 "AF_QIPCRTR address must be tuple, not %.500s",
1692 Py_TYPE(args)->tp_name);
1693 return 0;
1694 }
1695 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1696 return 0;
1697 addr->sq_family = AF_QIPCRTR;
1698 addr->sq_node = node;
1699 addr->sq_port = port;
1700 *len_ret = sizeof(*addr);
1701 return 1;
1702 }
1703#endif /* AF_QIPCRTR */
1704
caaveryeffc12f2017-09-06 18:18:10 -04001705#if defined(AF_VSOCK)
1706 case AF_VSOCK:
1707 {
1708 struct sockaddr_vm* addr;
1709 int port, cid;
1710 addr = (struct sockaddr_vm *)addr_ret;
1711 memset(addr, 0, sizeof(struct sockaddr_vm));
1712 if (!PyTuple_Check(args)) {
1713 PyErr_Format(
1714 PyExc_TypeError,
1715 "getsockaddrarg: "
1716 "AF_VSOCK address must be tuple, not %.500s",
1717 Py_TYPE(args)->tp_name);
1718 return 0;
1719 }
1720 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1721 return 0;
1722 addr->svm_family = s->sock_family;
1723 addr->svm_port = port;
1724 addr->svm_cid = cid;
1725 *len_ret = sizeof(*addr);
1726 return 1;
1727 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001728#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001729
1730
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001731#ifdef AF_RDS
1732 case AF_RDS:
1733 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001734#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 case AF_INET:
1737 {
1738 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001739 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 int port, result;
1741 if (!PyTuple_Check(args)) {
1742 PyErr_Format(
1743 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001744 "%s(): AF_INET address must be tuple, not %.500s",
1745 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return 0;
1747 }
Oren Milman735171e2018-09-11 19:51:29 +03001748 if (!PyArg_ParseTuple(args,
1749 "O&i;AF_INET address must be a pair "
1750 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001751 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001752 {
1753 assert(PyErr_Occurred());
1754 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1755 PyErr_Format(PyExc_OverflowError,
1756 "%s(): port must be 0-65535.", caller);
1757 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001759 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001761 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001763 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (result < 0)
1765 return 0;
1766 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001767 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001769 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return 0;
1771 }
1772 addr->sin_family = AF_INET;
1773 addr->sin_port = htons((short)port);
1774 *len_ret = sizeof *addr;
1775 return 1;
1776 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001778#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 case AF_INET6:
1780 {
1781 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001782 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001783 int port, result;
1784 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 flowinfo = scope_id = 0;
1786 if (!PyTuple_Check(args)) {
1787 PyErr_Format(
1788 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001789 "%s(): AF_INET6 address must be tuple, not %.500s",
1790 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return 0;
1792 }
Oren Milman735171e2018-09-11 19:51:29 +03001793 if (!PyArg_ParseTuple(args,
1794 "O&i|II;AF_INET6 address must be a tuple "
1795 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001796 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001797 &scope_id))
1798 {
1799 assert(PyErr_Occurred());
1800 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1801 PyErr_Format(PyExc_OverflowError,
1802 "%s(): port must be 0-65535.", caller);
1803 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return 0;
1805 }
1806 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001807 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001809 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (result < 0)
1811 return 0;
1812 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001813 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001815 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 return 0;
1817 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001818 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001819 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001820 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001821 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001822 return 0;
1823 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 addr->sin6_family = s->sock_family;
1825 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001826 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 addr->sin6_scope_id = scope_id;
1828 *len_ret = sizeof *addr;
1829 return 1;
1830 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001831#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001832
Hye-Shik Chang81268602004-02-02 06:05:24 +00001833#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 case AF_BLUETOOTH:
1835 {
1836 switch (s->sock_proto) {
1837 case BTPROTO_L2CAP:
1838 {
1839 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001840 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 addr = (struct sockaddr_l2 *)addr_ret;
1843 memset(addr, 0, sizeof(struct sockaddr_l2));
1844 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1845 if (!PyArg_ParseTuple(args, "si", &straddr,
1846 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001847 PyErr_Format(PyExc_OSError,
1848 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 return 0;
1850 }
1851 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1852 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 *len_ret = sizeof *addr;
1855 return 1;
1856 }
1857 case BTPROTO_RFCOMM:
1858 {
1859 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001860 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 addr = (struct sockaddr_rc *)addr_ret;
1863 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1864 if (!PyArg_ParseTuple(args, "si", &straddr,
1865 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001866 PyErr_Format(PyExc_OSError,
1867 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return 0;
1869 }
1870 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1871 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 *len_ret = sizeof *addr;
1874 return 1;
1875 }
1876 case BTPROTO_HCI:
1877 {
1878 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001879#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001880 const char *straddr;
1881 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1882 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001883 PyErr_Format(PyExc_OSError, "%s: "
1884 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001885 return 0;
1886 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001887 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001888 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1889 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001890#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1892 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001893 PyErr_Format(PyExc_OSError,
1894 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return 0;
1896 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001897#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 *len_ret = sizeof *addr;
1899 return 1;
1900 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001901#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 case BTPROTO_SCO:
1903 {
1904 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001905 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 addr = (struct sockaddr_sco *)addr_ret;
1908 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1909 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001910 PyErr_Format(PyExc_OSError,
1911 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 return 0;
1913 }
1914 straddr = PyBytes_AS_STRING(args);
1915 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1916 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 *len_ret = sizeof *addr;
1919 return 1;
1920 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001921#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 default:
Oren Milman735171e2018-09-11 19:51:29 +03001923 PyErr_Format(PyExc_OSError,
1924 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 return 0;
1926 }
1927 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001928#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001929
Antoine Pitroub156a462010-10-27 20:13:57 +00001930#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 case AF_PACKET:
1932 {
1933 struct sockaddr_ll* addr;
1934 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001935 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 int protoNumber;
1937 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001938 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001939 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 if (!PyTuple_Check(args)) {
1942 PyErr_Format(
1943 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001944 "%s(): AF_PACKET address must be tuple, not %.500s",
1945 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 return 0;
1947 }
Oren Milman735171e2018-09-11 19:51:29 +03001948 /* XXX: improve the default error message according to the
1949 documentation of AF_PACKET, which would be added as part
1950 of bpo-25041. */
1951 if (!PyArg_ParseTuple(args,
1952 "si|iiy*;AF_PACKET address must be a tuple of "
1953 "two to five elements",
1954 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001955 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03001956 {
1957 assert(PyErr_Occurred());
1958 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1959 PyErr_Format(PyExc_OverflowError,
1960 "%s(): address argument out of range", caller);
1961 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001963 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1965 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1966 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1967 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001968 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 return 0;
1970 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001971 if (haddr.buf && haddr.len > 8) {
1972 PyErr_SetString(PyExc_ValueError,
1973 "Hardware address must be 8 bytes or less");
1974 PyBuffer_Release(&haddr);
1975 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 }
1977 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001978 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04001980 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001981 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 return 0;
1983 }
1984 addr = (struct sockaddr_ll*)addr_ret;
1985 addr->sll_family = AF_PACKET;
1986 addr->sll_protocol = htons((short)protoNumber);
1987 addr->sll_ifindex = ifr.ifr_ifindex;
1988 addr->sll_pkttype = pkttype;
1989 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001990 if (haddr.buf) {
1991 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1992 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001994 else
1995 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001997 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 return 1;
1999 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002000#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002001
Christian Heimes043d6f62008-01-07 17:19:16 +00002002#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 case AF_TIPC:
2004 {
2005 unsigned int atype, v1, v2, v3;
2006 unsigned int scope = TIPC_CLUSTER_SCOPE;
2007 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 if (!PyTuple_Check(args)) {
2010 PyErr_Format(
2011 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002012 "%s(): AF_TIPC address must be tuple, not %.500s",
2013 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
2015 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002018 "IIII|I;AF_TIPC address must be a tuple "
2019 "(addr_type, v1, v2, v3[, scope])",
2020 &atype, &v1, &v2, &v3, &scope))
2021 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002023 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 addr = (struct sockaddr_tipc *) addr_ret;
2026 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 addr->family = AF_TIPC;
2029 addr->scope = scope;
2030 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (atype == TIPC_ADDR_NAMESEQ) {
2033 addr->addr.nameseq.type = v1;
2034 addr->addr.nameseq.lower = v2;
2035 addr->addr.nameseq.upper = v3;
2036 } else if (atype == TIPC_ADDR_NAME) {
2037 addr->addr.name.name.type = v1;
2038 addr->addr.name.name.instance = v2;
2039 } else if (atype == TIPC_ADDR_ID) {
2040 addr->addr.id.node = v1;
2041 addr->addr.id.ref = v2;
2042 } else {
2043 /* Shouldn't happen */
2044 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2045 return 0;
2046 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 return 1;
2051 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002052#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002053
Serhiy Storchakad3187152017-11-09 18:00:38 +02002054#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002055 case AF_CAN:
2056 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002057#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002058 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002059 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002060#endif
2061#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002062 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002063#endif
2064#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002065 {
2066 struct sockaddr_can *addr;
2067 PyObject *interfaceName;
2068 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002069 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002070 addr = (struct sockaddr_can *)addr_ret;
2071
Oren Milman735171e2018-09-11 19:51:29 +03002072 if (!PyTuple_Check(args)) {
2073 PyErr_Format(PyExc_TypeError,
2074 "%s(): AF_CAN address must be tuple, not %.500s",
2075 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002076 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002077 }
2078 if (!PyArg_ParseTuple(args,
2079 "O&;AF_CAN address must be a tuple "
2080 "(interface, )",
2081 PyUnicode_FSConverter, &interfaceName))
2082 {
2083 return 0;
2084 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002085
2086 len = PyBytes_GET_SIZE(interfaceName);
2087
2088 if (len == 0) {
2089 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002090 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002091 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2092 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002093 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2094 s->errorhandler();
2095 Py_DECREF(interfaceName);
2096 return 0;
2097 }
2098 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002099 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002100 "AF_CAN interface name too long");
2101 Py_DECREF(interfaceName);
2102 return 0;
2103 }
2104
2105 addr->can_family = AF_CAN;
2106 addr->can_ifindex = ifr.ifr_ifindex;
2107
2108 *len_ret = sizeof(*addr);
2109 Py_DECREF(interfaceName);
2110 return 1;
2111 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002112#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002113
2114#ifdef CAN_ISOTP
2115 case CAN_ISOTP:
2116 {
2117 struct sockaddr_can *addr;
2118 PyObject *interfaceName;
2119 struct ifreq ifr;
2120 Py_ssize_t len;
2121 unsigned long int rx_id, tx_id;
2122
2123 addr = (struct sockaddr_can *)addr_ret;
2124
2125 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2126 &interfaceName,
2127 &rx_id,
2128 &tx_id))
2129 return 0;
2130
2131 len = PyBytes_GET_SIZE(interfaceName);
2132
2133 if (len == 0) {
2134 ifr.ifr_ifindex = 0;
2135 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2136 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2137 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2138 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2139 s->errorhandler();
2140 Py_DECREF(interfaceName);
2141 return 0;
2142 }
2143 } else {
2144 PyErr_SetString(PyExc_OSError,
2145 "AF_CAN interface name too long");
2146 Py_DECREF(interfaceName);
2147 return 0;
2148 }
2149
2150 addr->can_family = AF_CAN;
2151 addr->can_ifindex = ifr.ifr_ifindex;
2152 addr->can_addr.tp.rx_id = rx_id;
2153 addr->can_addr.tp.tx_id = tx_id;
2154
2155 *len_ret = sizeof(*addr);
2156 Py_DECREF(interfaceName);
2157 return 1;
2158 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002159#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002160 default:
Oren Milman735171e2018-09-11 19:51:29 +03002161 PyErr_Format(PyExc_OSError,
2162 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002163 return 0;
2164 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002165#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002166
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002167#ifdef PF_SYSTEM
2168 case PF_SYSTEM:
2169 switch (s->sock_proto) {
2170#ifdef SYSPROTO_CONTROL
2171 case SYSPROTO_CONTROL:
2172 {
2173 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002174
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002175 addr = (struct sockaddr_ctl *)addr_ret;
2176 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002177 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002178
2179 if (PyUnicode_Check(args)) {
2180 struct ctl_info info;
2181 PyObject *ctl_name;
2182
2183 if (!PyArg_Parse(args, "O&",
2184 PyUnicode_FSConverter, &ctl_name)) {
2185 return 0;
2186 }
2187
Victor Stinnerf50e1872015-03-20 11:32:24 +01002188 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002189 PyErr_SetString(PyExc_ValueError,
2190 "provided string is too long");
2191 Py_DECREF(ctl_name);
2192 return 0;
2193 }
2194 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2195 sizeof(info.ctl_name));
2196 Py_DECREF(ctl_name);
2197
2198 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2199 PyErr_SetString(PyExc_OSError,
2200 "cannot find kernel control with provided name");
2201 return 0;
2202 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002203
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002204 addr->sc_id = info.ctl_id;
2205 addr->sc_unit = 0;
2206 } else if (!PyArg_ParseTuple(args, "II",
2207 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002208 PyErr_Format(PyExc_TypeError,
2209 "%s(): PF_SYSTEM address must be a str or "
2210 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002211 return 0;
2212 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002213
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002214 *len_ret = sizeof(*addr);
2215 return 1;
2216 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002217#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002218 default:
Oren Milman735171e2018-09-11 19:51:29 +03002219 PyErr_Format(PyExc_OSError,
2220 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002221 return 0;
2222 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002223#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002224#ifdef HAVE_SOCKADDR_ALG
2225 case AF_ALG:
2226 {
2227 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002228 const char *type;
2229 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002230 sa = (struct sockaddr_alg *)addr_ret;
2231
2232 memset(sa, 0, sizeof(*sa));
2233 sa->salg_family = AF_ALG;
2234
Oren Milman735171e2018-09-11 19:51:29 +03002235 if (!PyTuple_Check(args)) {
2236 PyErr_Format(PyExc_TypeError,
2237 "%s(): AF_ALG address must be tuple, not %.500s",
2238 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002239 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002240 }
2241 if (!PyArg_ParseTuple(args,
2242 "ss|HH;AF_ALG address must be a tuple "
2243 "(type, name[, feat[, mask]])",
2244 &type, &name, &sa->salg_feat, &sa->salg_mask))
2245 {
2246 return 0;
2247 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002248 /* sockaddr_alg has fixed-sized char arrays for type and name */
2249 if (strlen(type) > sizeof(sa->salg_type)) {
2250 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2251 return 0;
2252 }
2253 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2254 if (strlen(name) > sizeof(sa->salg_name)) {
2255 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2256 return 0;
2257 }
2258 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2259
2260 *len_ret = sizeof(*sa);
2261 return 1;
2262 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002263#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 default:
Oren Milman735171e2018-09-11 19:51:29 +03002268 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002272}
2273
Guido van Rossum30a685f1991-06-27 15:51:29 +00002274
Guido van Rossum48a680c2001-03-02 06:34:14 +00002275/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002276 Return 1 if the family is known, 0 otherwise. The length is returned
2277 through len_ret. */
2278
2279static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002280getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002283
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002284#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 case AF_UNIX:
2286 {
2287 *len_ret = sizeof (struct sockaddr_un);
2288 return 1;
2289 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002290#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002291
Martin v. Löwis11017b12006-01-14 18:12:57 +00002292#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002293 case AF_NETLINK:
2294 {
2295 *len_ret = sizeof (struct sockaddr_nl);
2296 return 1;
2297 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002298#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002299
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002300#if defined(AF_QIPCRTR)
2301 case AF_QIPCRTR:
2302 {
2303 *len_ret = sizeof (struct sockaddr_qrtr);
2304 return 1;
2305 }
2306#endif /* AF_QIPCRTR */
2307
caaveryeffc12f2017-09-06 18:18:10 -04002308#if defined(AF_VSOCK)
2309 case AF_VSOCK:
2310 {
2311 *len_ret = sizeof (struct sockaddr_vm);
2312 return 1;
2313 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002314#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002315
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002316#ifdef AF_RDS
2317 case AF_RDS:
2318 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002319#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 case AF_INET:
2322 {
2323 *len_ret = sizeof (struct sockaddr_in);
2324 return 1;
2325 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002326
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002327#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 case AF_INET6:
2329 {
2330 *len_ret = sizeof (struct sockaddr_in6);
2331 return 1;
2332 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002333#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002334
Hye-Shik Chang81268602004-02-02 06:05:24 +00002335#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 case AF_BLUETOOTH:
2337 {
2338 switch(s->sock_proto)
2339 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 case BTPROTO_L2CAP:
2342 *len_ret = sizeof (struct sockaddr_l2);
2343 return 1;
2344 case BTPROTO_RFCOMM:
2345 *len_ret = sizeof (struct sockaddr_rc);
2346 return 1;
2347 case BTPROTO_HCI:
2348 *len_ret = sizeof (struct sockaddr_hci);
2349 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002350#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 case BTPROTO_SCO:
2352 *len_ret = sizeof (struct sockaddr_sco);
2353 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002354#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002356 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 "unknown BT protocol");
2358 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 }
2361 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002362#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002363
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002364#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 case AF_PACKET:
2366 {
2367 *len_ret = sizeof (struct sockaddr_ll);
2368 return 1;
2369 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002370#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002371
Christian Heimes043d6f62008-01-07 17:19:16 +00002372#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 case AF_TIPC:
2374 {
2375 *len_ret = sizeof (struct sockaddr_tipc);
2376 return 1;
2377 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002378#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002379
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002380#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002381 case AF_CAN:
2382 {
2383 *len_ret = sizeof (struct sockaddr_can);
2384 return 1;
2385 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002386#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002387
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002388#ifdef PF_SYSTEM
2389 case PF_SYSTEM:
2390 switch(s->sock_proto) {
2391#ifdef SYSPROTO_CONTROL
2392 case SYSPROTO_CONTROL:
2393 *len_ret = sizeof (struct sockaddr_ctl);
2394 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002395#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002396 default:
2397 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2398 "unknown PF_SYSTEM protocol");
2399 return 0;
2400 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002401#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002402#ifdef HAVE_SOCKADDR_ALG
2403 case AF_ALG:
2404 {
2405 *len_ret = sizeof (struct sockaddr_alg);
2406 return 1;
2407 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002408#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002413 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002417}
2418
2419
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002420/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2421 Currently, these methods are only compiled if the RFC 2292/3542
2422 CMSG_LEN() macro is available. Older systems seem to have used
2423 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2424 it may be possible to define CMSG_LEN() that way if it's not
2425 provided. Some architectures might need extra padding after the
2426 cmsghdr, however, and CMSG_LEN() would have to take account of
2427 this. */
2428#ifdef CMSG_LEN
2429/* If length is in range, set *result to CMSG_LEN(length) and return
2430 true; otherwise, return false. */
2431static int
2432get_CMSG_LEN(size_t length, size_t *result)
2433{
2434 size_t tmp;
2435
2436 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2437 return 0;
2438 tmp = CMSG_LEN(length);
2439 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2440 return 0;
2441 *result = tmp;
2442 return 1;
2443}
2444
2445#ifdef CMSG_SPACE
2446/* If length is in range, set *result to CMSG_SPACE(length) and return
2447 true; otherwise, return false. */
2448static int
2449get_CMSG_SPACE(size_t length, size_t *result)
2450{
2451 size_t tmp;
2452
2453 /* Use CMSG_SPACE(1) here in order to take account of the padding
2454 necessary before *and* after the data. */
2455 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2456 return 0;
2457 tmp = CMSG_SPACE(length);
2458 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2459 return 0;
2460 *result = tmp;
2461 return 1;
2462}
2463#endif
2464
2465/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2466 pointer in msg->msg_control with at least "space" bytes after it,
2467 and its cmsg_len member inside the buffer. */
2468static int
2469cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2470{
2471 size_t cmsg_offset;
2472 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2473 sizeof(cmsgh->cmsg_len));
2474
Charles-François Natali466517d2011-08-28 18:23:43 +02002475 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002476 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002477 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002478 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2479 annoying under OS X as it's unsigned there and so it triggers a
2480 tautological comparison warning under Clang when compared against 0.
2481 Since the check is valid on other platforms, silence the warning under
2482 Clang. */
2483 #ifdef __clang__
2484 #pragma clang diagnostic push
2485 #pragma clang diagnostic ignored "-Wtautological-compare"
2486 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002487 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002488 #pragma GCC diagnostic push
2489 #pragma GCC diagnostic ignored "-Wtype-limits"
2490 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002491 if (msg->msg_controllen < 0)
2492 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002493 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002494 #pragma GCC diagnostic pop
2495 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002496 #ifdef __clang__
2497 #pragma clang diagnostic pop
2498 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002499 if (space < cmsg_len_end)
2500 space = cmsg_len_end;
2501 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2502 return (cmsg_offset <= (size_t)-1 - space &&
2503 cmsg_offset + space <= msg->msg_controllen);
2504}
2505
2506/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2507 *space to number of bytes following it in the buffer and return
2508 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2509 msg->msg_controllen are valid. */
2510static int
2511get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2512{
2513 size_t data_offset;
2514 char *data_ptr;
2515
2516 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2517 return 0;
2518 data_offset = data_ptr - (char *)msg->msg_control;
2519 if (data_offset > msg->msg_controllen)
2520 return 0;
2521 *space = msg->msg_controllen - data_offset;
2522 return 1;
2523}
2524
2525/* If cmsgh is invalid or not contained in the buffer pointed to by
2526 msg->msg_control, return -1. If cmsgh is valid and its associated
2527 data is entirely contained in the buffer, set *data_len to the
2528 length of the associated data and return 0. If only part of the
2529 associated data is contained in the buffer but cmsgh is otherwise
2530 valid, set *data_len to the length contained in the buffer and
2531 return 1. */
2532static int
2533get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2534{
2535 size_t space, cmsg_data_len;
2536
2537 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2538 cmsgh->cmsg_len < CMSG_LEN(0))
2539 return -1;
2540 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2541 if (!get_cmsg_data_space(msg, cmsgh, &space))
2542 return -1;
2543 if (space >= cmsg_data_len) {
2544 *data_len = cmsg_data_len;
2545 return 0;
2546 }
2547 *data_len = space;
2548 return 1;
2549}
2550#endif /* CMSG_LEN */
2551
2552
Victor Stinner31bf2d52015-04-01 21:57:09 +02002553struct sock_accept {
2554 socklen_t *addrlen;
2555 sock_addr_t *addrbuf;
2556 SOCKET_T result;
2557};
2558
2559#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2560/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2561static int accept4_works = -1;
2562#endif
2563
2564static int
2565sock_accept_impl(PySocketSockObject *s, void *data)
2566{
2567 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002568 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2569 socklen_t *paddrlen = ctx->addrlen;
2570#ifdef HAVE_SOCKADDR_ALG
2571 /* AF_ALG does not support accept() with addr and raises
2572 * ECONNABORTED instead. */
2573 if (s->sock_family == AF_ALG) {
2574 addr = NULL;
2575 paddrlen = NULL;
2576 *ctx->addrlen = 0;
2577 }
2578#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002579
2580#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2581 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002582 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002583 SOCK_CLOEXEC);
2584 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2585 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2586 accept4_works = (errno != ENOSYS);
2587 }
2588 }
2589 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002590 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002591#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002592 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002593#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002594
2595#ifdef MS_WINDOWS
2596 return (ctx->result != INVALID_SOCKET);
2597#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002598 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002599#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002600}
2601
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002602/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002603
Guido van Rossum73624e91994-10-10 17:59:00 +00002604static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302605sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002608 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 socklen_t addrlen;
2610 PyObject *sock = NULL;
2611 PyObject *addr = NULL;
2612 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002613 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 if (!getsockaddrlen(s, &addrlen))
2616 return NULL;
2617 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (!IS_SELECTABLE(s))
2620 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002621
Victor Stinner31bf2d52015-04-01 21:57:09 +02002622 ctx.addrlen = &addrlen;
2623 ctx.addrbuf = &addrbuf;
2624 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002626 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002627
Victor Stinnerdaf45552013-08-28 00:53:59 +02002628#ifdef MS_WINDOWS
2629 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2630 PyErr_SetFromWindowsErr(0);
2631 SOCKETCLOSE(newfd);
2632 goto finally;
2633 }
2634#else
2635
2636#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2637 if (!accept4_works)
2638#endif
2639 {
2640 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2641 SOCKETCLOSE(newfd);
2642 goto finally;
2643 }
2644 }
2645#endif
2646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 sock = PyLong_FromSocket_t(newfd);
2648 if (sock == NULL) {
2649 SOCKETCLOSE(newfd);
2650 goto finally;
2651 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2654 addrlen, s->sock_proto);
2655 if (addr == NULL)
2656 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002659
Guido van Rossum67f7a382002-06-06 21:08:16 +00002660finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 Py_XDECREF(sock);
2662 Py_XDECREF(addr);
2663 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002664}
2665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002666PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002667"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002669Wait for an incoming connection. Return a new socket file descriptor\n\
2670representing the connection, and the address of the client.\n\
2671For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002672
Guido van Rossum11ba0942002-06-13 15:07:44 +00002673/* s.setblocking(flag) method. Argument:
2674 False -- non-blocking mode; same as settimeout(0)
2675 True -- blocking mode; same as settimeout(None)
2676*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002677
Guido van Rossum73624e91994-10-10 17:59:00 +00002678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002680{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002681 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 block = PyLong_AsLong(arg);
2684 if (block == -1 && PyErr_Occurred())
2685 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686
Victor Stinner9001d802015-04-06 23:06:01 +02002687 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002688 if (internal_setblocking(s, block) == -1) {
2689 return NULL;
2690 }
2691 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002692}
Guido van Rossume4485b01994-09-07 14:32:49 +00002693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002694PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002695"setblocking(flag)\n\
2696\n\
2697Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002698setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700
Yury Selivanovf11b4602018-01-28 17:27:38 -05002701/* s.getblocking() method.
2702 Returns True if socket is in blocking mode,
2703 False if it is in non-blocking mode.
2704*/
2705static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302706sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002707{
2708 if (s->sock_timeout) {
2709 Py_RETURN_TRUE;
2710 }
2711 else {
2712 Py_RETURN_FALSE;
2713 }
2714}
2715
2716PyDoc_STRVAR(getblocking_doc,
2717"getblocking()\n\
2718\n\
2719Returns True if socket is in blocking mode, or False if it\n\
2720is in non-blocking mode.");
2721
Victor Stinner71694d52015-03-28 01:18:54 +01002722static int
2723socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2724{
2725#ifdef MS_WINDOWS
2726 struct timeval tv;
2727#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002728#ifndef HAVE_POLL
2729 _PyTime_t ms;
2730#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002731 int overflow = 0;
2732
2733 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002734 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002735 return 0;
2736 }
2737
Victor Stinner869e1772015-03-30 03:49:14 +02002738 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002739 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002740 return -1;
2741
2742 if (*timeout < 0) {
2743 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2744 return -1;
2745 }
2746
2747#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002748 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002749#endif
2750#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002751 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002752 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002753#endif
2754 if (overflow) {
2755 PyErr_SetString(PyExc_OverflowError,
2756 "timeout doesn't fit into C timeval");
2757 return -1;
2758 }
2759
2760 return 0;
2761}
2762
Guido van Rossum11ba0942002-06-13 15:07:44 +00002763/* s.settimeout(timeout) method. Argument:
2764 None -- no timeout, blocking mode; same as setblocking(True)
2765 0.0 -- non-blocking mode; same as setblocking(False)
2766 > 0 -- timeout mode; operations time out after timeout seconds
2767 < 0 -- illegal; raises an exception
2768*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002770sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002771{
Victor Stinner71694d52015-03-28 01:18:54 +01002772 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002773
Victor Stinner71694d52015-03-28 01:18:54 +01002774 if (socket_parse_timeout(&timeout, arg) < 0)
2775 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002778
2779 int block = timeout < 0;
2780 /* Blocking mode for a Python socket object means that operations
2781 like :meth:`recv` or :meth:`sendall` will block the execution of
2782 the current thread until they are complete or aborted with a
2783 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2784 the underlying FD is in a blocking mode. When timeout is a positive
2785 number, the FD is in a non-blocking mode, and socket ops are
2786 implemented with a `select()` call.
2787
2788 When timeout is 0.0, the FD is in a non-blocking mode.
2789
2790 This table summarizes all states in which the socket object and
2791 its underlying FD can be:
2792
2793 ==================== ===================== ==============
2794 `gettimeout()` `getblocking()` FD
2795 ==================== ===================== ==============
2796 ``None`` ``True`` blocking
2797 ``0.0`` ``False`` non-blocking
2798 ``> 0`` ``True`` non-blocking
2799 */
2800
2801 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002802 return NULL;
2803 }
2804 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002805}
2806
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002807PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002808"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002809\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002810Set a timeout on socket operations. 'timeout' can be a float,\n\
2811giving in seconds, or None. Setting a timeout of None disables\n\
2812the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002813Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002814
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002815/* s.gettimeout() method.
2816 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002817static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302818sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002819{
Victor Stinner71694d52015-03-28 01:18:54 +01002820 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002821 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 }
Victor Stinner71694d52015-03-28 01:18:54 +01002823 else {
2824 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2825 return PyFloat_FromDouble(seconds);
2826 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827}
2828
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002829PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002830"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002831\n\
oldkaa0735f2018-02-02 16:52:55 +08002832Returns the timeout in seconds (float) associated with socket\n\
2833operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002835
Guido van Rossumaee08791992-09-08 09:05:33 +00002836/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002837 With an integer third argument, sets an integer optval with optlen=4.
2838 With None as third argument and an integer fourth argument, set
2839 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002840 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002841 use optional built-in module 'struct' to encode the string.
2842*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002843
Guido van Rossum73624e91994-10-10 17:59:00 +00002844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002845sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 int level;
2848 int optname;
2849 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002850 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002852 unsigned int optlen;
2853 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002854
caaveryeffc12f2017-09-06 18:18:10 -04002855#ifdef AF_VSOCK
2856 if (s->sock_family == AF_VSOCK) {
2857 uint64_t vflag; // Must be set width of 64 bits
2858 /* setsockopt(level, opt, flag) */
2859 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2860 &level, &optname, &vflag)) {
2861 // level should always be set to AF_VSOCK
2862 res = setsockopt(s->sock_fd, level, optname,
2863 (void*)&vflag, sizeof vflag);
2864 goto done;
2865 }
2866 return NULL;
2867 }
2868#endif
2869
Christian Heimesdffa3942016-09-05 23:54:41 +02002870 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 if (PyArg_ParseTuple(args, "iii:setsockopt",
2872 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002873 res = setsockopt(s->sock_fd, level, optname,
2874 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002875 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002877
2878 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002879 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002880 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2881 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2882 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002883 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002884 NULL, (socklen_t)optlen);
2885 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002887
2888 PyErr_Clear();
2889 /* setsockopt(level, opt, buffer) */
2890 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2891 &level, &optname, &optval))
2892 return NULL;
2893
2894#ifdef MS_WINDOWS
2895 if (optval.len > INT_MAX) {
2896 PyBuffer_Release(&optval);
2897 PyErr_Format(PyExc_OverflowError,
2898 "socket option is larger than %i bytes",
2899 INT_MAX);
2900 return NULL;
2901 }
2902 res = setsockopt(s->sock_fd, level, optname,
2903 optval.buf, (int)optval.len);
2904#else
2905 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2906#endif
2907 PyBuffer_Release(&optval);
2908
2909done:
Victor Stinnercc739322016-03-23 21:35:29 +01002910 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002912 }
2913
2914 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002915}
2916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002917PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002918"setsockopt(level, option, value: int)\n\
2919setsockopt(level, option, value: buffer)\n\
2920setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002921\n\
2922Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002923The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002924None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002925
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002926
Guido van Rossumaee08791992-09-08 09:05:33 +00002927/* s.getsockopt() method.
2928 With two arguments, retrieves an integer option.
2929 With a third integer argument, retrieves a string buffer of that size;
2930 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002931
Guido van Rossum73624e91994-10-10 17:59:00 +00002932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002933sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 int level;
2936 int optname;
2937 int res;
2938 PyObject *buf;
2939 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002940 int flag = 0;
2941 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2944 &level, &optname, &buflen))
2945 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002948#ifdef AF_VSOCK
2949 if (s->sock_family == AF_VSOCK) {
2950 uint64_t vflag = 0; // Must be set width of 64 bits
2951 flagsize = sizeof vflag;
2952 res = getsockopt(s->sock_fd, level, optname,
2953 (void *)&vflag, &flagsize);
2954 if (res < 0)
2955 return s->errorhandler();
2956 return PyLong_FromUnsignedLong(vflag);
2957 }
2958#endif
2959 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 res = getsockopt(s->sock_fd, level, optname,
2961 (void *)&flag, &flagsize);
2962 if (res < 0)
2963 return s->errorhandler();
2964 return PyLong_FromLong(flag);
2965 }
caaveryeffc12f2017-09-06 18:18:10 -04002966#ifdef AF_VSOCK
2967 if (s->sock_family == AF_VSOCK) {
2968 PyErr_SetString(PyExc_OSError,
2969 "getsockopt string buffer not allowed");
2970 return NULL;
2971 }
2972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002974 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 "getsockopt buflen out of range");
2976 return NULL;
2977 }
2978 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2979 if (buf == NULL)
2980 return NULL;
2981 res = getsockopt(s->sock_fd, level, optname,
2982 (void *)PyBytes_AS_STRING(buf), &buflen);
2983 if (res < 0) {
2984 Py_DECREF(buf);
2985 return s->errorhandler();
2986 }
2987 _PyBytes_Resize(&buf, buflen);
2988 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002989}
2990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002991PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002992"getsockopt(level, option[, buffersize]) -> value\n\
2993\n\
2994Get a socket option. See the Unix manual for level and option.\n\
2995If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002996string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002997
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002998
Fred Drake728819a2000-07-01 03:40:12 +00002999/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003000
Guido van Rossum73624e91994-10-10 17:59:00 +00003001static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003002sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 sock_addr_t addrbuf;
3005 int addrlen;
3006 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003007
Oren Milman735171e2018-09-11 19:51:29 +03003008 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003010 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 Py_BEGIN_ALLOW_THREADS
3012 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3013 Py_END_ALLOW_THREADS
3014 if (res < 0)
3015 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003016 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003017}
3018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003019PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003020"bind(address)\n\
3021\n\
3022Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003023pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003024sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003025
Guido van Rossum30a685f1991-06-27 15:51:29 +00003026
3027/* s.close() method.
3028 Set the file descriptor to -1 so operations tried subsequently
3029 will surely fail. */
3030
Guido van Rossum73624e91994-10-10 17:59:00 +00003031static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303032sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003035 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003036
Victor Stinner19a8e842016-03-21 16:36:48 +01003037 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003038 if (fd != INVALID_SOCKET) {
3039 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003040
3041 /* We do not want to retry upon EINTR: see
3042 http://lwn.net/Articles/576478/ and
3043 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3044 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003046 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003048 /* bpo-30319: The peer can already have closed the connection.
3049 Python ignores ECONNRESET on close(). */
3050 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003051 return s->errorhandler();
3052 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003054 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003055}
3056
Christian Heimesd0e31b92018-01-27 09:54:13 +01003057PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003058"close()\n\
3059\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003060Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003061
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003062static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303063sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003064{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003065 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003066 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003067 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003068}
3069
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003070PyDoc_STRVAR(detach_doc,
3071"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003072\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003073Close the socket object without closing the underlying file descriptor.\n\
3074The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003075can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003076
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003077static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003078sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003079{
Victor Stinner81c41db2015-04-02 11:50:57 +02003080 int err;
3081 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003082
Victor Stinner81c41db2015-04-02 11:50:57 +02003083 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3084 /* getsockopt() failed */
3085 return 0;
3086 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003087
Victor Stinner81c41db2015-04-02 11:50:57 +02003088 if (err == EISCONN)
3089 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003090 if (err != 0) {
3091 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3092 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003093 return 0;
3094 }
3095 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003096}
3097
3098static int
3099internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3100 int raise)
3101{
3102 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003103
3104 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003106 Py_END_ALLOW_THREADS
3107
Victor Stinner70a46f62015-03-31 22:03:59 +02003108 if (!res) {
3109 /* connect() succeeded, the socket is connected */
3110 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003112
Victor Stinner81c41db2015-04-02 11:50:57 +02003113 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003114
Victor Stinner81c41db2015-04-02 11:50:57 +02003115 /* save error, PyErr_CheckSignals() can replace it */
3116 err = GET_SOCK_ERROR;
3117 if (CHECK_ERRNO(EINTR)) {
3118 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003119 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003120
3121 /* Issue #23618: when connect() fails with EINTR, the connection is
3122 running asynchronously.
3123
3124 If the socket is blocking or has a timeout, wait until the
3125 connection completes, fails or timed out using select(), and then
3126 get the connection status using getsockopt(SO_ERROR).
3127
3128 If the socket is non-blocking, raise InterruptedError. The caller is
3129 responsible to wait until the connection completes, fails or timed
3130 out (it's the case in asyncio for example). */
3131 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3132 }
3133 else {
3134 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3135 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003136 }
3137
Victor Stinner81c41db2015-04-02 11:50:57 +02003138 if (!wait_connect) {
3139 if (raise) {
3140 /* restore error, maybe replaced by PyErr_CheckSignals() */
3141 SET_SOCK_ERROR(err);
3142 s->errorhandler();
3143 return -1;
3144 }
3145 else
3146 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003147 }
3148
Victor Stinner81c41db2015-04-02 11:50:57 +02003149 if (raise) {
3150 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003151 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3152 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003153 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003154 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003155 else {
3156 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003157 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3158 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003159 return err;
3160 }
3161 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003162}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003163
Fred Drake728819a2000-07-01 03:40:12 +00003164/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003165
Guido van Rossum73624e91994-10-10 17:59:00 +00003166static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003167sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 sock_addr_t addrbuf;
3170 int addrlen;
3171 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003172
Oren Milman735171e2018-09-11 19:51:29 +03003173 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003175 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003176
Victor Stinner81c41db2015-04-02 11:50:57 +02003177 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003178 if (res < 0)
3179 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003180
Victor Stinneree699e92015-03-31 21:28:42 +02003181 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003182}
3183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003184PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003185"connect(address)\n\
3186\n\
3187Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003188is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003189
Guido van Rossum30a685f1991-06-27 15:51:29 +00003190
Fred Drake728819a2000-07-01 03:40:12 +00003191/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003192
3193static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003194sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 sock_addr_t addrbuf;
3197 int addrlen;
3198 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003199
Oren Milman735171e2018-09-11 19:51:29 +03003200 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003202 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003203
Victor Stinner81c41db2015-04-02 11:50:57 +02003204 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003205 if (res < 0)
3206 return NULL;
3207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003209}
3210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003211PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003212"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003213\n\
3214This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003215instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003216
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003217
Guido van Rossumed233a51992-06-23 09:07:03 +00003218/* s.fileno() method */
3219
Guido van Rossum73624e91994-10-10 17:59:00 +00003220static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303221sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003224}
3225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003226PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003227"fileno() -> integer\n\
3228\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003229Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003230
Guido van Rossumed233a51992-06-23 09:07:03 +00003231
Guido van Rossumc89705d1992-11-26 08:54:07 +00003232/* s.getsockname() method */
3233
Guido van Rossum73624e91994-10-10 17:59:00 +00003234static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303235sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 sock_addr_t addrbuf;
3238 int res;
3239 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (!getsockaddrlen(s, &addrlen))
3242 return NULL;
3243 memset(&addrbuf, 0, addrlen);
3244 Py_BEGIN_ALLOW_THREADS
3245 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3246 Py_END_ALLOW_THREADS
3247 if (res < 0)
3248 return s->errorhandler();
3249 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3250 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003251}
3252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003253PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003254"getsockname() -> address info\n\
3255\n\
3256Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003257info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003258
Guido van Rossumc89705d1992-11-26 08:54:07 +00003259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003261/* s.getpeername() method */
3262
Guido van Rossum73624e91994-10-10 17:59:00 +00003263static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303264sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 sock_addr_t addrbuf;
3267 int res;
3268 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 if (!getsockaddrlen(s, &addrlen))
3271 return NULL;
3272 memset(&addrbuf, 0, addrlen);
3273 Py_BEGIN_ALLOW_THREADS
3274 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3275 Py_END_ALLOW_THREADS
3276 if (res < 0)
3277 return s->errorhandler();
3278 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3279 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003280}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003282PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003283"getpeername() -> address info\n\
3284\n\
3285Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003286info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003287
Guido van Rossumb6775db1994-08-01 11:34:53 +00003288#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003289
3290
Guido van Rossum30a685f1991-06-27 15:51:29 +00003291/* s.listen(n) method */
3292
Guido van Rossum73624e91994-10-10 17:59:00 +00003293static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003294sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003295{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003296 /* We try to choose a default backlog high enough to avoid connection drops
3297 * for common workloads, yet not too high to limit resource usage. */
3298 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003300
Charles-François Natali644b8f52014-05-22 19:45:39 +01003301 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003305 /* To avoid problems on systems that don't allow a negative backlog
3306 * (which doesn't make sense anyway) we force a minimum value of 0. */
3307 if (backlog < 0)
3308 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 res = listen(s->sock_fd, backlog);
3310 Py_END_ALLOW_THREADS
3311 if (res < 0)
3312 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003313 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003314}
3315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003316PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003317"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003318\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003319Enable a server to accept connections. If backlog is specified, it must be\n\
3320at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003321unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003322connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003323
Victor Stinner31bf2d52015-04-01 21:57:09 +02003324struct sock_recv {
3325 char *cbuf;
3326 Py_ssize_t len;
3327 int flags;
3328 Py_ssize_t result;
3329};
3330
3331static int
3332sock_recv_impl(PySocketSockObject *s, void *data)
3333{
3334 struct sock_recv *ctx = data;
3335
3336#ifdef MS_WINDOWS
3337 if (ctx->len > INT_MAX)
3338 ctx->len = INT_MAX;
3339 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3340#else
3341 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3342#endif
3343 return (ctx->result >= 0);
3344}
3345
Guido van Rossum82a5c661998-07-07 20:45:43 +00003346
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003348 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003349 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003350 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003351 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003352 * also possible that we return a number of bytes smaller than the request
3353 * bytes.
3354 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003355
Antoine Pitrou19467d22010-08-17 19:33:30 +00003356static Py_ssize_t
3357sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003358{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003359 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 if (!IS_SELECTABLE(s)) {
3362 select_error();
3363 return -1;
3364 }
3365 if (len == 0) {
3366 /* If 0 bytes were requested, do nothing. */
3367 return 0;
3368 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003369
Victor Stinner31bf2d52015-04-01 21:57:09 +02003370 ctx.cbuf = cbuf;
3371 ctx.len = len;
3372 ctx.flags = flags;
3373 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003375
3376 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003377}
3378
Guido van Rossum48a680c2001-03-02 06:34:14 +00003379
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003380/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003381
Guido van Rossum73624e91994-10-10 17:59:00 +00003382static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003383sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003384{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003385 Py_ssize_t recvlen, outlen;
3386 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003388
Antoine Pitrou19467d22010-08-17 19:33:30 +00003389 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 if (recvlen < 0) {
3393 PyErr_SetString(PyExc_ValueError,
3394 "negative buffersize in recv");
3395 return NULL;
3396 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 /* Allocate a new string. */
3399 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3400 if (buf == NULL)
3401 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 /* Call the guts */
3404 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3405 if (outlen < 0) {
3406 /* An error occurred, release the string and return an
3407 error. */
3408 Py_DECREF(buf);
3409 return NULL;
3410 }
3411 if (outlen != recvlen) {
3412 /* We did not read as many bytes as we anticipated, resize the
3413 string if possible and be successful. */
3414 _PyBytes_Resize(&buf, outlen);
3415 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003418}
3419
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003420PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003421"recv(buffersize[, flags]) -> data\n\
3422\n\
3423Receive up to buffersize bytes from the socket. For the optional flags\n\
3424argument, see the Unix manual. When no data is available, block until\n\
3425at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003426the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003427
Guido van Rossum30a685f1991-06-27 15:51:29 +00003428
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003429/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003430
Thomas Wouters477c8d52006-05-27 19:21:47 +00003431static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003432sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003435
Antoine Pitrou19467d22010-08-17 19:33:30 +00003436 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 Py_buffer pbuf;
3438 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003439 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003442 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 &pbuf, &recvlen, &flags))
3444 return NULL;
3445 buf = pbuf.buf;
3446 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (recvlen < 0) {
3449 PyBuffer_Release(&pbuf);
3450 PyErr_SetString(PyExc_ValueError,
3451 "negative buffersize in recv_into");
3452 return NULL;
3453 }
3454 if (recvlen == 0) {
3455 /* If nbytes was not specified, use the buffer's length */
3456 recvlen = buflen;
3457 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 /* Check if the buffer is large enough */
3460 if (buflen < recvlen) {
3461 PyBuffer_Release(&pbuf);
3462 PyErr_SetString(PyExc_ValueError,
3463 "buffer too small for requested bytes");
3464 return NULL;
3465 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 /* Call the guts */
3468 readlen = sock_recv_guts(s, buf, recvlen, flags);
3469 if (readlen < 0) {
3470 /* Return an error. */
3471 PyBuffer_Release(&pbuf);
3472 return NULL;
3473 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 PyBuffer_Release(&pbuf);
3476 /* Return the number of bytes read. Note that we do not do anything
3477 special here in the case that readlen < recvlen. */
3478 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003479}
3480
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003481PyDoc_STRVAR(recv_into_doc,
3482"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003483\n\
oldkaa0735f2018-02-02 16:52:55 +08003484A version of recv() that stores its data into a buffer rather than creating\n\
3485a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003486is not specified (or 0), receive up to the size available in the given buffer.\n\
3487\n\
3488See recv() for documentation about the flags.");
3489
Victor Stinner31bf2d52015-04-01 21:57:09 +02003490struct sock_recvfrom {
3491 char* cbuf;
3492 Py_ssize_t len;
3493 int flags;
3494 socklen_t *addrlen;
3495 sock_addr_t *addrbuf;
3496 Py_ssize_t result;
3497};
3498
3499static int
3500sock_recvfrom_impl(PySocketSockObject *s, void *data)
3501{
3502 struct sock_recvfrom *ctx = data;
3503
3504 memset(ctx->addrbuf, 0, *ctx->addrlen);
3505
3506#ifdef MS_WINDOWS
3507 if (ctx->len > INT_MAX)
3508 ctx->len = INT_MAX;
3509 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3510 SAS2SA(ctx->addrbuf), ctx->addrlen);
3511#else
3512 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3513 SAS2SA(ctx->addrbuf), ctx->addrlen);
3514#endif
3515 return (ctx->result >= 0);
3516}
3517
Thomas Wouters477c8d52006-05-27 19:21:47 +00003518
3519/*
Christian Heimes99170a52007-12-19 02:07:34 +00003520 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3521 * into a char buffer. If you have any inc/def ref to do to the objects that
3522 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003523 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003524 * that it is also possible that we return a number of bytes smaller than the
3525 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003526 *
3527 * 'addr' is a return value for the address object. Note that you must decref
3528 * it yourself.
3529 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003530static Py_ssize_t
3531sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003536 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 if (!getsockaddrlen(s, &addrlen))
3541 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 if (!IS_SELECTABLE(s)) {
3544 select_error();
3545 return -1;
3546 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003547
Victor Stinner31bf2d52015-04-01 21:57:09 +02003548 ctx.cbuf = cbuf;
3549 ctx.len = len;
3550 ctx.flags = flags;
3551 ctx.addrbuf = &addrbuf;
3552 ctx.addrlen = &addrlen;
3553 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003555
Victor Stinner31bf2d52015-04-01 21:57:09 +02003556 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3557 s->sock_proto);
3558 if (*addr == NULL)
3559 return -1;
3560
3561 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003562}
3563
3564/* s.recvfrom(nbytes [,flags]) method */
3565
3566static PyObject *
3567sock_recvfrom(PySocketSockObject *s, PyObject *args)
3568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 PyObject *buf = NULL;
3570 PyObject *addr = NULL;
3571 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003572 int flags = 0;
3573 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003574
Antoine Pitrou19467d22010-08-17 19:33:30 +00003575 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 if (recvlen < 0) {
3579 PyErr_SetString(PyExc_ValueError,
3580 "negative buffersize in recvfrom");
3581 return NULL;
3582 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003584 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3585 if (buf == NULL)
3586 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3589 recvlen, flags, &addr);
3590 if (outlen < 0) {
3591 goto finally;
3592 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 if (outlen != recvlen) {
3595 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003596 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003598 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 goto finally;
3600 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003603
3604finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 Py_XDECREF(buf);
3606 Py_XDECREF(addr);
3607 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003608}
3609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003610PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003611"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3612\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003613Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003614
Thomas Wouters477c8d52006-05-27 19:21:47 +00003615
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003616/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003617
3618static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003619sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003622
Antoine Pitrou19467d22010-08-17 19:33:30 +00003623 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624 Py_buffer pbuf;
3625 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003626 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003629
Antoine Pitrou19467d22010-08-17 19:33:30 +00003630 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 kwlist, &pbuf,
3632 &recvlen, &flags))
3633 return NULL;
3634 buf = pbuf.buf;
3635 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 if (recvlen < 0) {
3638 PyBuffer_Release(&pbuf);
3639 PyErr_SetString(PyExc_ValueError,
3640 "negative buffersize in recvfrom_into");
3641 return NULL;
3642 }
3643 if (recvlen == 0) {
3644 /* If nbytes was not specified, use the buffer's length */
3645 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003646 } else if (recvlen > buflen) {
3647 PyBuffer_Release(&pbuf);
3648 PyErr_SetString(PyExc_ValueError,
3649 "nbytes is greater than the length of the buffer");
3650 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3654 if (readlen < 0) {
3655 PyBuffer_Release(&pbuf);
3656 /* Return an error */
3657 Py_XDECREF(addr);
3658 return NULL;
3659 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 PyBuffer_Release(&pbuf);
3662 /* Return the number of bytes read and the address. Note that we do
3663 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003664 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003665}
3666
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003667PyDoc_STRVAR(recvfrom_into_doc,
3668"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003669\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003670Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003671
Victor Stinner35bee932015-04-02 12:28:07 +02003672/* The sendmsg() and recvmsg[_into]() methods require a working
3673 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3674#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003675struct sock_recvmsg {
3676 struct msghdr *msg;
3677 int flags;
3678 ssize_t result;
3679};
3680
3681static int
3682sock_recvmsg_impl(PySocketSockObject *s, void *data)
3683{
3684 struct sock_recvmsg *ctx = data;
3685
3686 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3687 return (ctx->result >= 0);
3688}
3689
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003690/*
3691 * Call recvmsg() with the supplied iovec structures, flags, and
3692 * ancillary data buffer size (controllen). Returns the tuple return
3693 * value for recvmsg() or recvmsg_into(), with the first item provided
3694 * by the supplied makeval() function. makeval() will be called with
3695 * the length read and makeval_data as arguments, and must return a
3696 * new reference (which will be decrefed if there is a subsequent
3697 * error). On error, closes any file descriptors received via
3698 * SCM_RIGHTS.
3699 */
3700static PyObject *
3701sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3702 int flags, Py_ssize_t controllen,
3703 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3704{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003705 sock_addr_t addrbuf;
3706 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003707 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 PyObject *cmsg_list = NULL, *retval = NULL;
3709 void *controlbuf = NULL;
3710 struct cmsghdr *cmsgh;
3711 size_t cmsgdatalen = 0;
3712 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003713 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003714
3715 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3716 ignored" when the socket is connected (Linux fills them in
3717 anyway for AF_UNIX sockets at least). Normally msg_namelen
3718 seems to be set to 0 if there's no address, but try to
3719 initialize msg_name to something that won't be mistaken for a
3720 real address if that doesn't happen. */
3721 if (!getsockaddrlen(s, &addrbuflen))
3722 return NULL;
3723 memset(&addrbuf, 0, addrbuflen);
3724 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3725
3726 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3727 PyErr_SetString(PyExc_ValueError,
3728 "invalid ancillary data buffer length");
3729 return NULL;
3730 }
3731 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3732 return PyErr_NoMemory();
3733
3734 /* Make the system call. */
3735 if (!IS_SELECTABLE(s)) {
3736 select_error();
3737 goto finally;
3738 }
3739
Victor Stinner31bf2d52015-04-01 21:57:09 +02003740 msg.msg_name = SAS2SA(&addrbuf);
3741 msg.msg_namelen = addrbuflen;
3742 msg.msg_iov = iov;
3743 msg.msg_iovlen = iovlen;
3744 msg.msg_control = controlbuf;
3745 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003746
Victor Stinner31bf2d52015-04-01 21:57:09 +02003747 ctx.msg = &msg;
3748 ctx.flags = flags;
3749 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003750 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003751
3752 /* Make list of (level, type, data) tuples from control messages. */
3753 if ((cmsg_list = PyList_New(0)) == NULL)
3754 goto err_closefds;
3755 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3756 implementations didn't do so. */
3757 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3758 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3759 PyObject *bytes, *tuple;
3760 int tmp;
3761
3762 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3763 if (cmsg_status != 0) {
3764 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3765 "received malformed or improperly-truncated "
3766 "ancillary data", 1) == -1)
3767 goto err_closefds;
3768 }
3769 if (cmsg_status < 0)
3770 break;
3771 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003772 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003773 goto err_closefds;
3774 }
3775
3776 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3777 cmsgdatalen);
3778 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3779 (int)cmsgh->cmsg_type, bytes);
3780 if (tuple == NULL)
3781 goto err_closefds;
3782 tmp = PyList_Append(cmsg_list, tuple);
3783 Py_DECREF(tuple);
3784 if (tmp != 0)
3785 goto err_closefds;
3786
3787 if (cmsg_status != 0)
3788 break;
3789 }
3790
3791 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003792 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003793 cmsg_list,
3794 (int)msg.msg_flags,
3795 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3796 ((msg.msg_namelen > addrbuflen) ?
3797 addrbuflen : msg.msg_namelen),
3798 s->sock_proto));
3799 if (retval == NULL)
3800 goto err_closefds;
3801
3802finally:
3803 Py_XDECREF(cmsg_list);
3804 PyMem_Free(controlbuf);
3805 return retval;
3806
3807err_closefds:
3808#ifdef SCM_RIGHTS
3809 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3810 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3811 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3812 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3813 if (cmsg_status < 0)
3814 break;
3815 if (cmsgh->cmsg_level == SOL_SOCKET &&
3816 cmsgh->cmsg_type == SCM_RIGHTS) {
3817 size_t numfds;
3818 int *fdp;
3819
3820 numfds = cmsgdatalen / sizeof(int);
3821 fdp = (int *)CMSG_DATA(cmsgh);
3822 while (numfds-- > 0)
3823 close(*fdp++);
3824 }
3825 if (cmsg_status != 0)
3826 break;
3827 }
3828#endif /* SCM_RIGHTS */
3829 goto finally;
3830}
3831
3832
3833static PyObject *
3834makeval_recvmsg(ssize_t received, void *data)
3835{
3836 PyObject **buf = data;
3837
3838 if (received < PyBytes_GET_SIZE(*buf))
3839 _PyBytes_Resize(buf, received);
3840 Py_XINCREF(*buf);
3841 return *buf;
3842}
3843
3844/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3845
3846static PyObject *
3847sock_recvmsg(PySocketSockObject *s, PyObject *args)
3848{
3849 Py_ssize_t bufsize, ancbufsize = 0;
3850 int flags = 0;
3851 struct iovec iov;
3852 PyObject *buf = NULL, *retval = NULL;
3853
3854 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3855 return NULL;
3856
3857 if (bufsize < 0) {
3858 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3859 return NULL;
3860 }
3861 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3862 return NULL;
3863 iov.iov_base = PyBytes_AS_STRING(buf);
3864 iov.iov_len = bufsize;
3865
3866 /* Note that we're passing a pointer to *our pointer* to the bytes
3867 object here (&buf); makeval_recvmsg() may incref the object, or
3868 deallocate it and set our pointer to NULL. */
3869 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3870 &makeval_recvmsg, &buf);
3871 Py_XDECREF(buf);
3872 return retval;
3873}
3874
3875PyDoc_STRVAR(recvmsg_doc,
3876"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3877\n\
3878Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3879socket. The ancbufsize argument sets the size in bytes of the\n\
3880internal buffer used to receive the ancillary data; it defaults to 0,\n\
3881meaning that no ancillary data will be received. Appropriate buffer\n\
3882sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3883CMSG_LEN(), and items which do not fit into the buffer might be\n\
3884truncated or discarded. The flags argument defaults to 0 and has the\n\
3885same meaning as for recv().\n\
3886\n\
3887The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3888The data item is a bytes object holding the non-ancillary data\n\
3889received. The ancdata item is a list of zero or more tuples\n\
3890(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3891(control messages) received: cmsg_level and cmsg_type are integers\n\
3892specifying the protocol level and protocol-specific type respectively,\n\
3893and cmsg_data is a bytes object holding the associated data. The\n\
3894msg_flags item is the bitwise OR of various flags indicating\n\
3895conditions on the received message; see your system documentation for\n\
3896details. If the receiving socket is unconnected, address is the\n\
3897address of the sending socket, if available; otherwise, its value is\n\
3898unspecified.\n\
3899\n\
3900If recvmsg() raises an exception after the system call returns, it\n\
3901will first attempt to close any file descriptors received via the\n\
3902SCM_RIGHTS mechanism.");
3903
3904
3905static PyObject *
3906makeval_recvmsg_into(ssize_t received, void *data)
3907{
3908 return PyLong_FromSsize_t(received);
3909}
3910
3911/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3912
3913static PyObject *
3914sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3915{
3916 Py_ssize_t ancbufsize = 0;
3917 int flags = 0;
3918 struct iovec *iovs = NULL;
3919 Py_ssize_t i, nitems, nbufs = 0;
3920 Py_buffer *bufs = NULL;
3921 PyObject *buffers_arg, *fast, *retval = NULL;
3922
3923 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3924 &buffers_arg, &ancbufsize, &flags))
3925 return NULL;
3926
3927 if ((fast = PySequence_Fast(buffers_arg,
3928 "recvmsg_into() argument 1 must be an "
3929 "iterable")) == NULL)
3930 return NULL;
3931 nitems = PySequence_Fast_GET_SIZE(fast);
3932 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003933 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003934 goto finally;
3935 }
3936
3937 /* Fill in an iovec for each item, and save the Py_buffer
3938 structs to release afterwards. */
3939 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3940 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3941 PyErr_NoMemory();
3942 goto finally;
3943 }
3944 for (; nbufs < nitems; nbufs++) {
3945 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3946 "w*;recvmsg_into() argument 1 must be an iterable "
3947 "of single-segment read-write buffers",
3948 &bufs[nbufs]))
3949 goto finally;
3950 iovs[nbufs].iov_base = bufs[nbufs].buf;
3951 iovs[nbufs].iov_len = bufs[nbufs].len;
3952 }
3953
3954 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3955 &makeval_recvmsg_into, NULL);
3956finally:
3957 for (i = 0; i < nbufs; i++)
3958 PyBuffer_Release(&bufs[i]);
3959 PyMem_Free(bufs);
3960 PyMem_Free(iovs);
3961 Py_DECREF(fast);
3962 return retval;
3963}
3964
3965PyDoc_STRVAR(recvmsg_into_doc,
3966"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3967\n\
3968Receive normal data and ancillary data from the socket, scattering the\n\
3969non-ancillary data into a series of buffers. The buffers argument\n\
3970must be an iterable of objects that export writable buffers\n\
3971(e.g. bytearray objects); these will be filled with successive chunks\n\
3972of the non-ancillary data until it has all been written or there are\n\
3973no more buffers. The ancbufsize argument sets the size in bytes of\n\
3974the internal buffer used to receive the ancillary data; it defaults to\n\
39750, meaning that no ancillary data will be received. Appropriate\n\
3976buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3977or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3978truncated or discarded. The flags argument defaults to 0 and has the\n\
3979same meaning as for recv().\n\
3980\n\
3981The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3982The nbytes item is the total number of bytes of non-ancillary data\n\
3983written into the buffers. The ancdata item is a list of zero or more\n\
3984tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3985data (control messages) received: cmsg_level and cmsg_type are\n\
3986integers specifying the protocol level and protocol-specific type\n\
3987respectively, and cmsg_data is a bytes object holding the associated\n\
3988data. The msg_flags item is the bitwise OR of various flags\n\
3989indicating conditions on the received message; see your system\n\
3990documentation for details. If the receiving socket is unconnected,\n\
3991address is the address of the sending socket, if available; otherwise,\n\
3992its value is unspecified.\n\
3993\n\
3994If recvmsg_into() raises an exception after the system call returns,\n\
3995it will first attempt to close any file descriptors received via the\n\
3996SCM_RIGHTS mechanism.");
3997#endif /* CMSG_LEN */
3998
3999
Victor Stinner31bf2d52015-04-01 21:57:09 +02004000struct sock_send {
4001 char *buf;
4002 Py_ssize_t len;
4003 int flags;
4004 Py_ssize_t result;
4005};
4006
4007static int
4008sock_send_impl(PySocketSockObject *s, void *data)
4009{
4010 struct sock_send *ctx = data;
4011
4012#ifdef MS_WINDOWS
4013 if (ctx->len > INT_MAX)
4014 ctx->len = INT_MAX;
4015 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4016#else
4017 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4018#endif
4019 return (ctx->result >= 0);
4020}
4021
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004022/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004023
Guido van Rossum73624e91994-10-10 17:59:00 +00004024static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004025sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004026{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004027 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004029 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4032 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 if (!IS_SELECTABLE(s)) {
4035 PyBuffer_Release(&pbuf);
4036 return select_error();
4037 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004038 ctx.buf = pbuf.buf;
4039 ctx.len = pbuf.len;
4040 ctx.flags = flags;
4041 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004042 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 return NULL;
4044 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004045 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004046
4047 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004048}
4049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004050PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004051"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004052\n\
4053Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004054argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004055sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004056
4057
4058/* s.sendall(data [,flags]) method */
4059
4060static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004061sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004064 Py_ssize_t len, n;
4065 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004066 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004067 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004068 int has_timeout = (s->sock_timeout > 0);
4069 _PyTime_t interval = s->sock_timeout;
4070 _PyTime_t deadline = 0;
4071 int deadline_initialized = 0;
4072 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4075 return NULL;
4076 buf = pbuf.buf;
4077 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 if (!IS_SELECTABLE(s)) {
4080 PyBuffer_Release(&pbuf);
4081 return select_error();
4082 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004085 if (has_timeout) {
4086 if (deadline_initialized) {
4087 /* recompute the timeout */
4088 interval = deadline - _PyTime_GetMonotonicClock();
4089 }
4090 else {
4091 deadline_initialized = 1;
4092 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4093 }
4094
4095 if (interval <= 0) {
4096 PyErr_SetString(socket_timeout, "timed out");
4097 goto done;
4098 }
4099 }
4100
Victor Stinner02f32ab2015-04-01 22:53:26 +02004101 ctx.buf = buf;
4102 ctx.len = len;
4103 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004104 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4105 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004106 n = ctx.result;
4107 assert(n >= 0);
4108
4109 buf += n;
4110 len -= n;
4111
4112 /* We must run our signal handlers before looping again.
4113 send() can return a successful partial write when it is
4114 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004115 if (PyErr_CheckSignals())
4116 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004117 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004119
Victor Stinner8912d142015-04-06 23:16:34 +02004120 Py_INCREF(Py_None);
4121 res = Py_None;
4122
4123done:
4124 PyBuffer_Release(&pbuf);
4125 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004126}
4127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004128PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004129"sendall(data[, flags])\n\
4130\n\
4131Send a data string to the socket. For the optional flags\n\
4132argument, see the Unix manual. This calls send() repeatedly\n\
4133until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004134to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004135
Guido van Rossum30a685f1991-06-27 15:51:29 +00004136
Victor Stinner31bf2d52015-04-01 21:57:09 +02004137struct sock_sendto {
4138 char *buf;
4139 Py_ssize_t len;
4140 int flags;
4141 int addrlen;
4142 sock_addr_t *addrbuf;
4143 Py_ssize_t result;
4144};
4145
4146static int
4147sock_sendto_impl(PySocketSockObject *s, void *data)
4148{
4149 struct sock_sendto *ctx = data;
4150
4151#ifdef MS_WINDOWS
4152 if (ctx->len > INT_MAX)
4153 ctx->len = INT_MAX;
4154 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4155 SAS2SA(ctx->addrbuf), ctx->addrlen);
4156#else
4157 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4158 SAS2SA(ctx->addrbuf), ctx->addrlen);
4159#endif
4160 return (ctx->result >= 0);
4161}
4162
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004163/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004164
Guido van Rossum73624e91994-10-10 17:59:00 +00004165static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004166sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 Py_buffer pbuf;
4169 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004170 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004172 int addrlen, flags;
4173 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004176 arglen = PyTuple_Size(args);
4177 switch (arglen) {
4178 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004179 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4180 return NULL;
4181 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004182 break;
4183 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004184 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4185 &pbuf, &flags, &addro)) {
4186 return NULL;
4187 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004188 break;
4189 default:
4190 PyErr_Format(PyExc_TypeError,
4191 "sendto() takes 2 or 3 arguments (%d given)",
4192 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004193 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 if (!IS_SELECTABLE(s)) {
4197 PyBuffer_Release(&pbuf);
4198 return select_error();
4199 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004200
Oren Milman735171e2018-09-11 19:51:29 +03004201 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 PyBuffer_Release(&pbuf);
4203 return NULL;
4204 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004205
Victor Stinner31bf2d52015-04-01 21:57:09 +02004206 ctx.buf = pbuf.buf;
4207 ctx.len = pbuf.len;
4208 ctx.flags = flags;
4209 ctx.addrlen = addrlen;
4210 ctx.addrbuf = &addrbuf;
4211 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004212 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 return NULL;
4214 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004215 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004216
4217 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004218}
4219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004220PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004221"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004222\n\
4223Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004224For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004225
Guido van Rossum30a685f1991-06-27 15:51:29 +00004226
Victor Stinner35bee932015-04-02 12:28:07 +02004227/* The sendmsg() and recvmsg[_into]() methods require a working
4228 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4229#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004230struct sock_sendmsg {
4231 struct msghdr *msg;
4232 int flags;
4233 ssize_t result;
4234};
4235
4236static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004237sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4238 struct msghdr *msg,
4239 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4240 Py_ssize_t ndataparts, ndatabufs = 0;
4241 int result = -1;
4242 struct iovec *iovs = NULL;
4243 PyObject *data_fast = NULL;
4244 Py_buffer *databufs = NULL;
4245
4246 /* Fill in an iovec for each message part, and save the Py_buffer
4247 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004248 data_fast = PySequence_Fast(data_arg,
4249 "sendmsg() argument 1 must be an "
4250 "iterable");
4251 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004252 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004253 }
4254
Christian Heimesdffa3942016-09-05 23:54:41 +02004255 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4256 if (ndataparts > INT_MAX) {
4257 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4258 goto finally;
4259 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004260
Christian Heimesdffa3942016-09-05 23:54:41 +02004261 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004262 if (ndataparts > 0) {
4263 iovs = PyMem_New(struct iovec, ndataparts);
4264 if (iovs == NULL) {
4265 PyErr_NoMemory();
4266 goto finally;
4267 }
4268 msg->msg_iov = iovs;
4269
4270 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004271 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004272 PyErr_NoMemory();
4273 goto finally;
4274 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004275 }
4276 for (; ndatabufs < ndataparts; ndatabufs++) {
4277 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4278 "y*;sendmsg() argument 1 must be an iterable of "
4279 "bytes-like objects",
4280 &databufs[ndatabufs]))
4281 goto finally;
4282 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4283 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4284 }
4285 result = 0;
4286 finally:
4287 *databufsout = databufs;
4288 *ndatabufsout = ndatabufs;
4289 Py_XDECREF(data_fast);
4290 return result;
4291}
4292
4293static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004294sock_sendmsg_impl(PySocketSockObject *s, void *data)
4295{
4296 struct sock_sendmsg *ctx = data;
4297
4298 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4299 return (ctx->result >= 0);
4300}
4301
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004302/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4303
4304static PyObject *
4305sock_sendmsg(PySocketSockObject *s, PyObject *args)
4306{
Christian Heimesdffa3942016-09-05 23:54:41 +02004307 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004308 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004309 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004310 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004311 struct cmsginfo {
4312 int level;
4313 int type;
4314 Py_buffer data;
4315 } *cmsgs = NULL;
4316 void *controlbuf = NULL;
4317 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004318 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004319 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004320 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004321 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004322
4323 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004324 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004325 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004326 }
4327
4328 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004329
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004330 /* Parse destination address. */
4331 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004332 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4333 "sendmsg"))
4334 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004335 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004336 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004337 msg.msg_name = &addrbuf;
4338 msg.msg_namelen = addrlen;
4339 }
4340
4341 /* Fill in an iovec for each message part, and save the Py_buffer
4342 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004343 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004344 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004345 }
4346
4347 if (cmsg_arg == NULL)
4348 ncmsgs = 0;
4349 else {
4350 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4351 "sendmsg() argument 2 must be an "
4352 "iterable")) == NULL)
4353 goto finally;
4354 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4355 }
4356
4357#ifndef CMSG_SPACE
4358 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004359 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004360 "sending multiple control messages is not supported "
4361 "on this system");
4362 goto finally;
4363 }
4364#endif
4365 /* Save level, type and Py_buffer for each control message,
4366 and calculate total size. */
4367 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4368 PyErr_NoMemory();
4369 goto finally;
4370 }
4371 controllen = controllen_last = 0;
4372 while (ncmsgbufs < ncmsgs) {
4373 size_t bufsize, space;
4374
4375 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4376 "(iiy*):[sendmsg() ancillary data items]",
4377 &cmsgs[ncmsgbufs].level,
4378 &cmsgs[ncmsgbufs].type,
4379 &cmsgs[ncmsgbufs].data))
4380 goto finally;
4381 bufsize = cmsgs[ncmsgbufs++].data.len;
4382
4383#ifdef CMSG_SPACE
4384 if (!get_CMSG_SPACE(bufsize, &space)) {
4385#else
4386 if (!get_CMSG_LEN(bufsize, &space)) {
4387#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004388 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389 goto finally;
4390 }
4391 controllen += space;
4392 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004393 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004394 goto finally;
4395 }
4396 controllen_last = controllen;
4397 }
4398
4399 /* Construct ancillary data block from control message info. */
4400 if (ncmsgbufs > 0) {
4401 struct cmsghdr *cmsgh = NULL;
4402
Victor Stinner52d61e42016-09-12 11:41:58 +02004403 controlbuf = PyMem_Malloc(controllen);
4404 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004405 PyErr_NoMemory();
4406 goto finally;
4407 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004408 msg.msg_control = controlbuf;
4409
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004410 msg.msg_controllen = controllen;
4411
4412 /* Need to zero out the buffer as a workaround for glibc's
4413 CMSG_NXTHDR() implementation. After getting the pointer to
4414 the next header, it checks its (uninitialized) cmsg_len
4415 member to see if the "message" fits in the buffer, and
4416 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004417 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004418 memset(controlbuf, 0, controllen);
4419
4420 for (i = 0; i < ncmsgbufs; i++) {
4421 size_t msg_len, data_len = cmsgs[i].data.len;
4422 int enough_space = 0;
4423
4424 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4425 if (cmsgh == NULL) {
4426 PyErr_Format(PyExc_RuntimeError,
4427 "unexpected NULL result from %s()",
4428 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4429 goto finally;
4430 }
4431 if (!get_CMSG_LEN(data_len, &msg_len)) {
4432 PyErr_SetString(PyExc_RuntimeError,
4433 "item size out of range for CMSG_LEN()");
4434 goto finally;
4435 }
4436 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4437 size_t space;
4438
4439 cmsgh->cmsg_len = msg_len;
4440 if (get_cmsg_data_space(&msg, cmsgh, &space))
4441 enough_space = (space >= data_len);
4442 }
4443 if (!enough_space) {
4444 PyErr_SetString(PyExc_RuntimeError,
4445 "ancillary data does not fit in calculated "
4446 "space");
4447 goto finally;
4448 }
4449 cmsgh->cmsg_level = cmsgs[i].level;
4450 cmsgh->cmsg_type = cmsgs[i].type;
4451 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4452 }
4453 }
4454
4455 /* Make the system call. */
4456 if (!IS_SELECTABLE(s)) {
4457 select_error();
4458 goto finally;
4459 }
4460
Victor Stinner31bf2d52015-04-01 21:57:09 +02004461 ctx.msg = &msg;
4462 ctx.flags = flags;
4463 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004464 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004465
4466 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467
4468finally:
4469 PyMem_Free(controlbuf);
4470 for (i = 0; i < ncmsgbufs; i++)
4471 PyBuffer_Release(&cmsgs[i].data);
4472 PyMem_Free(cmsgs);
4473 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004474 PyMem_Free(msg.msg_iov);
4475 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004476 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004477 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004478 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004479 return retval;
4480}
4481
4482PyDoc_STRVAR(sendmsg_doc,
4483"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4484\n\
4485Send normal and ancillary data to the socket, gathering the\n\
4486non-ancillary data from a series of buffers and concatenating it into\n\
4487a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004488data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004489The ancdata argument specifies the ancillary data (control messages)\n\
4490as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4491cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4492protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004493is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004494argument defaults to 0 and has the same meaning as for send(). If\n\
4495address is supplied and not None, it sets a destination address for\n\
4496the message. The return value is the number of bytes of non-ancillary\n\
4497data sent.");
4498#endif /* CMSG_LEN */
4499
Christian Heimesdffa3942016-09-05 23:54:41 +02004500#ifdef HAVE_SOCKADDR_ALG
4501static PyObject*
4502sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4503{
4504 PyObject *retval = NULL;
4505
4506 Py_ssize_t i, ndatabufs = 0;
4507 Py_buffer *databufs = NULL;
4508 PyObject *data_arg = NULL;
4509
4510 Py_buffer iv = {NULL, NULL};
4511
4512 PyObject *opobj = NULL;
4513 int op = -1;
4514
4515 PyObject *assoclenobj = NULL;
4516 int assoclen = -1;
4517
4518 unsigned int *uiptr;
4519 int flags = 0;
4520
4521 struct msghdr msg;
4522 struct cmsghdr *header = NULL;
4523 struct af_alg_iv *alg_iv = NULL;
4524 struct sock_sendmsg ctx;
4525 Py_ssize_t controllen;
4526 void *controlbuf = NULL;
4527 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4528
4529 if (self->sock_family != AF_ALG) {
4530 PyErr_SetString(PyExc_OSError,
4531 "algset is only supported for AF_ALG");
4532 return NULL;
4533 }
4534
4535 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4536 "|O$O!y*O!i:sendmsg_afalg", keywords,
4537 &data_arg,
4538 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004539 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004540 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004541 }
4542
4543 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004544
4545 /* op is a required, keyword-only argument >= 0 */
4546 if (opobj != NULL) {
4547 op = _PyLong_AsInt(opobj);
4548 }
4549 if (op < 0) {
4550 /* override exception from _PyLong_AsInt() */
4551 PyErr_SetString(PyExc_TypeError,
4552 "Invalid or missing argument 'op'");
4553 goto finally;
4554 }
4555 /* assoclen is optional but must be >= 0 */
4556 if (assoclenobj != NULL) {
4557 assoclen = _PyLong_AsInt(assoclenobj);
4558 if (assoclen == -1 && PyErr_Occurred()) {
4559 goto finally;
4560 }
4561 if (assoclen < 0) {
4562 PyErr_SetString(PyExc_TypeError,
4563 "assoclen must be positive");
4564 goto finally;
4565 }
4566 }
4567
4568 controllen = CMSG_SPACE(4);
4569 if (iv.buf != NULL) {
4570 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4571 }
4572 if (assoclen >= 0) {
4573 controllen += CMSG_SPACE(4);
4574 }
4575
4576 controlbuf = PyMem_Malloc(controllen);
4577 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004578 PyErr_NoMemory();
4579 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004580 }
4581 memset(controlbuf, 0, controllen);
4582
Christian Heimesdffa3942016-09-05 23:54:41 +02004583 msg.msg_controllen = controllen;
4584 msg.msg_control = controlbuf;
4585
4586 /* Fill in an iovec for each message part, and save the Py_buffer
4587 structs to release afterwards. */
4588 if (data_arg != NULL) {
4589 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4590 goto finally;
4591 }
4592 }
4593
4594 /* set operation to encrypt or decrypt */
4595 header = CMSG_FIRSTHDR(&msg);
4596 if (header == NULL) {
4597 PyErr_SetString(PyExc_RuntimeError,
4598 "unexpected NULL result from CMSG_FIRSTHDR");
4599 goto finally;
4600 }
4601 header->cmsg_level = SOL_ALG;
4602 header->cmsg_type = ALG_SET_OP;
4603 header->cmsg_len = CMSG_LEN(4);
4604 uiptr = (void*)CMSG_DATA(header);
4605 *uiptr = (unsigned int)op;
4606
4607 /* set initialization vector */
4608 if (iv.buf != NULL) {
4609 header = CMSG_NXTHDR(&msg, header);
4610 if (header == NULL) {
4611 PyErr_SetString(PyExc_RuntimeError,
4612 "unexpected NULL result from CMSG_NXTHDR(iv)");
4613 goto finally;
4614 }
4615 header->cmsg_level = SOL_ALG;
4616 header->cmsg_type = ALG_SET_IV;
4617 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4618 alg_iv = (void*)CMSG_DATA(header);
4619 alg_iv->ivlen = iv.len;
4620 memcpy(alg_iv->iv, iv.buf, iv.len);
4621 }
4622
4623 /* set length of associated data for AEAD */
4624 if (assoclen >= 0) {
4625 header = CMSG_NXTHDR(&msg, header);
4626 if (header == NULL) {
4627 PyErr_SetString(PyExc_RuntimeError,
4628 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4629 goto finally;
4630 }
4631 header->cmsg_level = SOL_ALG;
4632 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4633 header->cmsg_len = CMSG_LEN(4);
4634 uiptr = (void*)CMSG_DATA(header);
4635 *uiptr = (unsigned int)assoclen;
4636 }
4637
4638 ctx.msg = &msg;
4639 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004640 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004641 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004642 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004643
4644 retval = PyLong_FromSsize_t(ctx.result);
4645
4646 finally:
4647 PyMem_Free(controlbuf);
4648 if (iv.buf != NULL) {
4649 PyBuffer_Release(&iv);
4650 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004651 PyMem_Free(msg.msg_iov);
4652 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004653 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004654 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004655 PyMem_Free(databufs);
4656 return retval;
4657}
4658
4659PyDoc_STRVAR(sendmsg_afalg_doc,
4660"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4661\n\
4662Set operation mode, IV and length of associated data for an AF_ALG\n\
4663operation socket.");
4664#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004665
Guido van Rossum30a685f1991-06-27 15:51:29 +00004666/* s.shutdown(how) method */
4667
Guido van Rossum73624e91994-10-10 17:59:00 +00004668static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004669sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 int how;
4672 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004673
Serhiy Storchaka78980432013-01-15 01:12:17 +02004674 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 if (how == -1 && PyErr_Occurred())
4676 return NULL;
4677 Py_BEGIN_ALLOW_THREADS
4678 res = shutdown(s->sock_fd, how);
4679 Py_END_ALLOW_THREADS
4680 if (res < 0)
4681 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004682 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004683}
4684
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004685PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004686"shutdown(flag)\n\
4687\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004688Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4689of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004690
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004691#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004692static PyObject*
4693sock_ioctl(PySocketSockObject *s, PyObject *arg)
4694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 unsigned long cmd = SIO_RCVALL;
4696 PyObject *argO;
4697 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4700 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 switch (cmd) {
4703 case SIO_RCVALL: {
4704 unsigned int option = RCVALL_ON;
4705 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4706 return NULL;
4707 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4708 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4709 return set_error();
4710 }
4711 return PyLong_FromUnsignedLong(recv); }
4712 case SIO_KEEPALIVE_VALS: {
4713 struct tcp_keepalive ka;
4714 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4715 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4716 return NULL;
4717 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4718 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4719 return set_error();
4720 }
4721 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004722#if defined(SIO_LOOPBACK_FAST_PATH)
4723 case SIO_LOOPBACK_FAST_PATH: {
4724 unsigned int option;
4725 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4726 return NULL;
4727 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4728 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4729 return set_error();
4730 }
4731 return PyLong_FromUnsignedLong(recv); }
4732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 default:
4734 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4735 return NULL;
4736 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004737}
4738PyDoc_STRVAR(sock_ioctl_doc,
4739"ioctl(cmd, option) -> long\n\
4740\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004741Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4742SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004743SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4744SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004745#endif
4746
4747#if defined(MS_WINDOWS)
4748static PyObject*
4749sock_share(PySocketSockObject *s, PyObject *arg)
4750{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004751 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004752 DWORD processId;
4753 int result;
4754
4755 if (!PyArg_ParseTuple(arg, "I", &processId))
4756 return NULL;
4757
4758 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004759 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004760 Py_END_ALLOW_THREADS
4761 if (result == SOCKET_ERROR)
4762 return set_error();
4763 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4764}
4765PyDoc_STRVAR(sock_share_doc,
4766"share(process_id) -> bytes\n\
4767\n\
4768Share the socket with another process. The target process id\n\
4769must be provided and the resulting bytes object passed to the target\n\
4770process. There the shared socket can be instantiated by calling\n\
4771socket.fromshare().");
4772
Christian Heimesfaf2f632008-01-06 16:59:19 +00004773
4774#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004775
4776/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004777
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004778static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4780 accept_doc},
4781 {"bind", (PyCFunction)sock_bind, METH_O,
4782 bind_doc},
4783 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004784 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 {"connect", (PyCFunction)sock_connect, METH_O,
4786 connect_doc},
4787 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4788 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004789 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4790 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4792 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004793#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 {"getpeername", (PyCFunction)sock_getpeername,
4795 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 {"getsockname", (PyCFunction)sock_getsockname,
4798 METH_NOARGS, getsockname_doc},
4799 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4800 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004801#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4803 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004804#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004805#if defined(MS_WINDOWS)
4806 {"share", (PyCFunction)sock_share, METH_VARARGS,
4807 sock_share_doc},
4808#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004809 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 listen_doc},
4811 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4812 recv_doc},
4813 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4814 recv_into_doc},
4815 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4816 recvfrom_doc},
4817 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4818 recvfrom_into_doc},
4819 {"send", (PyCFunction)sock_send, METH_VARARGS,
4820 send_doc},
4821 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4822 sendall_doc},
4823 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4824 sendto_doc},
4825 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4826 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004827 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4828 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4830 settimeout_doc},
4831 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4832 gettimeout_doc},
4833 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4834 setsockopt_doc},
4835 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4836 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004837#ifdef CMSG_LEN
4838 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4839 recvmsg_doc},
4840 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4841 recvmsg_into_doc,},
4842 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4843 sendmsg_doc},
4844#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004845#ifdef HAVE_SOCKADDR_ALG
4846 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4847 sendmsg_afalg_doc},
4848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004850};
4851
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004852/* SockObject members */
4853static PyMemberDef sock_memberlist[] = {
4854 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4855 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4856 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004857 {0},
4858};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004859
Victor Stinner71694d52015-03-28 01:18:54 +01004860static PyGetSetDef sock_getsetlist[] = {
4861 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4862 {NULL} /* sentinel */
4863};
4864
Guido van Rossum73624e91994-10-10 17:59:00 +00004865/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004866 First close the file description. */
4867
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004868static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004869sock_finalize(PySocketSockObject *s)
4870{
4871 SOCKET_T fd;
4872 PyObject *error_type, *error_value, *error_traceback;
4873
4874 /* Save the current exception, if any. */
4875 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4876
Victor Stinnerd3afb622016-07-22 17:47:09 +02004877 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004878 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4879 /* Spurious errors can appear at shutdown */
4880 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4881 PyErr_WriteUnraisable((PyObject *)s);
4882 }
4883 }
4884
4885 /* Only close the socket *after* logging the ResourceWarning warning
4886 to allow the logger to call socket methods like
4887 socket.getsockname(). If the socket is closed before, socket
4888 methods fails with the EBADF error. */
4889 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004890 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004891
4892 /* We do not want to retry upon EINTR: see sock_close() */
4893 Py_BEGIN_ALLOW_THREADS
4894 (void) SOCKETCLOSE(fd);
4895 Py_END_ALLOW_THREADS
4896 }
4897
4898 /* Restore the saved exception. */
4899 PyErr_Restore(error_type, error_value, error_traceback);
4900}
4901
4902static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004903sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004904{
Victor Stinner19a8e842016-03-21 16:36:48 +01004905 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4906 return;
4907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004909}
4910
Guido van Rossum30a685f1991-06-27 15:51:29 +00004911
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004912static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004913sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004914{
Victor Stinnere254e532014-07-26 14:36:55 +02004915 long sock_fd;
4916 /* On Windows, this test is needed because SOCKET_T is unsigned */
4917 if (s->sock_fd == INVALID_SOCKET) {
4918 sock_fd = -1;
4919 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004920#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004921 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 /* this can occur on Win64, and actually there is a special
4923 ugly printf formatter for decimal pointer length integer
4924 printing, only bother if necessary*/
4925 PyErr_SetString(PyExc_OverflowError,
4926 "no printf formatter to display "
4927 "the socket descriptor in decimal");
4928 return NULL;
4929 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004930#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004931 else
4932 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 return PyUnicode_FromFormat(
4934 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004935 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004936 s->sock_type,
4937 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004938}
4939
4940
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004941/* Create a new, uninitialized socket object. */
4942
4943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 new = type->tp_alloc(type, 0);
4949 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004950 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004951 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 ((PySocketSockObject *)new)->errorhandler = &set_error;
4953 }
4954 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004955}
4956
4957
4958/* Initialize a new socket object. */
4959
Victor Stinnerdaf45552013-08-28 00:53:59 +02004960#ifdef SOCK_CLOEXEC
4961/* socket() and socketpair() fail with EINVAL on Linux kernel older
4962 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4963static int sock_cloexec_works = -1;
4964#endif
4965
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004966/*ARGSUSED*/
4967static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004968sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 PySocketSockObject *s = (PySocketSockObject *)self;
4971 PyObject *fdobj = NULL;
4972 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004973 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004975#ifndef MS_WINDOWS
4976#ifdef SOCK_CLOEXEC
4977 int *atomic_flag_works = &sock_cloexec_works;
4978#else
4979 int *atomic_flag_works = NULL;
4980#endif
4981#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4984 "|iiiO:socket", keywords,
4985 &family, &type, &proto, &fdobj))
4986 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004989#ifdef MS_WINDOWS
4990 /* recreate a socket that was duplicated */
4991 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004992 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004993 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4994 PyErr_Format(PyExc_ValueError,
4995 "socket descriptor string has wrong size, "
4996 "should be %zu bytes.", sizeof(info));
4997 return -1;
4998 }
4999 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
5000 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005001 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005002 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5003 Py_END_ALLOW_THREADS
5004 if (fd == INVALID_SOCKET) {
5005 set_error();
5006 return -1;
5007 }
5008 family = info.iAddressFamily;
5009 type = info.iSocketType;
5010 proto = info.iProtocol;
5011 }
5012 else
5013#endif
5014 {
5015 fd = PyLong_AsSocket_t(fdobj);
5016 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5017 return -1;
5018 if (fd == INVALID_SOCKET) {
5019 PyErr_SetString(PyExc_ValueError,
5020 "can't use invalid socket value");
5021 return -1;
5022 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005023
5024 if (family == -1) {
5025 sock_addr_t addrbuf;
5026 socklen_t addrlen = sizeof(sock_addr_t);
5027
5028 memset(&addrbuf, 0, addrlen);
5029 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5030 family = SAS2SA(&addrbuf)->sa_family;
5031 } else {
5032#ifdef MS_WINDOWS
5033 PyErr_SetFromWindowsErrWithFilename(0, "family");
5034#else
5035 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
5036#endif
5037 return -1;
5038 }
5039 }
5040#ifdef SO_TYPE
5041 if (type == -1) {
5042 int tmp;
5043 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005044 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5045 (void *)&tmp, &slen) == 0)
5046 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005047 type = tmp;
5048 } else {
5049#ifdef MS_WINDOWS
5050 PyErr_SetFromWindowsErrWithFilename(0, "type");
5051#else
5052 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
5053#endif
5054 return -1;
5055 }
5056 }
5057#else
5058 type = SOCK_STREAM;
5059#endif
5060#ifdef SO_PROTOCOL
5061 if (proto == -1) {
5062 int tmp;
5063 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005064 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5065 (void *)&tmp, &slen) == 0)
5066 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005067 proto = tmp;
5068 } else {
5069#ifdef MS_WINDOWS
5070 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
5071#else
5072 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
5073#endif
5074 return -1;
5075 }
5076 }
5077#else
5078 proto = 0;
5079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 }
5081 }
5082 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005083 /* No fd, default to AF_INET and SOCK_STREAM */
5084 if (family == -1) {
5085 family = AF_INET;
5086 }
5087 if (type == -1) {
5088 type = SOCK_STREAM;
5089 }
5090 if (proto == -1) {
5091 proto = 0;
5092 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005093#ifdef MS_WINDOWS
5094 /* Windows implementation */
5095#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5096#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5097#endif
5098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005100 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005101 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005102 NULL, 0,
5103 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5104 if (fd == INVALID_SOCKET) {
5105 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5106 support_wsa_no_inherit = 0;
5107 fd = socket(family, type, proto);
5108 }
5109 }
5110 else {
5111 fd = socket(family, type, proto);
5112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 if (fd == INVALID_SOCKET) {
5116 set_error();
5117 return -1;
5118 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005119
5120 if (!support_wsa_no_inherit) {
5121 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5122 closesocket(fd);
5123 PyErr_SetFromWindowsErr(0);
5124 return -1;
5125 }
5126 }
5127#else
5128 /* UNIX */
5129 Py_BEGIN_ALLOW_THREADS
5130#ifdef SOCK_CLOEXEC
5131 if (sock_cloexec_works != 0) {
5132 fd = socket(family, type | SOCK_CLOEXEC, proto);
5133 if (sock_cloexec_works == -1) {
5134 if (fd >= 0) {
5135 sock_cloexec_works = 1;
5136 }
5137 else if (errno == EINVAL) {
5138 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5139 sock_cloexec_works = 0;
5140 fd = socket(family, type, proto);
5141 }
5142 }
5143 }
5144 else
5145#endif
5146 {
5147 fd = socket(family, type, proto);
5148 }
5149 Py_END_ALLOW_THREADS
5150
5151 if (fd == INVALID_SOCKET) {
5152 set_error();
5153 return -1;
5154 }
5155
5156 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5157 SOCKETCLOSE(fd);
5158 return -1;
5159 }
5160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005162 if (init_sockobject(s, fd, family, type, proto) == -1) {
5163 SOCKETCLOSE(fd);
5164 return -1;
5165 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005168
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005169}
5170
5171
Guido van Rossumb6775db1994-08-01 11:34:53 +00005172/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005173
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005174static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5176 "_socket.socket", /* tp_name */
5177 sizeof(PySocketSockObject), /* tp_basicsize */
5178 0, /* tp_itemsize */
5179 (destructor)sock_dealloc, /* tp_dealloc */
5180 0, /* tp_print */
5181 0, /* tp_getattr */
5182 0, /* tp_setattr */
5183 0, /* tp_reserved */
5184 (reprfunc)sock_repr, /* tp_repr */
5185 0, /* tp_as_number */
5186 0, /* tp_as_sequence */
5187 0, /* tp_as_mapping */
5188 0, /* tp_hash */
5189 0, /* tp_call */
5190 0, /* tp_str */
5191 PyObject_GenericGetAttr, /* tp_getattro */
5192 0, /* tp_setattro */
5193 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005194 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5195 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 sock_doc, /* tp_doc */
5197 0, /* tp_traverse */
5198 0, /* tp_clear */
5199 0, /* tp_richcompare */
5200 0, /* tp_weaklistoffset */
5201 0, /* tp_iter */
5202 0, /* tp_iternext */
5203 sock_methods, /* tp_methods */
5204 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005205 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 0, /* tp_base */
5207 0, /* tp_dict */
5208 0, /* tp_descr_get */
5209 0, /* tp_descr_set */
5210 0, /* tp_dictoffset */
5211 sock_initobj, /* tp_init */
5212 PyType_GenericAlloc, /* tp_alloc */
5213 sock_new, /* tp_new */
5214 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005215 0, /* tp_is_gc */
5216 0, /* tp_bases */
5217 0, /* tp_mro */
5218 0, /* tp_cache */
5219 0, /* tp_subclasses */
5220 0, /* tp_weaklist */
5221 0, /* tp_del */
5222 0, /* tp_version_tag */
5223 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005224};
5225
Guido van Rossum30a685f1991-06-27 15:51:29 +00005226
Guido van Rossum81194471991-07-27 21:42:02 +00005227/* Python interface to gethostname(). */
5228
5229/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005230static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005231socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005232{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005233#ifdef MS_WINDOWS
5234 /* Don't use winsock's gethostname, as this returns the ANSI
5235 version of the hostname, whereas we need a Unicode string.
5236 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005237 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005238 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005239 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005240 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005241
5242 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005243 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005244
5245 if (GetLastError() != ERROR_MORE_DATA)
5246 return PyErr_SetFromWindowsErr(0);
5247
5248 if (size == 0)
5249 return PyUnicode_New(0, 0);
5250
5251 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5252 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005253 name = PyMem_New(wchar_t, size);
5254 if (!name) {
5255 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005256 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005257 }
Victor Stinner74168972011-11-17 01:11:36 +01005258 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5259 name,
5260 &size))
5261 {
5262 PyMem_Free(name);
5263 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005264 }
Victor Stinner74168972011-11-17 01:11:36 +01005265
5266 result = PyUnicode_FromWideChar(name, size);
5267 PyMem_Free(name);
5268 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005269#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 char buf[1024];
5271 int res;
5272 Py_BEGIN_ALLOW_THREADS
5273 res = gethostname(buf, (int) sizeof buf - 1);
5274 Py_END_ALLOW_THREADS
5275 if (res < 0)
5276 return set_error();
5277 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005278 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005279#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005280}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005282PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005283"gethostname() -> string\n\
5284\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005285Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005286
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005287#ifdef HAVE_SETHOSTNAME
5288PyDoc_STRVAR(sethostname_doc,
5289"sethostname(name)\n\n\
5290Sets the hostname to name.");
5291
5292static PyObject *
5293socket_sethostname(PyObject *self, PyObject *args)
5294{
5295 PyObject *hnobj;
5296 Py_buffer buf;
5297 int res, flag = 0;
5298
Christian Heimesd2774c72013-06-19 02:06:29 +02005299#ifdef _AIX
5300/* issue #18259, not declared in any useful header file */
5301extern int sethostname(const char *, size_t);
5302#endif
5303
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005304 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5305 PyErr_Clear();
5306 if (!PyArg_ParseTuple(args, "O&:sethostname",
5307 PyUnicode_FSConverter, &hnobj))
5308 return NULL;
5309 flag = 1;
5310 }
5311 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5312 if (!res) {
5313 res = sethostname(buf.buf, buf.len);
5314 PyBuffer_Release(&buf);
5315 }
5316 if (flag)
5317 Py_DECREF(hnobj);
5318 if (res)
5319 return set_error();
5320 Py_RETURN_NONE;
5321}
5322#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005323
Guido van Rossum30a685f1991-06-27 15:51:29 +00005324/* Python interface to gethostbyname(name). */
5325
5326/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005327static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005328socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005331 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005332 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005333
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005334 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 return NULL;
Коренберг Марк7766b962018-02-13 00:47:42 +05005336 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005337 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005338 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005339finally:
5340 PyMem_Free(name);
5341 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005342}
5343
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005344PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005345"gethostbyname(host) -> address\n\
5346\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005347Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005348
5349
Victor Stinner72400302016-01-28 15:41:01 +01005350static PyObject*
5351sock_decode_hostname(const char *name)
5352{
5353#ifdef MS_WINDOWS
5354 /* Issue #26227: gethostbyaddr() returns a string encoded
5355 * to the ANSI code page */
5356 return PyUnicode_DecodeFSDefault(name);
5357#else
5358 /* Decode from UTF-8 */
5359 return PyUnicode_FromString(name);
5360#endif
5361}
5362
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005363/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5364
5365static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005366gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 char **pch;
5369 PyObject *rtn_tuple = (PyObject *)NULL;
5370 PyObject *name_list = (PyObject *)NULL;
5371 PyObject *addr_list = (PyObject *)NULL;
5372 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005373 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 if (h == NULL) {
5376 /* Let's get real error message to return */
5377 set_herror(h_errno);
5378 return NULL;
5379 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 if (h->h_addrtype != af) {
5382 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005383 errno = EAFNOSUPPORT;
5384 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 return NULL;
5386 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 case AF_INET:
5391 if (alen < sizeof(struct sockaddr_in))
5392 return NULL;
5393 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005394
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005395#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 case AF_INET6:
5397 if (alen < sizeof(struct sockaddr_in6))
5398 return NULL;
5399 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005400#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 if ((name_list = PyList_New(0)) == NULL)
5405 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 if ((addr_list = PyList_New(0)) == NULL)
5408 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 /* SF #1511317: h_aliases can be NULL */
5411 if (h->h_aliases) {
5412 for (pch = h->h_aliases; *pch != NULL; pch++) {
5413 int status;
5414 tmp = PyUnicode_FromString(*pch);
5415 if (tmp == NULL)
5416 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 status = PyList_Append(name_list, tmp);
5419 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 if (status)
5422 goto err;
5423 }
5424 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5427 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 case AF_INET:
5432 {
5433 struct sockaddr_in sin;
5434 memset(&sin, 0, sizeof(sin));
5435 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005436#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005440 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 if (pch == h->h_addr_list && alen >= sizeof(sin))
5443 memcpy((char *) addr, &sin, sizeof(sin));
5444 break;
5445 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005446
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005447#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 case AF_INET6:
5449 {
5450 struct sockaddr_in6 sin6;
5451 memset(&sin6, 0, sizeof(sin6));
5452 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005453#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005457 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5460 memcpy((char *) addr, &sin6, sizeof(sin6));
5461 break;
5462 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005463#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005466 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 "unsupported address family");
5468 return NULL;
5469 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 if (tmp == NULL)
5472 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 status = PyList_Append(addr_list, tmp);
5475 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 if (status)
5478 goto err;
5479 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005480
Victor Stinner72400302016-01-28 15:41:01 +01005481 name = sock_decode_hostname(h->h_name);
5482 if (name == NULL)
5483 goto err;
5484 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005485
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005486 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 Py_XDECREF(name_list);
5488 Py_XDECREF(addr_list);
5489 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005490}
5491
5492
5493/* Python interface to gethostbyname_ex(name). */
5494
5495/*ARGSUSED*/
5496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005497socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 char *name;
5500 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005501 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005503 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005504#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005506#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005508#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 char buf[16384];
5510 int buf_len = (sizeof buf) - 1;
5511 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005512#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005513#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005515#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005516#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005517
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005518 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005520 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005521 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005523#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005524#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005525 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005527#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005529#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 memset((void *) &data, '\0', sizeof(data));
5531 result = gethostbyname_r(name, &hp_allocated, &data);
5532 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005533#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005534#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005535#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005537#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005538 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005540#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 Py_END_ALLOW_THREADS
5542 /* Some C libraries would require addr.__ss_family instead of
5543 addr.ss_family.
5544 Therefore, we cast the sockaddr_storage into sockaddr to
5545 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005546 sa = SAS2SA(&addr);
5547 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005549#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005551#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005552finally:
5553 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005555}
5556
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005557PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005558"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5559\n\
5560Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005561for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005562
5563
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005564/* Python interface to gethostbyaddr(IP). */
5565
5566/*ARGSUSED*/
5567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005568socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005569{
Charles-François Natali8b759652011-12-23 16:44:51 +01005570 sock_addr_t addr;
5571 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 char *ip_num;
5573 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005574 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005575#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005577#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005579#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 /* glibcs up to 2.10 assume that the buf argument to
5581 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5582 does not ensure. The attribute below instructs the compiler
5583 to maintain this alignment. */
5584 char buf[16384] Py_ALIGNED(8);
5585 int buf_len = (sizeof buf) - 1;
5586 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005587#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005588#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005590#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005591#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005592 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 int al;
5594 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005595
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005596 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 return NULL;
5598 af = AF_UNSPEC;
5599 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005600 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 af = sa->sa_family;
5602 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005603 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 switch (af) {
5605 case AF_INET:
5606 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5607 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5608 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005609#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 case AF_INET6:
5611 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5612 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5613 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005616 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005617 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 }
5619 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005620#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005621#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005622 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 &hp_allocated, buf, buf_len,
5624 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005625#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 h = gethostbyaddr_r(ap, al, af,
5627 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005628#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 memset((void *) &data, '\0', sizeof(data));
5630 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5631 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005632#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005633#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005634#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005636#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005637 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005639#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005641 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005642#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005644#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005645finally:
5646 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005648}
5649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005650PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005651"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5652\n\
5653Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005654for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005655
Guido van Rossum30a685f1991-06-27 15:51:29 +00005656
5657/* Python interface to getservbyname(name).
5658 This only returns the port number, since the other info is already
5659 known or not useful (like the list of aliases). */
5660
5661/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005663socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005664{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005665 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 struct servent *sp;
5667 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5668 return NULL;
5669 Py_BEGIN_ALLOW_THREADS
5670 sp = getservbyname(name, proto);
5671 Py_END_ALLOW_THREADS
5672 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005673 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 return NULL;
5675 }
5676 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005677}
5678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005679PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005680"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005681\n\
5682Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005683The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5684otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005685
Guido van Rossum30a685f1991-06-27 15:51:29 +00005686
Barry Warsaw11b91a02004-06-28 00:50:43 +00005687/* Python interface to getservbyport(port).
5688 This only returns the service name, since the other info is already
5689 known or not useful (like the list of aliases). */
5690
5691/*ARGSUSED*/
5692static PyObject *
5693socket_getservbyport(PyObject *self, PyObject *args)
5694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005696 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 struct servent *sp;
5698 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5699 return NULL;
5700 if (port < 0 || port > 0xffff) {
5701 PyErr_SetString(
5702 PyExc_OverflowError,
5703 "getservbyport: port must be 0-65535.");
5704 return NULL;
5705 }
5706 Py_BEGIN_ALLOW_THREADS
5707 sp = getservbyport(htons((short)port), proto);
5708 Py_END_ALLOW_THREADS
5709 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005710 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 return NULL;
5712 }
5713 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005714}
5715
5716PyDoc_STRVAR(getservbyport_doc,
5717"getservbyport(port[, protocolname]) -> string\n\
5718\n\
5719Return the service name from a port number and protocol name.\n\
5720The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5721otherwise any protocol will match.");
5722
Guido van Rossum3901d851996-12-19 16:35:04 +00005723/* Python interface to getprotobyname(name).
5724 This only returns the protocol number, since the other info is
5725 already known or not useful (like the list of aliases). */
5726
5727/*ARGSUSED*/
5728static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005729socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005730{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005731 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 struct protoent *sp;
5733 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5734 return NULL;
5735 Py_BEGIN_ALLOW_THREADS
5736 sp = getprotobyname(name);
5737 Py_END_ALLOW_THREADS
5738 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005739 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 return NULL;
5741 }
5742 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005743}
5744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005745PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005746"getprotobyname(name) -> integer\n\
5747\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005748Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005749
Christian Heimesd0e31b92018-01-27 09:54:13 +01005750static PyObject *
5751socket_close(PyObject *self, PyObject *fdobj)
5752{
5753 SOCKET_T fd;
5754 int res;
5755
5756 fd = PyLong_AsSocket_t(fdobj);
5757 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5758 return NULL;
5759 Py_BEGIN_ALLOW_THREADS
5760 res = SOCKETCLOSE(fd);
5761 Py_END_ALLOW_THREADS
5762 /* bpo-30319: The peer can already have closed the connection.
5763 Python ignores ECONNRESET on close(). */
5764 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5765 return set_error();
5766 }
5767 Py_RETURN_NONE;
5768}
5769
5770PyDoc_STRVAR(close_doc,
5771"close(integer) -> None\n\
5772\n\
5773Close an integer socket file descriptor. This is like os.close(), but for\n\
5774sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005775
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005776#ifndef NO_DUP
5777/* dup() function for socket fds */
5778
5779static PyObject *
5780socket_dup(PyObject *self, PyObject *fdobj)
5781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 SOCKET_T fd, newfd;
5783 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005784#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005785 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005786#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 fd = PyLong_AsSocket_t(fdobj);
5789 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5790 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005791
Victor Stinnerdaf45552013-08-28 00:53:59 +02005792#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005793 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005794 return set_error();
5795
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005796 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005797 FROM_PROTOCOL_INFO,
5798 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 if (newfd == INVALID_SOCKET)
5800 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005801
Victor Stinnerdaf45552013-08-28 00:53:59 +02005802 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5803 closesocket(newfd);
5804 PyErr_SetFromWindowsErr(0);
5805 return NULL;
5806 }
5807#else
5808 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5809 newfd = _Py_dup(fd);
5810 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005811 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005812#endif
5813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 newfdobj = PyLong_FromSocket_t(newfd);
5815 if (newfdobj == NULL)
5816 SOCKETCLOSE(newfd);
5817 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005818}
5819
5820PyDoc_STRVAR(dup_doc,
5821"dup(integer) -> integer\n\
5822\n\
5823Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5824sockets; on some platforms os.dup() won't work for socket file descriptors.");
5825#endif
5826
5827
Dave Cole331708b2004-08-09 04:51:41 +00005828#ifdef HAVE_SOCKETPAIR
5829/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005830 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005831 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005832
5833/*ARGSUSED*/
5834static PyObject *
5835socket_socketpair(PyObject *self, PyObject *args)
5836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 PySocketSockObject *s0 = NULL, *s1 = NULL;
5838 SOCKET_T sv[2];
5839 int family, type = SOCK_STREAM, proto = 0;
5840 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005841#ifdef SOCK_CLOEXEC
5842 int *atomic_flag_works = &sock_cloexec_works;
5843#else
5844 int *atomic_flag_works = NULL;
5845#endif
5846 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005847
5848#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005850#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5854 &family, &type, &proto))
5855 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005858 Py_BEGIN_ALLOW_THREADS
5859#ifdef SOCK_CLOEXEC
5860 if (sock_cloexec_works != 0) {
5861 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5862 if (sock_cloexec_works == -1) {
5863 if (ret >= 0) {
5864 sock_cloexec_works = 1;
5865 }
5866 else if (errno == EINVAL) {
5867 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5868 sock_cloexec_works = 0;
5869 ret = socketpair(family, type, proto, sv);
5870 }
5871 }
5872 }
5873 else
5874#endif
5875 {
5876 ret = socketpair(family, type, proto, sv);
5877 }
5878 Py_END_ALLOW_THREADS
5879
5880 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005882
5883 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5884 goto finally;
5885 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5886 goto finally;
5887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 s0 = new_sockobject(sv[0], family, type, proto);
5889 if (s0 == NULL)
5890 goto finally;
5891 s1 = new_sockobject(sv[1], family, type, proto);
5892 if (s1 == NULL)
5893 goto finally;
5894 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005895
5896finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 if (res == NULL) {
5898 if (s0 == NULL)
5899 SOCKETCLOSE(sv[0]);
5900 if (s1 == NULL)
5901 SOCKETCLOSE(sv[1]);
5902 }
5903 Py_XDECREF(s0);
5904 Py_XDECREF(s1);
5905 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005906}
5907
5908PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005909"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005910\n\
5911Create a pair of socket objects from the sockets returned by the platform\n\
5912socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005913The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005914AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005915
5916#endif /* HAVE_SOCKETPAIR */
5917
5918
Guido van Rossum006bf911996-06-12 04:04:55 +00005919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005920socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005921{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005922 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005923
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005924 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 return NULL;
5926 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005927 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005929 "ntohs: can't convert negative Python int to C "
5930 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 return NULL;
5932 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005933 if (x > 0xffff) {
5934 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5935 "ntohs: Python int too large to convert to C "
5936 "16-bit unsigned integer (The silent truncation "
5937 "is deprecated)",
5938 1)) {
5939 return NULL;
5940 }
5941 }
5942 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005943}
5944
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005945PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005946"ntohs(integer) -> integer\n\
5947\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005948Convert a 16-bit unsigned integer from network to host byte order.\n\
5949Note that in case the received integer does not fit in 16-bit unsigned\n\
5950integer, but does fit in a positive C int, it is silently truncated to\n\
595116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005952However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005953exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005954
5955
Guido van Rossum006bf911996-06-12 04:04:55 +00005956static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005957socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 if (PyLong_Check(arg)) {
5962 x = PyLong_AsUnsignedLong(arg);
5963 if (x == (unsigned long) -1 && PyErr_Occurred())
5964 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005965#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 {
5967 unsigned long y;
5968 /* only want the trailing 32 bits */
5969 y = x & 0xFFFFFFFFUL;
5970 if (y ^ x)
5971 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005972 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 x = y;
5974 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 }
5977 else
5978 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005979 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005982}
5983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005984PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005985"ntohl(integer) -> integer\n\
5986\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005987Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005988
5989
Guido van Rossum006bf911996-06-12 04:04:55 +00005990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005991socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005992{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005993 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005994
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005995 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996 return NULL;
5997 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005998 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006000 "htons: can't convert negative Python int to C "
6001 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 return NULL;
6003 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006004 if (x > 0xffff) {
6005 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6006 "htons: Python int too large to convert to C "
6007 "16-bit unsigned integer (The silent truncation "
6008 "is deprecated)",
6009 1)) {
6010 return NULL;
6011 }
6012 }
6013 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006014}
6015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006016PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006017"htons(integer) -> integer\n\
6018\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006019Convert a 16-bit unsigned integer from host to network byte order.\n\
6020Note that in case the received integer does not fit in 16-bit unsigned\n\
6021integer, but does fit in a positive C int, it is silently truncated to\n\
602216-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006023However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006024exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006025
6026
Guido van Rossum006bf911996-06-12 04:04:55 +00006027static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006028socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 if (PyLong_Check(arg)) {
6033 x = PyLong_AsUnsignedLong(arg);
6034 if (x == (unsigned long) -1 && PyErr_Occurred())
6035 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006036#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 {
6038 unsigned long y;
6039 /* only want the trailing 32 bits */
6040 y = x & 0xFFFFFFFFUL;
6041 if (y ^ x)
6042 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006043 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044 x = y;
6045 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 }
6048 else
6049 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006050 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 Py_TYPE(arg)->tp_name);
6052 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006053}
6054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006055PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006056"htonl(integer) -> integer\n\
6057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006058Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006059
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006060/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006062PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006063"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006064\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006065Convert 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 +00006066binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006067
6068static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006069socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006070{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006071#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006073#endif
6074
6075#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006076#if (SIZEOF_INT != 4)
6077#error "Not sure if in_addr_t exists and int is not 32-bits."
6078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 /* Have to use inet_addr() instead */
6080 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006081#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006082 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6085 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006086
Tim Peters1df9fdd2003-02-13 03:13:40 +00006087
6088#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006089
6090#ifdef USE_INET_ATON_WEAKLINK
6091 if (inet_aton != NULL) {
6092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 if (inet_aton(ip_addr, &buf))
6094 return PyBytes_FromStringAndSize((char *)(&buf),
6095 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006096
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006097 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 "illegal IP address string passed to inet_aton");
6099 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006100
Thomas Wouters477c8d52006-05-27 19:21:47 +00006101#ifdef USE_INET_ATON_WEAKLINK
6102 } else {
6103#endif
6104
6105#endif
6106
6107#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 /* special-case this address as inet_addr might return INADDR_NONE
6110 * for this */
6111 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006112 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006114
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006115 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006119 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 "illegal IP address string passed to inet_aton");
6121 return NULL;
6122 }
6123 }
6124 return PyBytes_FromStringAndSize((char *) &packed_addr,
6125 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006126
6127#ifdef USE_INET_ATON_WEAKLINK
6128 }
6129#endif
6130
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006131#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006132}
6133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006134PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006135"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006136\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006137Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006138
6139static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006140socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006141{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006142 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006144
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006145 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 return NULL;
6147 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006148
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006149 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006150 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006152 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 return NULL;
6154 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006155
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006156 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6157 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006158
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006159 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006161}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006162
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006163#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006164
6165PyDoc_STRVAR(inet_pton_doc,
6166"inet_pton(af, ip) -> packed IP address string\n\
6167\n\
6168Convert an IP address from string format to a packed string suitable\n\
6169for use with low-level network functions.");
6170
6171static PyObject *
6172socket_inet_pton(PyObject *self, PyObject *args)
6173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006175 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006177#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006178 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006179#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6183 return NULL;
6184 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006185
Martin v. Löwis04697e82004-06-02 12:35:29 +00006186#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006188 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 "can't use AF_INET6, IPv6 is disabled");
6190 return NULL;
6191 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006192#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 retval = inet_pton(af, ip, packed);
6195 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006196 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197 return NULL;
6198 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006199 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 "illegal IP address string passed to inet_pton");
6201 return NULL;
6202 } else if (af == AF_INET) {
6203 return PyBytes_FromStringAndSize(packed,
6204 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006205#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 } else if (af == AF_INET6) {
6207 return PyBytes_FromStringAndSize(packed,
6208 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006211 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 return NULL;
6213 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006214}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006215
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006216PyDoc_STRVAR(inet_ntop_doc,
6217"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6218\n\
6219Convert a packed IP address of the given family to string format.");
6220
6221static PyObject *
6222socket_inet_ntop(PyObject *self, PyObject *args)
6223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006225 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006227#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006228 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006229#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006230 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006231#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006232
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006233 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 return NULL;
6235 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006238 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 PyErr_SetString(PyExc_ValueError,
6240 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006241 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 return NULL;
6243 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006244#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006246 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 PyErr_SetString(PyExc_ValueError,
6248 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006249 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 return NULL;
6251 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 } else {
6254 PyErr_Format(PyExc_ValueError,
6255 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006256 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 return NULL;
6258 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006259
Коренберг Марк7766b962018-02-13 00:47:42 +05006260 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006261 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6262 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006264 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 return NULL;
6266 } else {
6267 return PyUnicode_FromString(retval);
6268 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006269}
6270
6271#endif /* HAVE_INET_PTON */
6272
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006273/* Python interface to getaddrinfo(host, port). */
6274
6275/*ARGSUSED*/
6276static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006277socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006278{
Victor Stinner77af1722011-05-26 14:05:59 +02006279 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006280 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 struct addrinfo hints, *res;
6282 struct addrinfo *res0 = NULL;
6283 PyObject *hobj = NULL;
6284 PyObject *pobj = (PyObject *)NULL;
6285 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006286 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 int family, socktype, protocol, flags;
6288 int error;
6289 PyObject *all = (PyObject *)NULL;
6290 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006291
Georg Brandl6083a4b2013-10-14 06:51:46 +02006292 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006294 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006295 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 &protocol, &flags)) {
6297 return NULL;
6298 }
6299 if (hobj == Py_None) {
6300 hptr = NULL;
6301 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006302 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 if (!idna)
6304 return NULL;
6305 assert(PyBytes_Check(idna));
6306 hptr = PyBytes_AS_STRING(idna);
6307 } else if (PyBytes_Check(hobj)) {
6308 hptr = PyBytes_AsString(hobj);
6309 } else {
6310 PyErr_SetString(PyExc_TypeError,
6311 "getaddrinfo() argument 1 must be string or None");
6312 return NULL;
6313 }
6314 if (PyLong_CheckExact(pobj)) {
6315 long value = PyLong_AsLong(pobj);
6316 if (value == -1 && PyErr_Occurred())
6317 goto err;
6318 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6319 pptr = pbuf;
6320 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006321 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006322 if (pptr == NULL)
6323 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006325 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326 } else if (pobj == Py_None) {
6327 pptr = (char *)NULL;
6328 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006329 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 goto err;
6331 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006332#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006333 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006334 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006335 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6336 * This workaround avoids a segfault in libsystem.
6337 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006338 pptr = "00";
6339 }
6340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 memset(&hints, 0, sizeof(hints));
6342 hints.ai_family = family;
6343 hints.ai_socktype = socktype;
6344 hints.ai_protocol = protocol;
6345 hints.ai_flags = flags;
6346 Py_BEGIN_ALLOW_THREADS
6347 ACQUIRE_GETADDRINFO_LOCK
6348 error = getaddrinfo(hptr, pptr, &hints, &res0);
6349 Py_END_ALLOW_THREADS
6350 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6351 if (error) {
6352 set_gaierror(error);
6353 goto err;
6354 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006355
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006356 all = PyList_New(0);
6357 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 goto err;
6359 for (res = res0; res; res = res->ai_next) {
6360 PyObject *single;
6361 PyObject *addr =
6362 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6363 if (addr == NULL)
6364 goto err;
6365 single = Py_BuildValue("iiisO", res->ai_family,
6366 res->ai_socktype, res->ai_protocol,
6367 res->ai_canonname ? res->ai_canonname : "",
6368 addr);
6369 Py_DECREF(addr);
6370 if (single == NULL)
6371 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006372
Zackery Spytz4c596d52018-11-14 15:39:01 -07006373 if (PyList_Append(all, single)) {
6374 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006376 }
6377 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 }
6379 Py_XDECREF(idna);
6380 if (res0)
6381 freeaddrinfo(res0);
6382 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006383 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 Py_XDECREF(all);
6385 Py_XDECREF(idna);
6386 if (res0)
6387 freeaddrinfo(res0);
6388 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006389}
6390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006391PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006392"getaddrinfo(host, port [, family, type, proto, flags])\n\
6393 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006394\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006395Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006396
6397/* Python interface to getnameinfo(sa, flags). */
6398
6399/*ARGSUSED*/
6400static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006401socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 PyObject *sa = (PyObject *)NULL;
6404 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006405 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006406 int port;
6407 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6409 struct addrinfo hints, *res = NULL;
6410 int error;
6411 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006412 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 flags = flowinfo = scope_id = 0;
6415 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6416 return NULL;
6417 if (!PyTuple_Check(sa)) {
6418 PyErr_SetString(PyExc_TypeError,
6419 "getnameinfo() argument 1 must be a tuple");
6420 return NULL;
6421 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006422 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006424 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006426 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006427 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006428 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006429 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006430 return NULL;
6431 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6433 memset(&hints, 0, sizeof(hints));
6434 hints.ai_family = AF_UNSPEC;
6435 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006436 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 Py_BEGIN_ALLOW_THREADS
6438 ACQUIRE_GETADDRINFO_LOCK
6439 error = getaddrinfo(hostp, pbuf, &hints, &res);
6440 Py_END_ALLOW_THREADS
6441 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6442 if (error) {
6443 set_gaierror(error);
6444 goto fail;
6445 }
6446 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006447 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 "sockaddr resolved to multiple addresses");
6449 goto fail;
6450 }
6451 switch (res->ai_family) {
6452 case AF_INET:
6453 {
6454 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006455 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 "IPv4 sockaddr must be 2 tuple");
6457 goto fail;
6458 }
6459 break;
6460 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006461#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 case AF_INET6:
6463 {
6464 struct sockaddr_in6 *sin6;
6465 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006466 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 sin6->sin6_scope_id = scope_id;
6468 break;
6469 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006472 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6474 if (error) {
6475 set_gaierror(error);
6476 goto fail;
6477 }
Victor Stinner72400302016-01-28 15:41:01 +01006478
6479 name = sock_decode_hostname(hbuf);
6480 if (name == NULL)
6481 goto fail;
6482 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006483
6484fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 if (res)
6486 freeaddrinfo(res);
6487 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006488}
6489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006490PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006491"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006492\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006493Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006494
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006495
6496/* Python API to getting and setting the default timeout value. */
6497
6498static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306499socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006500{
Victor Stinner71694d52015-03-28 01:18:54 +01006501 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006502 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 }
Victor Stinner71694d52015-03-28 01:18:54 +01006504 else {
6505 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6506 return PyFloat_FromDouble(seconds);
6507 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006508}
6509
6510PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006511"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006512\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006513Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006514A value of None indicates that new socket objects have no timeout.\n\
6515When the socket module is first imported, the default is None.");
6516
6517static PyObject *
6518socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6519{
Victor Stinner71694d52015-03-28 01:18:54 +01006520 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006521
Victor Stinner71694d52015-03-28 01:18:54 +01006522 if (socket_parse_timeout(&timeout, arg) < 0)
6523 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006526
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006527 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006528}
6529
6530PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006531"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006532\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006533Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006534A value of None indicates that new socket objects have no timeout.\n\
6535When the socket module is first imported, the default is None.");
6536
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006537#ifdef HAVE_IF_NAMEINDEX
6538/* Python API for getting interface indices and names */
6539
6540static PyObject *
6541socket_if_nameindex(PyObject *self, PyObject *arg)
6542{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006543 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006544 int i;
6545 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006546
Charles-François Natali60713592011-05-20 16:55:06 +02006547 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006548 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006549 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006550 return NULL;
6551 }
6552
6553 list = PyList_New(0);
6554 if (list == NULL) {
6555 if_freenameindex(ni);
6556 return NULL;
6557 }
6558
Charles-François Natali60713592011-05-20 16:55:06 +02006559 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6560 PyObject *ni_tuple = Py_BuildValue("IO&",
6561 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006562
6563 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6564 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006565 Py_DECREF(list);
6566 if_freenameindex(ni);
6567 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006568 }
6569 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006570 }
6571
6572 if_freenameindex(ni);
6573 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006574}
6575
6576PyDoc_STRVAR(if_nameindex_doc,
6577"if_nameindex()\n\
6578\n\
6579Returns a list of network interface information (index, name) tuples.");
6580
Charles-François Natali60713592011-05-20 16:55:06 +02006581static PyObject *
6582socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006583{
Charles-François Natali60713592011-05-20 16:55:06 +02006584 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006585 unsigned long index;
6586
Charles-François Natali60713592011-05-20 16:55:06 +02006587 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6588 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006589 return NULL;
6590
Charles-François Natali60713592011-05-20 16:55:06 +02006591 index = if_nametoindex(PyBytes_AS_STRING(oname));
6592 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006593 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006594 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006595 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006596 return NULL;
6597 }
6598
6599 return PyLong_FromUnsignedLong(index);
6600}
6601
6602PyDoc_STRVAR(if_nametoindex_doc,
6603"if_nametoindex(if_name)\n\
6604\n\
6605Returns the interface index corresponding to the interface name if_name.");
6606
Charles-François Natali60713592011-05-20 16:55:06 +02006607static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006608socket_if_indextoname(PyObject *self, PyObject *arg)
6609{
Charles-François Natali60713592011-05-20 16:55:06 +02006610 unsigned long index;
6611 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006612
Charles-François Natali60713592011-05-20 16:55:06 +02006613 index = PyLong_AsUnsignedLong(arg);
6614 if (index == (unsigned long) -1)
6615 return NULL;
6616
6617 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006618 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006619 return NULL;
6620 }
6621
Charles-François Natali60713592011-05-20 16:55:06 +02006622 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006623}
6624
6625PyDoc_STRVAR(if_indextoname_doc,
6626"if_indextoname(if_index)\n\
6627\n\
6628Returns the interface name corresponding to the interface index if_index.");
6629
6630#endif /* HAVE_IF_NAMEINDEX */
6631
6632
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006633#ifdef CMSG_LEN
6634/* Python interface to CMSG_LEN(length). */
6635
6636static PyObject *
6637socket_CMSG_LEN(PyObject *self, PyObject *args)
6638{
6639 Py_ssize_t length;
6640 size_t result;
6641
6642 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6643 return NULL;
6644 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6645 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6646 return NULL;
6647 }
6648 return PyLong_FromSize_t(result);
6649}
6650
6651PyDoc_STRVAR(CMSG_LEN_doc,
6652"CMSG_LEN(length) -> control message length\n\
6653\n\
6654Return the total length, without trailing padding, of an ancillary\n\
6655data item with associated data of the given length. This value can\n\
6656often be used as the buffer size for recvmsg() to receive a single\n\
6657item of ancillary data, but RFC 3542 requires portable applications to\n\
6658use CMSG_SPACE() and thus include space for padding, even when the\n\
6659item will be the last in the buffer. Raises OverflowError if length\n\
6660is outside the permissible range of values.");
6661
6662
6663#ifdef CMSG_SPACE
6664/* Python interface to CMSG_SPACE(length). */
6665
6666static PyObject *
6667socket_CMSG_SPACE(PyObject *self, PyObject *args)
6668{
6669 Py_ssize_t length;
6670 size_t result;
6671
6672 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6673 return NULL;
6674 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6675 PyErr_SetString(PyExc_OverflowError,
6676 "CMSG_SPACE() argument out of range");
6677 return NULL;
6678 }
6679 return PyLong_FromSize_t(result);
6680}
6681
6682PyDoc_STRVAR(CMSG_SPACE_doc,
6683"CMSG_SPACE(length) -> buffer size\n\
6684\n\
6685Return the buffer size needed for recvmsg() to receive an ancillary\n\
6686data item with associated data of the given length, along with any\n\
6687trailing padding. The buffer space needed to receive multiple items\n\
6688is the sum of the CMSG_SPACE() values for their associated data\n\
6689lengths. Raises OverflowError if length is outside the permissible\n\
6690range of values.");
6691#endif /* CMSG_SPACE */
6692#endif /* CMSG_LEN */
6693
6694
Guido van Rossum30a685f1991-06-27 15:51:29 +00006695/* List of functions exported by this module. */
6696
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006697static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 {"gethostbyname", socket_gethostbyname,
6699 METH_VARARGS, gethostbyname_doc},
6700 {"gethostbyname_ex", socket_gethostbyname_ex,
6701 METH_VARARGS, ghbn_ex_doc},
6702 {"gethostbyaddr", socket_gethostbyaddr,
6703 METH_VARARGS, gethostbyaddr_doc},
6704 {"gethostname", socket_gethostname,
6705 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006706#ifdef HAVE_SETHOSTNAME
6707 {"sethostname", socket_sethostname,
6708 METH_VARARGS, sethostname_doc},
6709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 {"getservbyname", socket_getservbyname,
6711 METH_VARARGS, getservbyname_doc},
6712 {"getservbyport", socket_getservbyport,
6713 METH_VARARGS, getservbyport_doc},
6714 {"getprotobyname", socket_getprotobyname,
6715 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006716 {"close", socket_close,
6717 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006718#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006719 {"dup", socket_dup,
6720 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006721#endif
Dave Cole331708b2004-08-09 04:51:41 +00006722#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 {"socketpair", socket_socketpair,
6724 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006726 {"ntohs", socket_ntohs,
6727 METH_VARARGS, ntohs_doc},
6728 {"ntohl", socket_ntohl,
6729 METH_O, ntohl_doc},
6730 {"htons", socket_htons,
6731 METH_VARARGS, htons_doc},
6732 {"htonl", socket_htonl,
6733 METH_O, htonl_doc},
6734 {"inet_aton", socket_inet_aton,
6735 METH_VARARGS, inet_aton_doc},
6736 {"inet_ntoa", socket_inet_ntoa,
6737 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006738#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739 {"inet_pton", socket_inet_pton,
6740 METH_VARARGS, inet_pton_doc},
6741 {"inet_ntop", socket_inet_ntop,
6742 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006743#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006744 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6745 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 {"getnameinfo", socket_getnameinfo,
6747 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306748 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 METH_NOARGS, getdefaulttimeout_doc},
6750 {"setdefaulttimeout", socket_setdefaulttimeout,
6751 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006752#ifdef HAVE_IF_NAMEINDEX
6753 {"if_nameindex", socket_if_nameindex,
6754 METH_NOARGS, if_nameindex_doc},
6755 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006756 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006757 {"if_indextoname", socket_if_indextoname,
6758 METH_O, if_indextoname_doc},
6759#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006760#ifdef CMSG_LEN
6761 {"CMSG_LEN", socket_CMSG_LEN,
6762 METH_VARARGS, CMSG_LEN_doc},
6763#ifdef CMSG_SPACE
6764 {"CMSG_SPACE", socket_CMSG_SPACE,
6765 METH_VARARGS, CMSG_SPACE_doc},
6766#endif
6767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006769};
6770
Guido van Rossum30a685f1991-06-27 15:51:29 +00006771
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006772#ifdef MS_WINDOWS
6773#define OS_INIT_DEFINED
6774
6775/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006776
6777static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006778os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006781}
6782
6783static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006784os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 WSADATA WSAData;
6787 int ret;
6788 ret = WSAStartup(0x0101, &WSAData);
6789 switch (ret) {
6790 case 0: /* No error */
6791 Py_AtExit(os_cleanup);
6792 return 1; /* Success */
6793 case WSASYSNOTREADY:
6794 PyErr_SetString(PyExc_ImportError,
6795 "WSAStartup failed: network not ready");
6796 break;
6797 case WSAVERNOTSUPPORTED:
6798 case WSAEINVAL:
6799 PyErr_SetString(
6800 PyExc_ImportError,
6801 "WSAStartup failed: requested version not supported");
6802 break;
6803 default:
6804 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6805 break;
6806 }
6807 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006808}
6809
Guido van Rossum8d665e61996-06-26 18:22:49 +00006810#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006811
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006812
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006813
6814#ifndef OS_INIT_DEFINED
6815static int
6816os_init(void)
6817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006819}
6820#endif
6821
6822
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006823/* C API table - always add new things to the end for binary
6824 compatibility. */
6825static
6826PySocketModule_APIObject PySocketModuleAPI =
6827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006829 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006831};
6832
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006833
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006834/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006835
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006836 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006837 "socket.py" which implements some additional functionality.
6838 The import of "_socket" may fail with an ImportError exception if
6839 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006840 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006841 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006842*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006844PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006845"Implementation module for socket operations.\n\
6846\n\
6847See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006848
Martin v. Löwis1a214512008-06-11 05:26:20 +00006849static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 PyModuleDef_HEAD_INIT,
6851 PySocket_MODULE_NAME,
6852 socket_doc,
6853 -1,
6854 socket_methods,
6855 NULL,
6856 NULL,
6857 NULL,
6858 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006859};
6860
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006861PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006862PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 if (!os_init())
6867 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006868
Victor Stinnerdaf45552013-08-28 00:53:59 +02006869#ifdef MS_WINDOWS
6870 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006871 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006872 }
6873#endif
6874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 Py_TYPE(&sock_type) = &PyType_Type;
6876 m = PyModule_Create(&socketmodule);
6877 if (m == NULL)
6878 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006879
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006880 Py_INCREF(PyExc_OSError);
6881 PySocketModuleAPI.error = PyExc_OSError;
6882 Py_INCREF(PyExc_OSError);
6883 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006884 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006885 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886 if (socket_herror == NULL)
6887 return NULL;
6888 Py_INCREF(socket_herror);
6889 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006890 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 NULL);
6892 if (socket_gaierror == NULL)
6893 return NULL;
6894 Py_INCREF(socket_gaierror);
6895 PyModule_AddObject(m, "gaierror", socket_gaierror);
6896 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006897 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006898 if (socket_timeout == NULL)
6899 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006900 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901 Py_INCREF(socket_timeout);
6902 PyModule_AddObject(m, "timeout", socket_timeout);
6903 Py_INCREF((PyObject *)&sock_type);
6904 if (PyModule_AddObject(m, "SocketType",
6905 (PyObject *)&sock_type) != 0)
6906 return NULL;
6907 Py_INCREF((PyObject *)&sock_type);
6908 if (PyModule_AddObject(m, "socket",
6909 (PyObject *)&sock_type) != 0)
6910 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006911
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006912#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006914#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917 Py_INCREF(has_ipv6);
6918 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920 /* Export C API */
6921 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6922 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6923 ) != 0)
6924 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006927#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006929#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006931#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006933#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006934#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006937#endif
6938#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006940#endif
6941#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006944#endif
6945#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006948#endif
6949#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006952#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006953#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006956#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006957#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006960#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006961#ifdef HAVE_SOCKADDR_ALG
6962 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6963#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006964#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006967#endif
6968#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006970#endif
6971#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006974#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006975#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006976 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006978#endif
6979#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006982#endif
6983#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006986#endif
6987#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006988 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006990#endif
6991#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, AF_NETLINK);
6994 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006995#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006997#endif
6998#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007000#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7002 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007003#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007005#endif
7006#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007008#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007009#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007011#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007012#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007014#endif
7015#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007017#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007019#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007021#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007022#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007024#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007025#ifdef NETLINK_CRYPTO
7026 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7027#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007028#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007029
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007030#ifdef AF_QIPCRTR
7031 /* Qualcomm IPCROUTER */
7032 PyModule_AddIntMacro(m, AF_QIPCRTR);
7033#endif
7034
caaveryeffc12f2017-09-06 18:18:10 -04007035#ifdef AF_VSOCK
7036 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7037 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7038 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7039 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7040 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7041 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7042 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7043 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7044 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7045#endif
7046
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007047#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007050#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007051#ifdef AF_LINK
7052 PyModule_AddIntMacro(m, AF_LINK);
7053#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007054#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007057#endif
7058#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007061#endif
7062#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007065#endif
7066#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007067 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007069#endif
7070#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007071 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007073#endif
7074#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007077#endif
7078#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007081#endif
7082#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007085#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007086
Hye-Shik Chang81268602004-02-02 06:05:24 +00007087#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7089 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7090 PyModule_AddIntMacro(m, BTPROTO_HCI);
7091 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007092#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007094#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007095#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007096#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007098#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7100 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007101#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007103 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7104 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007105#endif
7106
Charles-François Natali47413c12011-10-06 19:47:44 +02007107#ifdef AF_CAN
7108 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007110#endif
7111#ifdef PF_CAN
7112 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007114#endif
7115
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007116/* Reliable Datagram Sockets */
7117#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007119#endif
7120#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007122#endif
7123
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007124/* Kernel event messages */
7125#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007127#endif
7128#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007130#endif
7131
Antoine Pitroub156a462010-10-27 20:13:57 +00007132#ifdef AF_PACKET
7133 PyModule_AddIntMacro(m, AF_PACKET);
7134#endif
7135#ifdef PF_PACKET
7136 PyModule_AddIntMacro(m, PF_PACKET);
7137#endif
7138#ifdef PACKET_HOST
7139 PyModule_AddIntMacro(m, PACKET_HOST);
7140#endif
7141#ifdef PACKET_BROADCAST
7142 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7143#endif
7144#ifdef PACKET_MULTICAST
7145 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7146#endif
7147#ifdef PACKET_OTHERHOST
7148 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7149#endif
7150#ifdef PACKET_OUTGOING
7151 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7152#endif
7153#ifdef PACKET_LOOPBACK
7154 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7155#endif
7156#ifdef PACKET_FASTROUTE
7157 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007158#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007159
Christian Heimes043d6f62008-01-07 17:19:16 +00007160#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7165 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7166 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007167
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7169 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7170 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, SOL_TIPC);
7174 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7175 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7176 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7177 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007178
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7180 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7181 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7182 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7186 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007187#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007190#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7192 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7193 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7194 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7195 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7196 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007197#endif
7198
Christian Heimesdffa3942016-09-05 23:54:41 +02007199#ifdef HAVE_SOCKADDR_ALG
7200 /* Socket options */
7201 PyModule_AddIntMacro(m, ALG_SET_KEY);
7202 PyModule_AddIntMacro(m, ALG_SET_IV);
7203 PyModule_AddIntMacro(m, ALG_SET_OP);
7204 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7205 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7206 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7207
7208 /* Operations */
7209 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7210 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7211 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7212 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7213#endif
7214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, SOCK_STREAM);
7217 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007218/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007219#ifdef SOCK_RAW
7220 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007222#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007224#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007226#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007227#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007229#endif
7230#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007232#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007243#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007245#endif
7246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007264#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007265#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007268#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007296#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007297#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007299#endif
7300#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007302#endif
7303#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007305#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007306#ifdef SO_PASSSEC
7307 PyModule_AddIntMacro(m, SO_PASSSEC);
7308#endif
7309#ifdef SO_PEERSEC
7310 PyModule_AddIntMacro(m, SO_PEERSEC);
7311#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007312#ifdef SO_BINDTODEVICE
7313 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7314#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007315#ifdef SO_PRIORITY
7316 PyModule_AddIntMacro(m, SO_PRIORITY);
7317#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007318#ifdef SO_MARK
7319 PyModule_AddIntMacro(m, SO_MARK);
7320#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007321#ifdef SO_DOMAIN
7322 PyModule_AddIntMacro(m, SO_DOMAIN);
7323#endif
7324#ifdef SO_PROTOCOL
7325 PyModule_AddIntMacro(m, SO_PROTOCOL);
7326#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328 /* Maximum number of connections for "listen" */
7329#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007333#endif
7334
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007335 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007336#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007338#endif
7339#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007341#endif
7342#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007344#endif
7345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346 /* Flags for send, recv */
7347#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007377#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007379#endif
7380#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007382#endif
7383#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007385#endif
7386#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007388#endif
7389#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007391#endif
7392#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007394#endif
7395#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007397#endif
7398#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007400#endif
7401#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007403#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007404#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007406#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408 /* Protocol level and numbers, usable for [gs]etsockopt */
7409#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007414#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007439#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007441#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007442#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007444#endif
7445#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7447 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007448#endif
7449#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7451 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7452 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007453
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7455 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7456 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007457#ifdef CAN_ISOTP
7458 PyModule_AddIntMacro(m, CAN_ISOTP);
7459#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007460#endif
7461#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7463 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7464 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7465 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007466#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007467#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7468 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7469#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007470#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007472 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7473 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7474 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7475 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7476 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7477 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7478 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7479 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7480 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7481 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7482 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7483 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7484#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007485#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007487#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007488#ifdef HAVE_SOCKADDR_ALG
7489 PyModule_AddIntMacro(m, SOL_ALG);
7490#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007491#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007493#endif
7494#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007496#endif
7497#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007499#endif
7500#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007502#endif
7503#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007505#endif
7506#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007511#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007519#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007534#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007537#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007550#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007553#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007559#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007574#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007577#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007592#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007609#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007610#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007613#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007615#endif
7616/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007617#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007619#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007620 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007624#endif
7625
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007626#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007628#endif
7629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007630 /* Some port configuration */
7631#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007634 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007638#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007640#endif
7641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642 /* Some reserved IP v.4 addresses */
7643#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007646 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007650#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007655#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007658#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007661 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007663#ifdef INADDR_ALLHOSTS_GROUP
7664 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7665 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007671#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007672 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007678#endif
7679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007680 /* IPv4 [gs]etsockopt options */
7681#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007687#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007699#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007708#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007728#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007729#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007731#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7734#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007737#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007740#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007743#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007749#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007752 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007753#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007756 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007757#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007758 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007759#endif
7760#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007761 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007762#endif
7763#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007765#endif
7766#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007768#endif
7769#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007771#endif
7772#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007774#endif
7775#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007777#endif
7778#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007780#endif
7781#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007783#endif
7784#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007786#endif
7787#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007789#endif
7790#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007792#endif
7793#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007795#endif
7796#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007798#endif
7799#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007801#endif
7802#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007804#endif
7805#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007806 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007807#endif
7808#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007809 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007810#endif
7811#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007812 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007813#endif
7814#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007816#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007818 /* TCP options */
7819#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007846#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007849#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007852#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007854#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007855#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007857#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007858#ifdef TCP_CONGESTION
7859 PyModule_AddIntMacro(m, TCP_CONGESTION);
7860#endif
7861#ifdef TCP_USER_TIMEOUT
7862 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7863#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007864#ifdef TCP_NOTSENT_LOWAT
7865 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7866#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007868 /* IPX options */
7869#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007871#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007872
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007873/* Reliable Datagram Sockets */
7874#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007875 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007876#endif
7877#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007879#endif
7880#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007881 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007882#endif
7883#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007884 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007885#endif
7886#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007887 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007888#endif
7889#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007890 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007891#endif
7892#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007893 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007894#endif
7895#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007896 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007897#endif
7898#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007900#endif
7901#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007902 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007903#endif
7904#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007905 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007906#endif
7907#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007908 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007909#endif
7910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007912#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007914#endif
7915#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007917#endif
7918#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007920#endif
7921#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007923#endif
7924#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007926#endif
7927#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007929#endif
7930#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007931 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007932#endif
7933#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007934 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007935#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007936#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007938#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007939#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007940 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007941#endif
7942#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007943 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007944#endif
7945#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007947#endif
7948#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007950#endif
7951#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007953#endif
7954#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007955 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007956#endif
7957#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007958 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007959#endif
7960#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007961 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007962#endif
7963#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007965#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007966#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007968#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007969#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007970 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007971#endif
7972#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007974#endif
7975#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007976 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007977#endif
7978#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007980#endif
7981#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007982 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007983#endif
7984#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007985 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007986#endif
7987#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007988 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007989#endif
7990#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007991 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007992#endif
7993#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007994 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007995#endif
7996#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007997 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007998#endif
7999#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008000 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008001#endif
8002#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008003 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008004#endif
8005#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008006 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008007#endif
8008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008010#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008012#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008013 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008014#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008016#endif
8017#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008018 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008019#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008020 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008021#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008022 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008023#endif
8024#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008025 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008026#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008028#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008029 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008030#endif
8031
Christian Heimesfaf2f632008-01-06 16:59:19 +00008032#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008033 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008034 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8035#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008036 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008037#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008038 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008039 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8040#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008041 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008042#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008043 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008044 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008045 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008046 PyObject *tmp;
8047 tmp = PyLong_FromUnsignedLong(codes[i]);
8048 if (tmp == NULL)
8049 return NULL;
8050 PyModule_AddObject(m, names[i], tmp);
8051 }
8052 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, RCVALL_OFF);
8054 PyModule_AddIntMacro(m, RCVALL_ON);
8055 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008056#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008057 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008058#endif
8059#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008061#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008062#endif /* _MSTCPIP_ */
8063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008064 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008065#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008066 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008067#endif
animalize19e7d482018-02-27 02:10:36 +08008068
8069#ifdef MS_WINDOWS
8070 /* remove some flags on older version Windows during run-time */
8071 remove_unusable_flags(m);
8072#endif
8073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008074 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008075}