blob: c1b24c153e2b9ad8a3e2a3d79fcea30ab18a2142 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100105"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
106socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000107\n\
108Open a socket of the given type. The family argument specifies the\n\
109address family; it defaults to AF_INET. The type argument specifies\n\
110whether this is a stream (SOCK_STREAM, this is the default)\n\
111or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
112specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200113The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100115When a fileno is passed in, family, type and proto are auto-detected,\n\
116unless they are explicitly set.\n\
117\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118A socket object represents one endpoint of a network connection.\n\
119\n\
120Methods of socket objects (keyword arguments not allowed):\n\
121\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000122_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000123bind(addr) -- bind the socket to a local address\n\
124close() -- close the socket\n\
125connect(addr) -- connect the socket to a remote address\n\
126connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200127dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000128fileno() -- return underlying file descriptor\n\
129getpeername() -- return remote address [*]\n\
130getsockname() -- return local address\n\
131getsockopt(level, optname[, buflen]) -- get socket options\n\
132gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100133listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000134recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000135recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000137recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000138 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000139sendall(data[, flags]) -- send all data\n\
140send(data[, flags]) -- send data, may not send all of it\n\
141sendto(data[, flags], addr) -- send data to a given address\n\
142setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500143getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200144setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145settimeout(None | float) -- set or clear the timeout\n\
146shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700147if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700148if_nametoindex(name) -- return the corresponding interface index\n\
149if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000151 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000152
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000153/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000154 I hope some day someone can clean this up please... */
155
Guido van Rossum9376b741999-09-15 22:01:40 +0000156/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
157 script doesn't get this right, so we hardcode some platform checks below.
158 On the other hand, not all Linux versions agree, so there the settings
159 computed by the configure script are needed! */
160
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700161#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R_3_ARG
163# undef HAVE_GETHOSTBYNAME_R_5_ARG
164# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000165#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000166
Victor Stinner710d27e2011-08-23 10:57:32 +0200167#if defined(__OpenBSD__)
168# include <sys/uio.h>
169#endif
170
Stefan Krah1f9eb872016-05-22 17:35:34 +0200171#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000173#endif
174
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000176# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define HAVE_GETHOSTBYNAME_R_3_ARG
178# elif defined(__sun) || defined(__sgi)
179# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700180# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000181/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000182# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
183# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# else
185# undef HAVE_GETHOSTBYNAME_R
186# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000187#endif
188
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200189#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000191#endif
192
Ned Deilye1d4e582016-02-23 22:05:29 +1100193/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000194#ifdef HAVE_SYS_PARAM_H
195#include <sys/param.h>
196#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000197/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100198 (this includes the getaddrinfo emulation) protect access with a lock.
199
200 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
201 a mix of code including an unsafe implementation from an old BSD's
202 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
203 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100205
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
207 http://www.openbsd.org/plus54.html
208
209 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
210
211http://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 +1100212 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200213#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100214 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000215 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100216 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
217 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100218 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000219#define USE_GETADDRINFO_LOCK
220#endif
221
222#ifdef USE_GETADDRINFO_LOCK
223#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
224#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
225#else
226#define ACQUIRE_GETADDRINFO_LOCK
227#define RELEASE_GETADDRINFO_LOCK
228#endif
229
230#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000232#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000233
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000234
Serhiy Storchakad3187152017-11-09 18:00:38 +0200235#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100236# include <sys/ioctl.h>
237#endif
238
239
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241/* make sure that the reentrant (gethostbyaddr_r etc)
242 functions are declared correctly if compiling with
243 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244
Thomas Wouters477c8d52006-05-27 19:21:47 +0000245/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000247#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000249
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000250#undef _XOPEN_SOURCE
251#include <sys/socket.h>
252#include <sys/types.h>
253#include <netinet/in.h>
254#ifdef _SS_ALIGNSIZE
255#define HAVE_GETADDRINFO 1
256#define HAVE_GETNAMEINFO 1
257#endif
258
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000259#define HAVE_INET_PTON
260#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000261#endif
262
Benjamin Peterson06930632017-09-04 16:36:05 -0700263/* Solaris fails to define this variable at all. */
264#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000265#define INET_ADDRSTRLEN 16
266#endif
267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000270#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700273#ifdef HAVE_SYS_SOCKET_H
274#include <sys/socket.h>
275#endif
276
277#ifdef HAVE_NET_IF_H
278#include <net/if.h>
279#endif
280
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000281/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000283#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284
285/* Addressing includes */
286
Guido van Rossum6f489d91996-06-28 20:15:15 +0000287#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
289/* Non-MS WINDOWS includes */
290# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000291# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000292
Guido van Rossum9376b741999-09-15 22:01:40 +0000293/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000298#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301# ifdef HAVE_FCNTL_H
302# include <fcntl.h>
303# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304
Steve Dower65e4cb12014-11-22 12:54:57 -0800305/* Provides the IsWindows7SP1OrGreater() function */
306#include <VersionHelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800307
Jeremy Hylton22308652001-02-02 03:23:09 +0000308#endif
309
Skip Montanaro7befb992004-02-10 16:50:21 +0000310#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000311
Neal Norwitz39d22e52002-11-02 19:55:21 +0000312#ifndef O_NONBLOCK
313# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000314#endif
315
Trent Micka708d6e2004-09-07 17:48:26 +0000316/* include Python's addrinfo.h unless it causes trouble */
317#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
318 /* Do not include addinfo.h on some newer IRIX versions.
319 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
320 * for example, but not by 6.5.10.
321 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000322#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000323 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
324 * EAI_* constants are defined in (the already included) ws2tcpip.h.
325 */
326#else
327# include "addrinfo.h"
328#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000329
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000330#ifdef __APPLE__
331/* On OS X, getaddrinfo returns no error indication of lookup
332 failure, so we must use the emulation instead of the libinfo
333 implementation. Unfortunately, performing an autoconf test
334 for this bug would require DNS access for the machine performing
335 the configuration, which is not acceptable. Therefore, we
336 determine the bug just by checking for __APPLE__. If this bug
337 gets ever fixed, perhaps checking for sys/version.h would be
338 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000339#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600340/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000341 Find to check for Jaguar is that it has getnameinfo(), which
342 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000343#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000345
346#ifdef HAVE_INET_ATON
347#define USE_INET_ATON_WEAKLINK
348#endif
349
Jack Jansen84262fb2002-07-02 14:40:42 +0000350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000352/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000353#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000354/* avoid clashes with the C library definition of the symbol. */
355#define getaddrinfo fake_getaddrinfo
356#define gai_strerror fake_gai_strerror
357#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000358#include "getaddrinfo.c"
359#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000360#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000361#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000362#include "getnameinfo.c"
363#endif
364
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000365#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000367#endif
368
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000369#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000370#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000371#define EAFNOSUPPORT WSAEAFNOSUPPORT
372#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000373#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000374
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000375#ifndef SOCKETCLOSE
376#define SOCKETCLOSE close
377#endif
378
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000379#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000380#define USE_BLUETOOTH 1
381#if defined(__FreeBSD__)
382#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
383#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000384#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000385#define SOL_HCI SOL_HCI_RAW
386#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000387#define sockaddr_l2 sockaddr_l2cap
388#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000389#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
391#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000392#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000393#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define sockaddr_l2 sockaddr_bt
395#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000398#define SOL_HCI BTPROTO_HCI
399#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
401#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000402#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000403#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000404#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000405#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
406#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000407#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
409#endif
410#endif
411
Charles-François Natali8b759652011-12-23 16:44:51 +0100412/* Convert "sock_addr_t *" to "struct sockaddr *". */
413#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000414
Martin v. Löwise9416172003-05-03 10:12:45 +0000415/*
416 * Constants for getnameinfo()
417 */
418#if !defined(NI_MAXHOST)
419#define NI_MAXHOST 1025
420#endif
421#if !defined(NI_MAXSERV)
422#define NI_MAXSERV 32
423#endif
424
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000425#ifndef INVALID_SOCKET /* MS defines this */
426#define INVALID_SOCKET (-1)
427#endif
428
Charles-François Natali0cc86852013-09-13 19:53:08 +0200429#ifndef INADDR_NONE
430#define INADDR_NONE (-1)
431#endif
432
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000433/* XXX There's a problem here: *static* functions are not supposed to have
434 a Py prefix (or use CapitalizedWords). Later... */
435
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436/* Global variable holding the exception type for errors detected
437 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438static PyObject *socket_herror;
439static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000440static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441
Tim Peters643a7fc2002-02-17 04:13:21 +0000442/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000443 The sock_type variable contains pointers to various functions,
444 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000445 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000446static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000447
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000448#if defined(HAVE_POLL_H)
449#include <poll.h>
450#elif defined(HAVE_SYS_POLL_H)
451#include <sys/poll.h>
452#endif
453
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000454/* Largest value to try to store in a socklen_t (used when handling
455 ancillary data). POSIX requires socklen_t to hold at least
456 (2**31)-1 and recommends against storing larger values, but
457 socklen_t was originally int in the BSD interface, so to be on the
458 safe side we use the smaller of (2**31)-1 and INT_MAX. */
459#if INT_MAX > 0x7fffffff
460#define SOCKLEN_T_LIMIT 0x7fffffff
461#else
462#define SOCKLEN_T_LIMIT INT_MAX
463#endif
464
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200465#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466/* Instead of select(), we'll use poll() since poll() works on any fd. */
467#define IS_SELECTABLE(s) 1
468/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000469#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200470/* If there's no timeout left, we don't have to call select, so it's a safe,
471 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100472#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000473#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000474
475static PyObject*
476select_error(void)
477{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200478 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000480}
481
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000482#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000483#ifndef WSAEAGAIN
484#define WSAEAGAIN WSAEWOULDBLOCK
485#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000486#define CHECK_ERRNO(expected) \
487 (WSAGetLastError() == WSA ## expected)
488#else
489#define CHECK_ERRNO(expected) \
490 (errno == expected)
491#endif
492
Victor Stinnerdaf45552013-08-28 00:53:59 +0200493#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200494# define GET_SOCK_ERROR WSAGetLastError()
495# define SET_SOCK_ERROR(err) WSASetLastError(err)
496# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
497# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300498# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200499#else
500# define GET_SOCK_ERROR errno
501# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
502# define SOCK_TIMEOUT_ERR EWOULDBLOCK
503# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300504# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200505#endif
506
507
508#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200509/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
510static int support_wsa_no_inherit = -1;
511#endif
512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513/* Convenience function to raise an error according to errno
514 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000515
Guido van Rossum73624e91994-10-10 17:59:00 +0000516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000517set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000519#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 int err_no = WSAGetLastError();
521 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
522 recognizes the error codes used by both GetLastError() and
523 WSAGetLastError */
524 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200525 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000526#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000527
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200528 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529}
530
Guido van Rossum30a685f1991-06-27 15:51:29 +0000531
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000533set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536
537#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 if (v != NULL) {
543 PyErr_SetObject(socket_herror, v);
544 Py_DECREF(v);
545 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548}
549
550
551static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000552set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555
Martin v. Löwis272cb402002-03-01 08:31:07 +0000556#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 /* EAI_SYSTEM is not available on Windows XP. */
558 if (error == EAI_SYSTEM)
559 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000560#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000562#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 if (v != NULL) {
568 PyErr_SetObject(socket_gaierror, v);
569 Py_DECREF(v);
570 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573}
574
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000575/* Function to perform the setting of socket blocking mode
576 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000577static int
578internal_setblocking(PySocketSockObject *s, int block)
579{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400580 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200581#ifdef MS_WINDOWS
582 u_long arg;
583#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100584#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100585 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100586 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100591#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200593 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400594 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100595#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200597 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400598 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100600 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 else
Victor Stinner9a954832013-12-04 00:41:24 +0100602 new_delay_flag = delay_flag | O_NONBLOCK;
603 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200604 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400605 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100606#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200608 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200609 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400610 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400612
613 result = 0;
614
615 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617
Yury Selivanovfa22b292016-10-18 16:03:52 -0400618 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200619#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400620 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200621#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400622 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200623#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400624 }
625
626 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627}
628
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000629static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200630internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
631 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100634#ifdef HAVE_POLL
635 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200636 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100637#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200638 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200639 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100640#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000641
Victor Stinnerb7df3142015-03-27 22:59:32 +0100642 /* must be called with the GIL held */
643 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100644
Victor Stinner416f2e62015-03-31 13:56:29 +0200645 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200646 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200649 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* Prefer poll, if available, since you can poll() any fd
653 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100655 pollfd.fd = s->sock_fd;
656 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200657 if (connect) {
658 /* On Windows, the socket becomes writable on connection success,
659 but a connection failure is notified as an error. On POSIX, the
660 socket becomes writable on connection success or on connection
661 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200662 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200663 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000664
Victor Stinner71694d52015-03-28 01:18:54 +0100665 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200666 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200667 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668
Victor Stinner71694d52015-03-28 01:18:54 +0100669 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200670 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100671 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000672#else
Victor Stinnerced11742015-04-09 10:27:25 +0200673 if (interval >= 0) {
674 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
675 tvp = &tv;
676 }
677 else
678 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679
Victor Stinner71694d52015-03-28 01:18:54 +0100680 FD_ZERO(&fds);
681 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200682 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200683 if (connect) {
684 /* On Windows, the socket becomes writable on connection success,
685 but a connection failure is notified as an error. On POSIX, the
686 socket becomes writable on connection success or on connection
687 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200688 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200689 }
Victor Stinner71694d52015-03-28 01:18:54 +0100690
691 /* See if the socket is ready */
692 Py_BEGIN_ALLOW_THREADS;
693 if (writing)
694 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200695 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100696 else
697 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200698 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100699 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 if (n < 0)
703 return -1;
704 if (n == 0)
705 return 1;
706 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707}
708
Victor Stinner31bf2d52015-04-01 21:57:09 +0200709/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000710
Victor Stinner81c41db2015-04-02 11:50:57 +0200711 On error, raise an exception and return -1 if err is set, or fill err and
712 return -1 otherwise. If a signal was received and the signal handler raised
713 an exception, return -1, and set err to -1 if err is set.
714
715 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100716
Victor Stinner31bf2d52015-04-01 21:57:09 +0200717 If the socket has a timeout, wait until the socket is ready before calling
718 the function: wait until the socket is writable if writing is nonzero, wait
719 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100720
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200722 the function, except if the signal handler raised an exception (PEP 475).
723
724 When the function is retried, recompute the timeout using a monotonic clock.
725
Victor Stinner81c41db2015-04-02 11:50:57 +0200726 sock_call_ex() must be called with the GIL held. The socket function is
727 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200728static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200729sock_call_ex(PySocketSockObject *s,
730 int writing,
731 int (*sock_func) (PySocketSockObject *s, void *data),
732 void *data,
733 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200734 int *err,
735 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200736{
Victor Stinner8912d142015-04-06 23:16:34 +0200737 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738 _PyTime_t deadline = 0;
739 int deadline_initialized = 0;
740 int res;
741
742 /* sock_call() must be called with the GIL held. */
743 assert(PyGILState_Check());
744
745 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200746 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200748 /* For connect(), poll even for blocking socket. The connection
749 runs asynchronously. */
750 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200751 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200752 _PyTime_t interval;
753
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 if (deadline_initialized) {
755 /* recompute the timeout */
756 interval = deadline - _PyTime_GetMonotonicClock();
757 }
758 else {
759 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200760 deadline = _PyTime_GetMonotonicClock() + timeout;
761 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200763
Victor Stinner10550cd2015-04-03 13:22:27 +0200764 if (interval >= 0)
765 res = internal_select(s, writing, interval, connect);
766 else
767 res = 1;
768 }
769 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200770 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200771 }
772
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (err)
775 *err = GET_SOCK_ERROR;
776
Victor Stinner31bf2d52015-04-01 21:57:09 +0200777 if (CHECK_ERRNO(EINTR)) {
778 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200779 if (PyErr_CheckSignals()) {
780 if (err)
781 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200782 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200783 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784
785 /* retry select() */
786 continue;
787 }
788
789 /* select() failed */
790 s->errorhandler();
791 return -1;
792 }
793
794 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 if (err)
796 *err = SOCK_TIMEOUT_ERR;
797 else
798 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200799 return -1;
800 }
801
802 /* the socket is ready */
803 }
804
Victor Stinner81c41db2015-04-02 11:50:57 +0200805 /* inner loop to retry sock_func() when sock_func() is interrupted
806 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 while (1) {
808 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200809 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 Py_END_ALLOW_THREADS
811
812 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 /* sock_func() succeeded */
814 if (err)
815 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200816 return 0;
817 }
818
Victor Stinner81c41db2015-04-02 11:50:57 +0200819 if (err)
820 *err = GET_SOCK_ERROR;
821
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 if (!CHECK_ERRNO(EINTR))
823 break;
824
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 /* sock_func() was interrupted by a signal */
826 if (PyErr_CheckSignals()) {
827 if (err)
828 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200829 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200830 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 }
834
835 if (s->sock_timeout > 0
836 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200837 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200838
839 For example, select() could indicate a socket is ready for
840 reading, but the data then discarded by the OS because of a
841 wrong checksum.
842
843 Loop on select() to recheck for socket readyness. */
844 continue;
845 }
846
Victor Stinner81c41db2015-04-02 11:50:57 +0200847 /* sock_func() failed */
848 if (!err)
849 s->errorhandler();
850 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000851 return -1;
852 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200853}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855static int
856sock_call(PySocketSockObject *s,
857 int writing,
858 int (*func) (PySocketSockObject *s, void *data),
859 void *data)
860{
Victor Stinner8912d142015-04-06 23:16:34 +0200861 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200862}
863
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000864
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000865/* Initialize a new socket object. */
866
Victor Stinner88ed6402015-04-09 10:23:12 +0200867/* Default timeout for new sockets */
868static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000869
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200870static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000871init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 s->sock_fd = fd;
875 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500878
879 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
880 on some OSes as part of socket.type. We want to reset them here,
881 to make socket.type be set to the same value on all platforms.
882 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
883 not portable.
884 */
885#ifdef SOCK_NONBLOCK
886 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
887#endif
888#ifdef SOCK_CLOEXEC
889 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
890#endif
891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000895#ifdef SOCK_NONBLOCK
896 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100897 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000898 else
899#endif
900 {
901 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200902 if (defaulttimeout >= 0) {
903 if (internal_setblocking(s, 0) == -1) {
904 return -1;
905 }
906 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000907 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200908 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000909}
910
911
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912/* Create a new socket object.
913 This just creates the object and initializes it.
914 If the creation fails, return NULL and set an exception (implicit
915 in NEWOBJ()). */
916
Guido van Rossum73624e91994-10-10 17:59:00 +0000917static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000918new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 PySocketSockObject *s;
921 s = (PySocketSockObject *)
922 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200923 if (s == NULL)
924 return NULL;
925 if (init_sockobject(s, fd, family, type, proto) == -1) {
926 Py_DECREF(s);
927 return NULL;
928 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930}
931
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932
Guido van Rossum48a680c2001-03-02 06:34:14 +0000933/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000934 thread to be in gethostbyname or getaddrinfo */
935#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200936static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000937#endif
938
939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940/* Convert a string specifying a host name or one of a few symbolic
941 names to a numeric IP address. This usually calls gethostbyname()
942 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000943 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944 an error occurred; then an exception is raised. */
945
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200947setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 struct addrinfo hints, *res;
950 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
953 if (name[0] == '\0') {
954 int siz;
955 memset(&hints, 0, sizeof(hints));
956 hints.ai_family = af;
957 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
958 hints.ai_flags = AI_PASSIVE;
959 Py_BEGIN_ALLOW_THREADS
960 ACQUIRE_GETADDRINFO_LOCK
961 error = getaddrinfo(NULL, "0", &hints, &res);
962 Py_END_ALLOW_THREADS
963 /* We assume that those thread-unsafe getaddrinfo() versions
964 *are* safe regarding their return value, ie. that a
965 subsequent call to getaddrinfo() does not destroy the
966 outcome of the first call. */
967 RELEASE_GETADDRINFO_LOCK
968 if (error) {
969 set_gaierror(error);
970 return -1;
971 }
972 switch (res->ai_family) {
973 case AF_INET:
974 siz = 4;
975 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000976#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 case AF_INET6:
978 siz = 16;
979 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 default:
982 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200983 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 "unsupported address family");
985 return -1;
986 }
987 if (res->ai_next) {
988 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200989 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 "wildcard resolved to multiple address");
991 return -1;
992 }
993 if (res->ai_addrlen < addr_ret_size)
994 addr_ret_size = res->ai_addrlen;
995 memcpy(addr_ret, res->ai_addr, addr_ret_size);
996 freeaddrinfo(res);
997 return siz;
998 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200999 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001000 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001001 if (strcmp(name, "255.255.255.255") == 0 ||
1002 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 struct sockaddr_in *sin;
1004 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001005 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 "address family mismatched");
1007 return -1;
1008 }
1009 sin = (struct sockaddr_in *)addr_ret;
1010 memset((void *) sin, '\0', sizeof(*sin));
1011 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001012#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 sin->sin_addr.s_addr = INADDR_BROADCAST;
1016 return sizeof(sin->sin_addr);
1017 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001018
1019 /* avoid a name resolution in case of numeric address */
1020#ifdef HAVE_INET_PTON
1021 /* check for an IPv4 address */
1022 if (af == AF_UNSPEC || af == AF_INET) {
1023 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1024 memset(sin, 0, sizeof(*sin));
1025 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1026 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001027#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001028 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001029#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001030 return 4;
1031 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001033#ifdef ENABLE_IPV6
1034 /* check for an IPv6 address - if the address contains a scope ID, we
1035 * fallback to getaddrinfo(), which can handle translation from interface
1036 * name to interface index */
1037 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1038 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1039 memset(sin, 0, sizeof(*sin));
1040 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1041 sin->sin6_family = AF_INET6;
1042#ifdef HAVE_SOCKADDR_SA_LEN
1043 sin->sin6_len = sizeof(*sin);
1044#endif
1045 return 16;
1046 }
1047 }
1048#endif /* ENABLE_IPV6 */
1049#else /* HAVE_INET_PTON */
1050 /* check for an IPv4 address */
1051 if (af == AF_INET || af == AF_UNSPEC) {
1052 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1053 memset(sin, 0, sizeof(*sin));
1054 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1055 sin->sin_family = AF_INET;
1056#ifdef HAVE_SOCKADDR_SA_LEN
1057 sin->sin_len = sizeof(*sin);
1058#endif
1059 return 4;
1060 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001061 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001062#endif /* HAVE_INET_PTON */
1063
1064 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 memset(&hints, 0, sizeof(hints));
1066 hints.ai_family = af;
1067 Py_BEGIN_ALLOW_THREADS
1068 ACQUIRE_GETADDRINFO_LOCK
1069 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001070#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 if (error == EAI_NONAME && af == AF_UNSPEC) {
1072 /* On Tru64 V5.1, numeric-to-addr conversion fails
1073 if no address family is given. Assume IPv4 for now.*/
1074 hints.ai_family = AF_INET;
1075 error = getaddrinfo(name, NULL, &hints, &res);
1076 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 Py_END_ALLOW_THREADS
1079 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1080 if (error) {
1081 set_gaierror(error);
1082 return -1;
1083 }
1084 if (res->ai_addrlen < addr_ret_size)
1085 addr_ret_size = res->ai_addrlen;
1086 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1087 freeaddrinfo(res);
1088 switch (addr_ret->sa_family) {
1089 case AF_INET:
1090 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001091#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 case AF_INET6:
1093 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001096 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 return -1;
1098 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001099}
1100
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101
Miss Islington (bot)04425992018-02-12 12:12:24 -08001102/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104static PyObject *
Miss Islington (bot)04425992018-02-12 12:12:24 -08001105make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001106{
Miss Islington (bot)04425992018-02-12 12:12:24 -08001107 char buf[INET_ADDRSTRLEN];
1108 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1109 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 return NULL;
1111 }
1112 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113}
1114
Miss Islington (bot)04425992018-02-12 12:12:24 -08001115#ifdef ENABLE_IPV6
1116/* Convert IPv6 sockaddr to a Python str. */
1117
1118static PyObject *
1119make_ipv6_addr(const struct sockaddr_in6 *addr)
1120{
1121 char buf[INET6_ADDRSTRLEN];
1122 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1123 PyErr_SetFromErrno(PyExc_OSError);
1124 return NULL;
1125 }
1126 return PyUnicode_FromString(buf);
1127}
1128#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130#ifdef USE_BLUETOOTH
1131/* Convert a string representation of a Bluetooth address into a numeric
1132 address. Returns the length (6), or raises an exception and returns -1 if
1133 an error occurred. */
1134
1135static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001136setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 unsigned int b0, b1, b2, b3, b4, b5;
1139 char ch;
1140 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1143 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1144 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1145 bdaddr->b[0] = b0;
1146 bdaddr->b[1] = b1;
1147 bdaddr->b[2] = b2;
1148 bdaddr->b[3] = b3;
1149 bdaddr->b[4] = b4;
1150 bdaddr->b[5] = b5;
1151 return 6;
1152 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001153 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 return -1;
1155 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156}
1157
1158/* Create a string representation of the Bluetooth address. This is always a
1159 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1160 value (zero padded if necessary). */
1161
1162static PyObject *
1163makebdaddr(bdaddr_t *bdaddr)
1164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1168 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1169 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1170 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001171}
1172#endif
1173
1174
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175/* Create an object representing the given socket address,
1176 suitable for passing it back to bind(), connect() etc.
1177 The family field of the sockaddr structure is inspected
1178 to determine what kind of address it really is. */
1179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001182makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (addrlen == 0) {
1185 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001186 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_INET:
1192 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001193 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1194 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 PyObject *ret = NULL;
1196 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1198 Py_DECREF(addrobj);
1199 }
1200 return ret;
1201 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001203#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 case AF_UNIX:
1205 {
1206 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001207#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001208 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1209 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1210 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 }
1212 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001213#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 {
1215 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001216 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 }
1218 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001219#endif /* AF_UNIX */
1220
Martin v. Löwis11017b12006-01-14 18:12:57 +00001221#if defined(AF_NETLINK)
1222 case AF_NETLINK:
1223 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1225 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001226 }
1227#endif /* AF_NETLINK */
1228
caaveryeffc12f2017-09-06 18:18:10 -04001229#if defined(AF_VSOCK)
1230 case AF_VSOCK:
1231 {
1232 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1233 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1234 }
1235#endif /* AF_VSOCK */
1236
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001237#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 case AF_INET6:
1239 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001240 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1241 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 PyObject *ret = NULL;
1243 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001244 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 addrobj,
1246 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001247 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 a->sin6_scope_id);
1249 Py_DECREF(addrobj);
1250 }
1251 return ret;
1252 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001253#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 case AF_BLUETOOTH:
1257 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 case BTPROTO_L2CAP:
1260 {
1261 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1262 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1263 PyObject *ret = NULL;
1264 if (addrobj) {
1265 ret = Py_BuildValue("Oi",
1266 addrobj,
1267 _BT_L2_MEMB(a, psm));
1268 Py_DECREF(addrobj);
1269 }
1270 return ret;
1271 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case BTPROTO_RFCOMM:
1274 {
1275 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1276 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1277 PyObject *ret = NULL;
1278 if (addrobj) {
1279 ret = Py_BuildValue("Oi",
1280 addrobj,
1281 _BT_RC_MEMB(a, channel));
1282 Py_DECREF(addrobj);
1283 }
1284 return ret;
1285 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 case BTPROTO_HCI:
1288 {
1289 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001290#if defined(__NetBSD__) || defined(__DragonFly__)
1291 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001292#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 PyObject *ret = NULL;
1294 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1295 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001296#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001298
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 case BTPROTO_SCO:
1301 {
1302 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1303 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1304 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001305#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 default:
1308 PyErr_SetString(PyExc_ValueError,
1309 "Unknown Bluetooth protocol");
1310 return NULL;
1311 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001312#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001313
Antoine Pitroub156a462010-10-27 20:13:57 +00001314#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 case AF_PACKET:
1316 {
1317 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001318 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 struct ifreq ifr;
1320 /* need to look up interface name give index */
1321 if (a->sll_ifindex) {
1322 ifr.ifr_ifindex = a->sll_ifindex;
1323 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1324 ifname = ifr.ifr_name;
1325 }
1326 return Py_BuildValue("shbhy#",
1327 ifname,
1328 ntohs(a->sll_protocol),
1329 a->sll_pkttype,
1330 a->sll_hatype,
1331 a->sll_addr,
1332 a->sll_halen);
1333 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001334#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001335
Christian Heimes043d6f62008-01-07 17:19:16 +00001336#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 case AF_TIPC:
1338 {
1339 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1340 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1341 return Py_BuildValue("IIIII",
1342 a->addrtype,
1343 a->addr.nameseq.type,
1344 a->addr.nameseq.lower,
1345 a->addr.nameseq.upper,
1346 a->scope);
1347 } else if (a->addrtype == TIPC_ADDR_NAME) {
1348 return Py_BuildValue("IIIII",
1349 a->addrtype,
1350 a->addr.name.name.type,
1351 a->addr.name.name.instance,
1352 a->addr.name.name.instance,
1353 a->scope);
1354 } else if (a->addrtype == TIPC_ADDR_ID) {
1355 return Py_BuildValue("IIIII",
1356 a->addrtype,
1357 a->addr.id.node,
1358 a->addr.id.ref,
1359 0,
1360 a->scope);
1361 } else {
1362 PyErr_SetString(PyExc_ValueError,
1363 "Invalid address type");
1364 return NULL;
1365 }
1366 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001367#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001368
Serhiy Storchakad3187152017-11-09 18:00:38 +02001369#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001370 case AF_CAN:
1371 {
1372 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001373 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001374 struct ifreq ifr;
1375 /* need to look up interface name given index */
1376 if (a->can_ifindex) {
1377 ifr.ifr_ifindex = a->can_ifindex;
1378 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1379 ifname = ifr.ifr_name;
1380 }
1381
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001382 switch (proto) {
1383#ifdef CAN_ISOTP
1384 case CAN_ISOTP:
1385 {
1386 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1387 ifname,
1388 a->can_addr.tp.rx_id,
1389 a->can_addr.tp.tx_id);
1390 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001391#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001392 default:
1393 {
1394 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1395 ifname);
1396 }
1397 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001398 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001399#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001400
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001401#ifdef PF_SYSTEM
1402 case PF_SYSTEM:
1403 switch(proto) {
1404#ifdef SYSPROTO_CONTROL
1405 case SYSPROTO_CONTROL:
1406 {
1407 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1408 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1409 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001410#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001411 default:
1412 PyErr_SetString(PyExc_ValueError,
1413 "Invalid address type");
1414 return 0;
1415 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001416#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001417
Christian Heimesdffa3942016-09-05 23:54:41 +02001418#ifdef HAVE_SOCKADDR_ALG
1419 case AF_ALG:
1420 {
1421 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1422 return Py_BuildValue("s#s#HH",
1423 a->salg_type,
1424 strnlen((const char*)a->salg_type,
1425 sizeof(a->salg_type)),
1426 a->salg_name,
1427 strnlen((const char*)a->salg_name,
1428 sizeof(a->salg_name)),
1429 a->salg_feat,
1430 a->salg_mask);
1431 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001432#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 default:
1437 /* If we don't know the address family, don't raise an
1438 exception -- return it as an (int, bytes) tuple. */
1439 return Py_BuildValue("iy#",
1440 addr->sa_family,
1441 addr->sa_data,
1442 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001445}
1446
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001447/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1448 (in particular, numeric IP addresses). */
1449struct maybe_idna {
1450 PyObject *obj;
1451 char *buf;
1452};
1453
1454static void
1455idna_cleanup(struct maybe_idna *data)
1456{
1457 Py_CLEAR(data->obj);
1458}
1459
1460static int
1461idna_converter(PyObject *obj, struct maybe_idna *data)
1462{
1463 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001464 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001465 if (obj == NULL) {
1466 idna_cleanup(data);
1467 return 1;
1468 }
1469 data->obj = NULL;
1470 len = -1;
1471 if (PyBytes_Check(obj)) {
1472 data->buf = PyBytes_AsString(obj);
1473 len = PyBytes_Size(obj);
1474 }
1475 else if (PyByteArray_Check(obj)) {
1476 data->buf = PyByteArray_AsString(obj);
1477 len = PyByteArray_Size(obj);
1478 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001479 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001480 if (PyUnicode_READY(obj) == -1) {
1481 return 0;
1482 }
1483 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001484 data->buf = PyUnicode_DATA(obj);
1485 len = PyUnicode_GET_LENGTH(obj);
1486 }
1487 else {
1488 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1489 if (!obj2) {
1490 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1491 return 0;
1492 }
1493 assert(PyBytes_Check(obj2));
1494 data->obj = obj2;
1495 data->buf = PyBytes_AS_STRING(obj2);
1496 len = PyBytes_GET_SIZE(obj2);
1497 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001498 }
1499 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001500 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1501 obj->ob_type->tp_name);
1502 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001503 }
1504 if (strlen(data->buf) != len) {
1505 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001506 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001507 return 0;
1508 }
1509 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001510}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001511
1512/* Parse a socket address argument according to the socket object's
1513 address family. Return 1 if the address was in the proper format,
1514 0 of not. The address is returned through addr_ret, its length
1515 through len_ret. */
1516
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001517static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001518getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001522
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001523#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 case AF_UNIX:
1525 {
1526 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001527 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001528 int retval = 0;
1529
1530 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1531 allow embedded nulls on Linux. */
1532 if (PyUnicode_Check(args)) {
1533 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1534 return 0;
1535 }
1536 else
1537 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001538 if (!PyArg_Parse(args, "y*", &path)) {
1539 Py_DECREF(args);
1540 return retval;
1541 }
1542 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001545#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001546 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001548 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001549 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001551 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
1553 }
1554 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001555#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 {
1557 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001558 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001559 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001561 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001563 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 }
1565 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001566 memcpy(addr->sun_path, path.buf, path.len);
1567 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001568 retval = 1;
1569 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001570 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001571 Py_DECREF(args);
1572 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001574#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575
Martin v. Löwis11017b12006-01-14 18:12:57 +00001576#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 case AF_NETLINK:
1578 {
1579 struct sockaddr_nl* addr;
1580 int pid, groups;
1581 addr = (struct sockaddr_nl *)addr_ret;
1582 if (!PyTuple_Check(args)) {
1583 PyErr_Format(
1584 PyExc_TypeError,
1585 "getsockaddrarg: "
1586 "AF_NETLINK address must be tuple, not %.500s",
1587 Py_TYPE(args)->tp_name);
1588 return 0;
1589 }
1590 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1591 return 0;
1592 addr->nl_family = AF_NETLINK;
1593 addr->nl_pid = pid;
1594 addr->nl_groups = groups;
1595 *len_ret = sizeof(*addr);
1596 return 1;
1597 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001598#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001599
caaveryeffc12f2017-09-06 18:18:10 -04001600#if defined(AF_VSOCK)
1601 case AF_VSOCK:
1602 {
1603 struct sockaddr_vm* addr;
1604 int port, cid;
1605 addr = (struct sockaddr_vm *)addr_ret;
1606 memset(addr, 0, sizeof(struct sockaddr_vm));
1607 if (!PyTuple_Check(args)) {
1608 PyErr_Format(
1609 PyExc_TypeError,
1610 "getsockaddrarg: "
1611 "AF_VSOCK address must be tuple, not %.500s",
1612 Py_TYPE(args)->tp_name);
1613 return 0;
1614 }
1615 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1616 return 0;
1617 addr->svm_family = s->sock_family;
1618 addr->svm_port = port;
1619 addr->svm_cid = cid;
1620 *len_ret = sizeof(*addr);
1621 return 1;
1622 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001623#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001624
1625
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001626#ifdef AF_RDS
1627 case AF_RDS:
1628 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001629#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 case AF_INET:
1632 {
1633 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 int port, result;
1636 if (!PyTuple_Check(args)) {
1637 PyErr_Format(
1638 PyExc_TypeError,
1639 "getsockaddrarg: "
1640 "AF_INET address must be tuple, not %.500s",
1641 Py_TYPE(args)->tp_name);
1642 return 0;
1643 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001644 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1645 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 return 0;
1647 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001648 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001650 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 if (result < 0)
1652 return 0;
1653 if (port < 0 || port > 0xffff) {
1654 PyErr_SetString(
1655 PyExc_OverflowError,
1656 "getsockaddrarg: port must be 0-65535.");
1657 return 0;
1658 }
1659 addr->sin_family = AF_INET;
1660 addr->sin_port = htons((short)port);
1661 *len_ret = sizeof *addr;
1662 return 1;
1663 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001664
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001665#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 case AF_INET6:
1667 {
1668 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001669 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001670 int port, result;
1671 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 flowinfo = scope_id = 0;
1673 if (!PyTuple_Check(args)) {
1674 PyErr_Format(
1675 PyExc_TypeError,
1676 "getsockaddrarg: "
1677 "AF_INET6 address must be tuple, not %.500s",
1678 Py_TYPE(args)->tp_name);
1679 return 0;
1680 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001681 if (!PyArg_ParseTuple(args, "O&i|II",
1682 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 &scope_id)) {
1684 return 0;
1685 }
1686 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001687 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001689 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 if (result < 0)
1691 return 0;
1692 if (port < 0 || port > 0xffff) {
1693 PyErr_SetString(
1694 PyExc_OverflowError,
1695 "getsockaddrarg: port must be 0-65535.");
1696 return 0;
1697 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001698 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001699 PyErr_SetString(
1700 PyExc_OverflowError,
1701 "getsockaddrarg: flowinfo must be 0-1048575.");
1702 return 0;
1703 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 addr->sin6_family = s->sock_family;
1705 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001706 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 addr->sin6_scope_id = scope_id;
1708 *len_ret = sizeof *addr;
1709 return 1;
1710 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001711#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001712
Hye-Shik Chang81268602004-02-02 06:05:24 +00001713#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 case AF_BLUETOOTH:
1715 {
1716 switch (s->sock_proto) {
1717 case BTPROTO_L2CAP:
1718 {
1719 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001720 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 addr = (struct sockaddr_l2 *)addr_ret;
1723 memset(addr, 0, sizeof(struct sockaddr_l2));
1724 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1725 if (!PyArg_ParseTuple(args, "si", &straddr,
1726 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001727 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 "wrong format");
1729 return 0;
1730 }
1731 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1732 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 *len_ret = sizeof *addr;
1735 return 1;
1736 }
1737 case BTPROTO_RFCOMM:
1738 {
1739 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001740 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 addr = (struct sockaddr_rc *)addr_ret;
1743 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1744 if (!PyArg_ParseTuple(args, "si", &straddr,
1745 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001746 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 "wrong format");
1748 return 0;
1749 }
1750 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1751 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 *len_ret = sizeof *addr;
1754 return 1;
1755 }
1756 case BTPROTO_HCI:
1757 {
1758 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001759#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001760 const char *straddr;
1761 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1762 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001763 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001764 "wrong format");
1765 return 0;
1766 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001767 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001768 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1769 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001770#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1772 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001773 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 "wrong format");
1775 return 0;
1776 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001777#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 *len_ret = sizeof *addr;
1779 return 1;
1780 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001781#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 case BTPROTO_SCO:
1783 {
1784 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001785 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 addr = (struct sockaddr_sco *)addr_ret;
1788 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1789 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 "wrong format");
1792 return 0;
1793 }
1794 straddr = PyBytes_AS_STRING(args);
1795 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1796 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 *len_ret = sizeof *addr;
1799 return 1;
1800 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001801#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001803 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return 0;
1805 }
1806 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001807#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001808
Antoine Pitroub156a462010-10-27 20:13:57 +00001809#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 case AF_PACKET:
1811 {
1812 struct sockaddr_ll* addr;
1813 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001814 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 int protoNumber;
1816 int hatype = 0;
1817 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 if (!PyTuple_Check(args)) {
1821 PyErr_Format(
1822 PyExc_TypeError,
1823 "getsockaddrarg: "
1824 "AF_PACKET address must be tuple, not %.500s",
1825 Py_TYPE(args)->tp_name);
1826 return 0;
1827 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001830 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 0;
1832 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1833 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1834 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1835 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001836 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 return 0;
1838 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001839 if (haddr.buf && haddr.len > 8) {
1840 PyErr_SetString(PyExc_ValueError,
1841 "Hardware address must be 8 bytes or less");
1842 PyBuffer_Release(&haddr);
1843 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 }
1845 if (protoNumber < 0 || protoNumber > 0xffff) {
1846 PyErr_SetString(
1847 PyExc_OverflowError,
1848 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001849 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 return 0;
1851 }
1852 addr = (struct sockaddr_ll*)addr_ret;
1853 addr->sll_family = AF_PACKET;
1854 addr->sll_protocol = htons((short)protoNumber);
1855 addr->sll_ifindex = ifr.ifr_ifindex;
1856 addr->sll_pkttype = pkttype;
1857 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001858 if (haddr.buf) {
1859 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1860 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001862 else
1863 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001865 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 return 1;
1867 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001868#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001869
Christian Heimes043d6f62008-01-07 17:19:16 +00001870#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 case AF_TIPC:
1872 {
1873 unsigned int atype, v1, v2, v3;
1874 unsigned int scope = TIPC_CLUSTER_SCOPE;
1875 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (!PyTuple_Check(args)) {
1878 PyErr_Format(
1879 PyExc_TypeError,
1880 "getsockaddrarg: "
1881 "AF_TIPC address must be tuple, not %.500s",
1882 Py_TYPE(args)->tp_name);
1883 return 0;
1884 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (!PyArg_ParseTuple(args,
1887 "IIII|I;Invalid TIPC address format",
1888 &atype, &v1, &v2, &v3, &scope))
1889 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 addr = (struct sockaddr_tipc *) addr_ret;
1892 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 addr->family = AF_TIPC;
1895 addr->scope = scope;
1896 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 if (atype == TIPC_ADDR_NAMESEQ) {
1899 addr->addr.nameseq.type = v1;
1900 addr->addr.nameseq.lower = v2;
1901 addr->addr.nameseq.upper = v3;
1902 } else if (atype == TIPC_ADDR_NAME) {
1903 addr->addr.name.name.type = v1;
1904 addr->addr.name.name.instance = v2;
1905 } else if (atype == TIPC_ADDR_ID) {
1906 addr->addr.id.node = v1;
1907 addr->addr.id.ref = v2;
1908 } else {
1909 /* Shouldn't happen */
1910 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1911 return 0;
1912 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 return 1;
1917 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001918#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001919
Serhiy Storchakad3187152017-11-09 18:00:38 +02001920#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001921 case AF_CAN:
1922 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001923#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001925 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001926#endif
1927#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001928 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001929#endif
1930#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001931 {
1932 struct sockaddr_can *addr;
1933 PyObject *interfaceName;
1934 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001935 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001936 addr = (struct sockaddr_can *)addr_ret;
1937
Charles-François Natali47413c12011-10-06 19:47:44 +02001938 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1939 &interfaceName))
1940 return 0;
1941
1942 len = PyBytes_GET_SIZE(interfaceName);
1943
1944 if (len == 0) {
1945 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001946 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001947 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1948 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001949 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1950 s->errorhandler();
1951 Py_DECREF(interfaceName);
1952 return 0;
1953 }
1954 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001955 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001956 "AF_CAN interface name too long");
1957 Py_DECREF(interfaceName);
1958 return 0;
1959 }
1960
1961 addr->can_family = AF_CAN;
1962 addr->can_ifindex = ifr.ifr_ifindex;
1963
1964 *len_ret = sizeof(*addr);
1965 Py_DECREF(interfaceName);
1966 return 1;
1967 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001968#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001969
1970#ifdef CAN_ISOTP
1971 case CAN_ISOTP:
1972 {
1973 struct sockaddr_can *addr;
1974 PyObject *interfaceName;
1975 struct ifreq ifr;
1976 Py_ssize_t len;
1977 unsigned long int rx_id, tx_id;
1978
1979 addr = (struct sockaddr_can *)addr_ret;
1980
1981 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1982 &interfaceName,
1983 &rx_id,
1984 &tx_id))
1985 return 0;
1986
1987 len = PyBytes_GET_SIZE(interfaceName);
1988
1989 if (len == 0) {
1990 ifr.ifr_ifindex = 0;
1991 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1992 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1993 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1994 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1995 s->errorhandler();
1996 Py_DECREF(interfaceName);
1997 return 0;
1998 }
1999 } else {
2000 PyErr_SetString(PyExc_OSError,
2001 "AF_CAN interface name too long");
2002 Py_DECREF(interfaceName);
2003 return 0;
2004 }
2005
2006 addr->can_family = AF_CAN;
2007 addr->can_ifindex = ifr.ifr_ifindex;
2008 addr->can_addr.tp.rx_id = rx_id;
2009 addr->can_addr.tp.tx_id = tx_id;
2010
2011 *len_ret = sizeof(*addr);
2012 Py_DECREF(interfaceName);
2013 return 1;
2014 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002015#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002016 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002017 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002018 "getsockaddrarg: unsupported CAN protocol");
2019 return 0;
2020 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002021#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002022
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002023#ifdef PF_SYSTEM
2024 case PF_SYSTEM:
2025 switch (s->sock_proto) {
2026#ifdef SYSPROTO_CONTROL
2027 case SYSPROTO_CONTROL:
2028 {
2029 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002030
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002031 addr = (struct sockaddr_ctl *)addr_ret;
2032 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002033 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002034
2035 if (PyUnicode_Check(args)) {
2036 struct ctl_info info;
2037 PyObject *ctl_name;
2038
2039 if (!PyArg_Parse(args, "O&",
2040 PyUnicode_FSConverter, &ctl_name)) {
2041 return 0;
2042 }
2043
Victor Stinnerf50e1872015-03-20 11:32:24 +01002044 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002045 PyErr_SetString(PyExc_ValueError,
2046 "provided string is too long");
2047 Py_DECREF(ctl_name);
2048 return 0;
2049 }
2050 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2051 sizeof(info.ctl_name));
2052 Py_DECREF(ctl_name);
2053
2054 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2055 PyErr_SetString(PyExc_OSError,
2056 "cannot find kernel control with provided name");
2057 return 0;
2058 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002059
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002060 addr->sc_id = info.ctl_id;
2061 addr->sc_unit = 0;
2062 } else if (!PyArg_ParseTuple(args, "II",
2063 &(addr->sc_id), &(addr->sc_unit))) {
2064 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2065 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002066
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002067 return 0;
2068 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002069
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002070 *len_ret = sizeof(*addr);
2071 return 1;
2072 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002073#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002074 default:
2075 PyErr_SetString(PyExc_OSError,
2076 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2077 return 0;
2078 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002079#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002080#ifdef HAVE_SOCKADDR_ALG
2081 case AF_ALG:
2082 {
2083 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002084 const char *type;
2085 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002086 sa = (struct sockaddr_alg *)addr_ret;
2087
2088 memset(sa, 0, sizeof(*sa));
2089 sa->salg_family = AF_ALG;
2090
2091 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2092 &type, &name, &sa->salg_feat, &sa->salg_mask))
2093 return 0;
2094 /* sockaddr_alg has fixed-sized char arrays for type and name */
2095 if (strlen(type) > sizeof(sa->salg_type)) {
2096 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2097 return 0;
2098 }
2099 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2100 if (strlen(name) > sizeof(sa->salg_name)) {
2101 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2102 return 0;
2103 }
2104 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2105
2106 *len_ret = sizeof(*sa);
2107 return 1;
2108 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002109#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002114 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002118}
2119
Guido van Rossum30a685f1991-06-27 15:51:29 +00002120
Guido van Rossum48a680c2001-03-02 06:34:14 +00002121/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002122 Return 1 if the family is known, 0 otherwise. The length is returned
2123 through len_ret. */
2124
2125static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002126getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002129
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002130#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 case AF_UNIX:
2132 {
2133 *len_ret = sizeof (struct sockaddr_un);
2134 return 1;
2135 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002136#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002137
Martin v. Löwis11017b12006-01-14 18:12:57 +00002138#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002139 case AF_NETLINK:
2140 {
2141 *len_ret = sizeof (struct sockaddr_nl);
2142 return 1;
2143 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002144#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002145
caaveryeffc12f2017-09-06 18:18:10 -04002146#if defined(AF_VSOCK)
2147 case AF_VSOCK:
2148 {
2149 *len_ret = sizeof (struct sockaddr_vm);
2150 return 1;
2151 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002152#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002153
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002154#ifdef AF_RDS
2155 case AF_RDS:
2156 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002157#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 case AF_INET:
2160 {
2161 *len_ret = sizeof (struct sockaddr_in);
2162 return 1;
2163 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002164
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002165#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 case AF_INET6:
2167 {
2168 *len_ret = sizeof (struct sockaddr_in6);
2169 return 1;
2170 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002171#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002172
Hye-Shik Chang81268602004-02-02 06:05:24 +00002173#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 case AF_BLUETOOTH:
2175 {
2176 switch(s->sock_proto)
2177 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 case BTPROTO_L2CAP:
2180 *len_ret = sizeof (struct sockaddr_l2);
2181 return 1;
2182 case BTPROTO_RFCOMM:
2183 *len_ret = sizeof (struct sockaddr_rc);
2184 return 1;
2185 case BTPROTO_HCI:
2186 *len_ret = sizeof (struct sockaddr_hci);
2187 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002188#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 case BTPROTO_SCO:
2190 *len_ret = sizeof (struct sockaddr_sco);
2191 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002192#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002194 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 "unknown BT protocol");
2196 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 }
2199 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002200#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002201
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002202#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 case AF_PACKET:
2204 {
2205 *len_ret = sizeof (struct sockaddr_ll);
2206 return 1;
2207 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002208#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002209
Christian Heimes043d6f62008-01-07 17:19:16 +00002210#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 case AF_TIPC:
2212 {
2213 *len_ret = sizeof (struct sockaddr_tipc);
2214 return 1;
2215 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002216#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002217
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002218#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002219 case AF_CAN:
2220 {
2221 *len_ret = sizeof (struct sockaddr_can);
2222 return 1;
2223 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002224#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002225
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002226#ifdef PF_SYSTEM
2227 case PF_SYSTEM:
2228 switch(s->sock_proto) {
2229#ifdef SYSPROTO_CONTROL
2230 case SYSPROTO_CONTROL:
2231 *len_ret = sizeof (struct sockaddr_ctl);
2232 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002233#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002234 default:
2235 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2236 "unknown PF_SYSTEM protocol");
2237 return 0;
2238 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002239#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002240#ifdef HAVE_SOCKADDR_ALG
2241 case AF_ALG:
2242 {
2243 *len_ret = sizeof (struct sockaddr_alg);
2244 return 1;
2245 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002246#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002251 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002255}
2256
2257
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2259 Currently, these methods are only compiled if the RFC 2292/3542
2260 CMSG_LEN() macro is available. Older systems seem to have used
2261 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2262 it may be possible to define CMSG_LEN() that way if it's not
2263 provided. Some architectures might need extra padding after the
2264 cmsghdr, however, and CMSG_LEN() would have to take account of
2265 this. */
2266#ifdef CMSG_LEN
2267/* If length is in range, set *result to CMSG_LEN(length) and return
2268 true; otherwise, return false. */
2269static int
2270get_CMSG_LEN(size_t length, size_t *result)
2271{
2272 size_t tmp;
2273
2274 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2275 return 0;
2276 tmp = CMSG_LEN(length);
2277 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2278 return 0;
2279 *result = tmp;
2280 return 1;
2281}
2282
2283#ifdef CMSG_SPACE
2284/* If length is in range, set *result to CMSG_SPACE(length) and return
2285 true; otherwise, return false. */
2286static int
2287get_CMSG_SPACE(size_t length, size_t *result)
2288{
2289 size_t tmp;
2290
2291 /* Use CMSG_SPACE(1) here in order to take account of the padding
2292 necessary before *and* after the data. */
2293 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2294 return 0;
2295 tmp = CMSG_SPACE(length);
2296 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2297 return 0;
2298 *result = tmp;
2299 return 1;
2300}
2301#endif
2302
2303/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2304 pointer in msg->msg_control with at least "space" bytes after it,
2305 and its cmsg_len member inside the buffer. */
2306static int
2307cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2308{
2309 size_t cmsg_offset;
2310 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2311 sizeof(cmsgh->cmsg_len));
2312
Charles-François Natali466517d2011-08-28 18:23:43 +02002313 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002314 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002315 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002316 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2317 annoying under OS X as it's unsigned there and so it triggers a
2318 tautological comparison warning under Clang when compared against 0.
2319 Since the check is valid on other platforms, silence the warning under
2320 Clang. */
2321 #ifdef __clang__
2322 #pragma clang diagnostic push
2323 #pragma clang diagnostic ignored "-Wtautological-compare"
2324 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002325 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002326 #pragma GCC diagnostic push
2327 #pragma GCC diagnostic ignored "-Wtype-limits"
2328 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002329 if (msg->msg_controllen < 0)
2330 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002331 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002332 #pragma GCC diagnostic pop
2333 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002334 #ifdef __clang__
2335 #pragma clang diagnostic pop
2336 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002337 if (space < cmsg_len_end)
2338 space = cmsg_len_end;
2339 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2340 return (cmsg_offset <= (size_t)-1 - space &&
2341 cmsg_offset + space <= msg->msg_controllen);
2342}
2343
2344/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2345 *space to number of bytes following it in the buffer and return
2346 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2347 msg->msg_controllen are valid. */
2348static int
2349get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2350{
2351 size_t data_offset;
2352 char *data_ptr;
2353
2354 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2355 return 0;
2356 data_offset = data_ptr - (char *)msg->msg_control;
2357 if (data_offset > msg->msg_controllen)
2358 return 0;
2359 *space = msg->msg_controllen - data_offset;
2360 return 1;
2361}
2362
2363/* If cmsgh is invalid or not contained in the buffer pointed to by
2364 msg->msg_control, return -1. If cmsgh is valid and its associated
2365 data is entirely contained in the buffer, set *data_len to the
2366 length of the associated data and return 0. If only part of the
2367 associated data is contained in the buffer but cmsgh is otherwise
2368 valid, set *data_len to the length contained in the buffer and
2369 return 1. */
2370static int
2371get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2372{
2373 size_t space, cmsg_data_len;
2374
2375 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2376 cmsgh->cmsg_len < CMSG_LEN(0))
2377 return -1;
2378 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2379 if (!get_cmsg_data_space(msg, cmsgh, &space))
2380 return -1;
2381 if (space >= cmsg_data_len) {
2382 *data_len = cmsg_data_len;
2383 return 0;
2384 }
2385 *data_len = space;
2386 return 1;
2387}
2388#endif /* CMSG_LEN */
2389
2390
Victor Stinner31bf2d52015-04-01 21:57:09 +02002391struct sock_accept {
2392 socklen_t *addrlen;
2393 sock_addr_t *addrbuf;
2394 SOCKET_T result;
2395};
2396
2397#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2398/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2399static int accept4_works = -1;
2400#endif
2401
2402static int
2403sock_accept_impl(PySocketSockObject *s, void *data)
2404{
2405 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002406 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2407 socklen_t *paddrlen = ctx->addrlen;
2408#ifdef HAVE_SOCKADDR_ALG
2409 /* AF_ALG does not support accept() with addr and raises
2410 * ECONNABORTED instead. */
2411 if (s->sock_family == AF_ALG) {
2412 addr = NULL;
2413 paddrlen = NULL;
2414 *ctx->addrlen = 0;
2415 }
2416#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002417
2418#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2419 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002420 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002421 SOCK_CLOEXEC);
2422 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2423 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2424 accept4_works = (errno != ENOSYS);
2425 }
2426 }
2427 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002428 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002429#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002430 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002431#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002432
2433#ifdef MS_WINDOWS
2434 return (ctx->result != INVALID_SOCKET);
2435#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002436 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002437#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002438}
2439
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002440/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002441
Guido van Rossum73624e91994-10-10 17:59:00 +00002442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002443sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002446 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 socklen_t addrlen;
2448 PyObject *sock = NULL;
2449 PyObject *addr = NULL;
2450 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002451 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 if (!getsockaddrlen(s, &addrlen))
2454 return NULL;
2455 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 if (!IS_SELECTABLE(s))
2458 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002459
Victor Stinner31bf2d52015-04-01 21:57:09 +02002460 ctx.addrlen = &addrlen;
2461 ctx.addrbuf = &addrbuf;
2462 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002464 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002465
Victor Stinnerdaf45552013-08-28 00:53:59 +02002466#ifdef MS_WINDOWS
2467 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2468 PyErr_SetFromWindowsErr(0);
2469 SOCKETCLOSE(newfd);
2470 goto finally;
2471 }
2472#else
2473
2474#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2475 if (!accept4_works)
2476#endif
2477 {
2478 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2479 SOCKETCLOSE(newfd);
2480 goto finally;
2481 }
2482 }
2483#endif
2484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 sock = PyLong_FromSocket_t(newfd);
2486 if (sock == NULL) {
2487 SOCKETCLOSE(newfd);
2488 goto finally;
2489 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2492 addrlen, s->sock_proto);
2493 if (addr == NULL)
2494 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002497
Guido van Rossum67f7a382002-06-06 21:08:16 +00002498finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 Py_XDECREF(sock);
2500 Py_XDECREF(addr);
2501 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002502}
2503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002504PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002505"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002506\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002507Wait for an incoming connection. Return a new socket file descriptor\n\
2508representing the connection, and the address of the client.\n\
2509For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510
Guido van Rossum11ba0942002-06-13 15:07:44 +00002511/* s.setblocking(flag) method. Argument:
2512 False -- non-blocking mode; same as settimeout(0)
2513 True -- blocking mode; same as settimeout(None)
2514*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002515
Guido van Rossum73624e91994-10-10 17:59:00 +00002516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002517sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002518{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002519 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 block = PyLong_AsLong(arg);
2522 if (block == -1 && PyErr_Occurred())
2523 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002524
Victor Stinner9001d802015-04-06 23:06:01 +02002525 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002526 if (internal_setblocking(s, block) == -1) {
2527 return NULL;
2528 }
2529 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002530}
Guido van Rossume4485b01994-09-07 14:32:49 +00002531
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002532PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002533"setblocking(flag)\n\
2534\n\
2535Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002536setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002537setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002538
Yury Selivanovf11b4602018-01-28 17:27:38 -05002539/* s.getblocking() method.
2540 Returns True if socket is in blocking mode,
2541 False if it is in non-blocking mode.
2542*/
2543static PyObject *
2544sock_getblocking(PySocketSockObject *s)
2545{
2546 if (s->sock_timeout) {
2547 Py_RETURN_TRUE;
2548 }
2549 else {
2550 Py_RETURN_FALSE;
2551 }
2552}
2553
2554PyDoc_STRVAR(getblocking_doc,
2555"getblocking()\n\
2556\n\
2557Returns True if socket is in blocking mode, or False if it\n\
2558is in non-blocking mode.");
2559
Victor Stinner71694d52015-03-28 01:18:54 +01002560static int
2561socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2562{
2563#ifdef MS_WINDOWS
2564 struct timeval tv;
2565#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002566#ifndef HAVE_POLL
2567 _PyTime_t ms;
2568#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002569 int overflow = 0;
2570
2571 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002572 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002573 return 0;
2574 }
2575
Victor Stinner869e1772015-03-30 03:49:14 +02002576 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002577 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002578 return -1;
2579
2580 if (*timeout < 0) {
2581 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2582 return -1;
2583 }
2584
2585#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002586 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002587#endif
2588#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002589 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002590 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002591#endif
2592 if (overflow) {
2593 PyErr_SetString(PyExc_OverflowError,
2594 "timeout doesn't fit into C timeval");
2595 return -1;
2596 }
2597
2598 return 0;
2599}
2600
Guido van Rossum11ba0942002-06-13 15:07:44 +00002601/* s.settimeout(timeout) method. Argument:
2602 None -- no timeout, blocking mode; same as setblocking(True)
2603 0.0 -- non-blocking mode; same as setblocking(False)
2604 > 0 -- timeout mode; operations time out after timeout seconds
2605 < 0 -- illegal; raises an exception
2606*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002607static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002608sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002609{
Victor Stinner71694d52015-03-28 01:18:54 +01002610 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002611
Victor Stinner71694d52015-03-28 01:18:54 +01002612 if (socket_parse_timeout(&timeout, arg) < 0)
2613 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002616
2617 int block = timeout < 0;
2618 /* Blocking mode for a Python socket object means that operations
2619 like :meth:`recv` or :meth:`sendall` will block the execution of
2620 the current thread until they are complete or aborted with a
2621 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2622 the underlying FD is in a blocking mode. When timeout is a positive
2623 number, the FD is in a non-blocking mode, and socket ops are
2624 implemented with a `select()` call.
2625
2626 When timeout is 0.0, the FD is in a non-blocking mode.
2627
2628 This table summarizes all states in which the socket object and
2629 its underlying FD can be:
2630
2631 ==================== ===================== ==============
2632 `gettimeout()` `getblocking()` FD
2633 ==================== ===================== ==============
2634 ``None`` ``True`` blocking
2635 ``0.0`` ``False`` non-blocking
2636 ``> 0`` ``True`` non-blocking
2637 */
2638
2639 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002640 return NULL;
2641 }
2642 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002643}
2644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002645PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002646"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002647\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002648Set a timeout on socket operations. 'timeout' can be a float,\n\
2649giving in seconds, or None. Setting a timeout of None disables\n\
2650the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002651Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002652
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002653/* s.gettimeout() method.
2654 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002655static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002656sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002657{
Victor Stinner71694d52015-03-28 01:18:54 +01002658 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002659 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 }
Victor Stinner71694d52015-03-28 01:18:54 +01002661 else {
2662 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2663 return PyFloat_FromDouble(seconds);
2664 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665}
2666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002668"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002669\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002670Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002671operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002672operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002673
Guido van Rossumaee08791992-09-08 09:05:33 +00002674/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002675 With an integer third argument, sets an integer optval with optlen=4.
2676 With None as third argument and an integer fourth argument, set
2677 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002678 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002679 use optional built-in module 'struct' to encode the string.
2680*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002681
Guido van Rossum73624e91994-10-10 17:59:00 +00002682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002683sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 int level;
2686 int optname;
2687 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002688 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002690 unsigned int optlen;
2691 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002692
caaveryeffc12f2017-09-06 18:18:10 -04002693#ifdef AF_VSOCK
2694 if (s->sock_family == AF_VSOCK) {
2695 uint64_t vflag; // Must be set width of 64 bits
2696 /* setsockopt(level, opt, flag) */
2697 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2698 &level, &optname, &vflag)) {
2699 // level should always be set to AF_VSOCK
2700 res = setsockopt(s->sock_fd, level, optname,
2701 (void*)&vflag, sizeof vflag);
2702 goto done;
2703 }
2704 return NULL;
2705 }
2706#endif
2707
Christian Heimesdffa3942016-09-05 23:54:41 +02002708 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 if (PyArg_ParseTuple(args, "iii:setsockopt",
2710 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002711 res = setsockopt(s->sock_fd, level, optname,
2712 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002713 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002715
2716 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002717 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002718 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2719 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2720 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002721 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002722 NULL, (socklen_t)optlen);
2723 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002725
2726 PyErr_Clear();
2727 /* setsockopt(level, opt, buffer) */
2728 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2729 &level, &optname, &optval))
2730 return NULL;
2731
2732#ifdef MS_WINDOWS
2733 if (optval.len > INT_MAX) {
2734 PyBuffer_Release(&optval);
2735 PyErr_Format(PyExc_OverflowError,
2736 "socket option is larger than %i bytes",
2737 INT_MAX);
2738 return NULL;
2739 }
2740 res = setsockopt(s->sock_fd, level, optname,
2741 optval.buf, (int)optval.len);
2742#else
2743 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2744#endif
2745 PyBuffer_Release(&optval);
2746
2747done:
Victor Stinnercc739322016-03-23 21:35:29 +01002748 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002750 }
2751
2752 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002753}
2754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002755PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002756"setsockopt(level, option, value: int)\n\
2757setsockopt(level, option, value: buffer)\n\
2758setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002759\n\
2760Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002761The value argument can either be an integer, a string buffer, or \n\
2762None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002763
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002764
Guido van Rossumaee08791992-09-08 09:05:33 +00002765/* s.getsockopt() method.
2766 With two arguments, retrieves an integer option.
2767 With a third integer argument, retrieves a string buffer of that size;
2768 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002769
Guido van Rossum73624e91994-10-10 17:59:00 +00002770static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002771sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 int level;
2774 int optname;
2775 int res;
2776 PyObject *buf;
2777 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002778 int flag = 0;
2779 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2782 &level, &optname, &buflen))
2783 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002786#ifdef AF_VSOCK
2787 if (s->sock_family == AF_VSOCK) {
2788 uint64_t vflag = 0; // Must be set width of 64 bits
2789 flagsize = sizeof vflag;
2790 res = getsockopt(s->sock_fd, level, optname,
2791 (void *)&vflag, &flagsize);
2792 if (res < 0)
2793 return s->errorhandler();
2794 return PyLong_FromUnsignedLong(vflag);
2795 }
2796#endif
2797 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 res = getsockopt(s->sock_fd, level, optname,
2799 (void *)&flag, &flagsize);
2800 if (res < 0)
2801 return s->errorhandler();
2802 return PyLong_FromLong(flag);
2803 }
caaveryeffc12f2017-09-06 18:18:10 -04002804#ifdef AF_VSOCK
2805 if (s->sock_family == AF_VSOCK) {
2806 PyErr_SetString(PyExc_OSError,
2807 "getsockopt string buffer not allowed");
2808 return NULL;
2809 }
2810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002812 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 "getsockopt buflen out of range");
2814 return NULL;
2815 }
2816 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2817 if (buf == NULL)
2818 return NULL;
2819 res = getsockopt(s->sock_fd, level, optname,
2820 (void *)PyBytes_AS_STRING(buf), &buflen);
2821 if (res < 0) {
2822 Py_DECREF(buf);
2823 return s->errorhandler();
2824 }
2825 _PyBytes_Resize(&buf, buflen);
2826 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002827}
2828
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002829PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002830"getsockopt(level, option[, buffersize]) -> value\n\
2831\n\
2832Get a socket option. See the Unix manual for level and option.\n\
2833If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002836
Fred Drake728819a2000-07-01 03:40:12 +00002837/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002838
Guido van Rossum73624e91994-10-10 17:59:00 +00002839static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002840sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 sock_addr_t addrbuf;
2843 int addrlen;
2844 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2847 return NULL;
2848 Py_BEGIN_ALLOW_THREADS
2849 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2850 Py_END_ALLOW_THREADS
2851 if (res < 0)
2852 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002853 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002854}
2855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002856PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002857"bind(address)\n\
2858\n\
2859Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002860pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002861sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002862
Guido van Rossum30a685f1991-06-27 15:51:29 +00002863
2864/* s.close() method.
2865 Set the file descriptor to -1 so operations tried subsequently
2866 will surely fail. */
2867
Guido van Rossum73624e91994-10-10 17:59:00 +00002868static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002869sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002872 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002873
Victor Stinner19a8e842016-03-21 16:36:48 +01002874 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002875 if (fd != INVALID_SOCKET) {
2876 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002877
2878 /* We do not want to retry upon EINTR: see
2879 http://lwn.net/Articles/576478/ and
2880 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2881 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002883 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002885 /* bpo-30319: The peer can already have closed the connection.
2886 Python ignores ECONNRESET on close(). */
2887 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002888 return s->errorhandler();
2889 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002891 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002892}
2893
Christian Heimesd0e31b92018-01-27 09:54:13 +01002894PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002895"close()\n\
2896\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002897Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002898
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002899static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002900sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002901{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002902 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002903 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002904 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002905}
2906
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002907PyDoc_STRVAR(detach_doc,
2908"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002909\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002910Close the socket object without closing the underlying file descriptor.\n\
2911The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002912can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002913
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002914static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002915sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002916{
Victor Stinner81c41db2015-04-02 11:50:57 +02002917 int err;
2918 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002919
Victor Stinner81c41db2015-04-02 11:50:57 +02002920 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2921 /* getsockopt() failed */
2922 return 0;
2923 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002924
Victor Stinner81c41db2015-04-02 11:50:57 +02002925 if (err == EISCONN)
2926 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002927 if (err != 0) {
2928 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2929 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002930 return 0;
2931 }
2932 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002933}
2934
2935static int
2936internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2937 int raise)
2938{
2939 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002940
2941 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002943 Py_END_ALLOW_THREADS
2944
Victor Stinner70a46f62015-03-31 22:03:59 +02002945 if (!res) {
2946 /* connect() succeeded, the socket is connected */
2947 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002949
Victor Stinner81c41db2015-04-02 11:50:57 +02002950 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002951
Victor Stinner81c41db2015-04-02 11:50:57 +02002952 /* save error, PyErr_CheckSignals() can replace it */
2953 err = GET_SOCK_ERROR;
2954 if (CHECK_ERRNO(EINTR)) {
2955 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002956 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002957
2958 /* Issue #23618: when connect() fails with EINTR, the connection is
2959 running asynchronously.
2960
2961 If the socket is blocking or has a timeout, wait until the
2962 connection completes, fails or timed out using select(), and then
2963 get the connection status using getsockopt(SO_ERROR).
2964
2965 If the socket is non-blocking, raise InterruptedError. The caller is
2966 responsible to wait until the connection completes, fails or timed
2967 out (it's the case in asyncio for example). */
2968 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2969 }
2970 else {
2971 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2972 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002973 }
2974
Victor Stinner81c41db2015-04-02 11:50:57 +02002975 if (!wait_connect) {
2976 if (raise) {
2977 /* restore error, maybe replaced by PyErr_CheckSignals() */
2978 SET_SOCK_ERROR(err);
2979 s->errorhandler();
2980 return -1;
2981 }
2982 else
2983 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002984 }
2985
Victor Stinner81c41db2015-04-02 11:50:57 +02002986 if (raise) {
2987 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002988 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2989 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002990 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002991 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002992 else {
2993 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002994 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2995 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002996 return err;
2997 }
2998 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002999}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003000
Fred Drake728819a2000-07-01 03:40:12 +00003001/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003002
Guido van Rossum73624e91994-10-10 17:59:00 +00003003static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003004sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 sock_addr_t addrbuf;
3007 int addrlen;
3008 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3011 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003012
Victor Stinner81c41db2015-04-02 11:50:57 +02003013 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003014 if (res < 0)
3015 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003016
Victor Stinneree699e92015-03-31 21:28:42 +02003017 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003018}
3019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003020PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003021"connect(address)\n\
3022\n\
3023Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003024is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003025
Guido van Rossum30a685f1991-06-27 15:51:29 +00003026
Fred Drake728819a2000-07-01 03:40:12 +00003027/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003028
3029static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 sock_addr_t addrbuf;
3033 int addrlen;
3034 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3037 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003038
Victor Stinner81c41db2015-04-02 11:50:57 +02003039 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003040 if (res < 0)
3041 return NULL;
3042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003044}
3045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003046PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003047"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003048\n\
3049This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003050instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003051
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003052
Guido van Rossumed233a51992-06-23 09:07:03 +00003053/* s.fileno() method */
3054
Guido van Rossum73624e91994-10-10 17:59:00 +00003055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003056sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003059}
3060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003061PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003062"fileno() -> integer\n\
3063\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065
Guido van Rossumed233a51992-06-23 09:07:03 +00003066
Guido van Rossumc89705d1992-11-26 08:54:07 +00003067/* s.getsockname() method */
3068
Guido van Rossum73624e91994-10-10 17:59:00 +00003069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003070sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 sock_addr_t addrbuf;
3073 int res;
3074 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 if (!getsockaddrlen(s, &addrlen))
3077 return NULL;
3078 memset(&addrbuf, 0, addrlen);
3079 Py_BEGIN_ALLOW_THREADS
3080 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3081 Py_END_ALLOW_THREADS
3082 if (res < 0)
3083 return s->errorhandler();
3084 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3085 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003086}
3087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003088PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003089"getsockname() -> address info\n\
3090\n\
3091Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003092info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003093
Guido van Rossumc89705d1992-11-26 08:54:07 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003096/* s.getpeername() method */
3097
Guido van Rossum73624e91994-10-10 17:59:00 +00003098static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003099sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 sock_addr_t addrbuf;
3102 int res;
3103 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 if (!getsockaddrlen(s, &addrlen))
3106 return NULL;
3107 memset(&addrbuf, 0, addrlen);
3108 Py_BEGIN_ALLOW_THREADS
3109 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3110 Py_END_ALLOW_THREADS
3111 if (res < 0)
3112 return s->errorhandler();
3113 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3114 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003115}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003117PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003118"getpeername() -> address info\n\
3119\n\
3120Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003121info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003122
Guido van Rossumb6775db1994-08-01 11:34:53 +00003123#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003124
3125
Guido van Rossum30a685f1991-06-27 15:51:29 +00003126/* s.listen(n) method */
3127
Guido van Rossum73624e91994-10-10 17:59:00 +00003128static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003129sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003130{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003131 /* We try to choose a default backlog high enough to avoid connection drops
3132 * for common workloads, yet not too high to limit resource usage. */
3133 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003135
Charles-François Natali644b8f52014-05-22 19:45:39 +01003136 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003140 /* To avoid problems on systems that don't allow a negative backlog
3141 * (which doesn't make sense anyway) we force a minimum value of 0. */
3142 if (backlog < 0)
3143 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 res = listen(s->sock_fd, backlog);
3145 Py_END_ALLOW_THREADS
3146 if (res < 0)
3147 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003148 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003149}
3150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003151PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003152"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003153\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003154Enable a server to accept connections. If backlog is specified, it must be\n\
3155at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003156unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003157connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003158
Victor Stinner31bf2d52015-04-01 21:57:09 +02003159struct sock_recv {
3160 char *cbuf;
3161 Py_ssize_t len;
3162 int flags;
3163 Py_ssize_t result;
3164};
3165
3166static int
3167sock_recv_impl(PySocketSockObject *s, void *data)
3168{
3169 struct sock_recv *ctx = data;
3170
3171#ifdef MS_WINDOWS
3172 if (ctx->len > INT_MAX)
3173 ctx->len = INT_MAX;
3174 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3175#else
3176 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3177#endif
3178 return (ctx->result >= 0);
3179}
3180
Guido van Rossum82a5c661998-07-07 20:45:43 +00003181
Thomas Wouters477c8d52006-05-27 19:21:47 +00003182/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003183 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003184 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003185 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003186 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003187 * also possible that we return a number of bytes smaller than the request
3188 * bytes.
3189 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003190
Antoine Pitrou19467d22010-08-17 19:33:30 +00003191static Py_ssize_t
3192sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003193{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003194 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 if (!IS_SELECTABLE(s)) {
3197 select_error();
3198 return -1;
3199 }
3200 if (len == 0) {
3201 /* If 0 bytes were requested, do nothing. */
3202 return 0;
3203 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003204
Victor Stinner31bf2d52015-04-01 21:57:09 +02003205 ctx.cbuf = cbuf;
3206 ctx.len = len;
3207 ctx.flags = flags;
3208 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003210
3211 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003212}
3213
Guido van Rossum48a680c2001-03-02 06:34:14 +00003214
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003215/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003216
Guido van Rossum73624e91994-10-10 17:59:00 +00003217static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003218sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003219{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003220 Py_ssize_t recvlen, outlen;
3221 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003223
Antoine Pitrou19467d22010-08-17 19:33:30 +00003224 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 if (recvlen < 0) {
3228 PyErr_SetString(PyExc_ValueError,
3229 "negative buffersize in recv");
3230 return NULL;
3231 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 /* Allocate a new string. */
3234 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3235 if (buf == NULL)
3236 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 /* Call the guts */
3239 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3240 if (outlen < 0) {
3241 /* An error occurred, release the string and return an
3242 error. */
3243 Py_DECREF(buf);
3244 return NULL;
3245 }
3246 if (outlen != recvlen) {
3247 /* We did not read as many bytes as we anticipated, resize the
3248 string if possible and be successful. */
3249 _PyBytes_Resize(&buf, outlen);
3250 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003253}
3254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003255PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003256"recv(buffersize[, flags]) -> data\n\
3257\n\
3258Receive up to buffersize bytes from the socket. For the optional flags\n\
3259argument, see the Unix manual. When no data is available, block until\n\
3260at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003261the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003262
Guido van Rossum30a685f1991-06-27 15:51:29 +00003263
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003264/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003265
Thomas Wouters477c8d52006-05-27 19:21:47 +00003266static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003267sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003270
Antoine Pitrou19467d22010-08-17 19:33:30 +00003271 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 Py_buffer pbuf;
3273 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003274 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003277 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 &pbuf, &recvlen, &flags))
3279 return NULL;
3280 buf = pbuf.buf;
3281 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 if (recvlen < 0) {
3284 PyBuffer_Release(&pbuf);
3285 PyErr_SetString(PyExc_ValueError,
3286 "negative buffersize in recv_into");
3287 return NULL;
3288 }
3289 if (recvlen == 0) {
3290 /* If nbytes was not specified, use the buffer's length */
3291 recvlen = buflen;
3292 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 /* Check if the buffer is large enough */
3295 if (buflen < recvlen) {
3296 PyBuffer_Release(&pbuf);
3297 PyErr_SetString(PyExc_ValueError,
3298 "buffer too small for requested bytes");
3299 return NULL;
3300 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 /* Call the guts */
3303 readlen = sock_recv_guts(s, buf, recvlen, flags);
3304 if (readlen < 0) {
3305 /* Return an error. */
3306 PyBuffer_Release(&pbuf);
3307 return NULL;
3308 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 PyBuffer_Release(&pbuf);
3311 /* Return the number of bytes read. Note that we do not do anything
3312 special here in the case that readlen < recvlen. */
3313 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003314}
3315
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003316PyDoc_STRVAR(recv_into_doc,
3317"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003318\n\
3319A version of recv() that stores its data into a buffer rather than creating \n\
3320a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3321is not specified (or 0), receive up to the size available in the given buffer.\n\
3322\n\
3323See recv() for documentation about the flags.");
3324
Victor Stinner31bf2d52015-04-01 21:57:09 +02003325struct sock_recvfrom {
3326 char* cbuf;
3327 Py_ssize_t len;
3328 int flags;
3329 socklen_t *addrlen;
3330 sock_addr_t *addrbuf;
3331 Py_ssize_t result;
3332};
3333
3334static int
3335sock_recvfrom_impl(PySocketSockObject *s, void *data)
3336{
3337 struct sock_recvfrom *ctx = data;
3338
3339 memset(ctx->addrbuf, 0, *ctx->addrlen);
3340
3341#ifdef MS_WINDOWS
3342 if (ctx->len > INT_MAX)
3343 ctx->len = INT_MAX;
3344 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3345 SAS2SA(ctx->addrbuf), ctx->addrlen);
3346#else
3347 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3348 SAS2SA(ctx->addrbuf), ctx->addrlen);
3349#endif
3350 return (ctx->result >= 0);
3351}
3352
Thomas Wouters477c8d52006-05-27 19:21:47 +00003353
3354/*
Christian Heimes99170a52007-12-19 02:07:34 +00003355 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3356 * into a char buffer. If you have any inc/def ref to do to the objects that
3357 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003358 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003359 * that it is also possible that we return a number of bytes smaller than the
3360 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003361 *
3362 * 'addr' is a return value for the address object. Note that you must decref
3363 * it yourself.
3364 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003365static Py_ssize_t
3366sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003371 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (!getsockaddrlen(s, &addrlen))
3376 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 if (!IS_SELECTABLE(s)) {
3379 select_error();
3380 return -1;
3381 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003382
Victor Stinner31bf2d52015-04-01 21:57:09 +02003383 ctx.cbuf = cbuf;
3384 ctx.len = len;
3385 ctx.flags = flags;
3386 ctx.addrbuf = &addrbuf;
3387 ctx.addrlen = &addrlen;
3388 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003390
Victor Stinner31bf2d52015-04-01 21:57:09 +02003391 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3392 s->sock_proto);
3393 if (*addr == NULL)
3394 return -1;
3395
3396 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397}
3398
3399/* s.recvfrom(nbytes [,flags]) method */
3400
3401static PyObject *
3402sock_recvfrom(PySocketSockObject *s, PyObject *args)
3403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 PyObject *buf = NULL;
3405 PyObject *addr = NULL;
3406 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003407 int flags = 0;
3408 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003409
Antoine Pitrou19467d22010-08-17 19:33:30 +00003410 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 if (recvlen < 0) {
3414 PyErr_SetString(PyExc_ValueError,
3415 "negative buffersize in recvfrom");
3416 return NULL;
3417 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3420 if (buf == NULL)
3421 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3424 recvlen, flags, &addr);
3425 if (outlen < 0) {
3426 goto finally;
3427 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 if (outlen != recvlen) {
3430 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003431 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003433 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 goto finally;
3435 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003438
3439finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 Py_XDECREF(buf);
3441 Py_XDECREF(addr);
3442 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003443}
3444
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003445PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003446"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3447\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003448Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003449
Thomas Wouters477c8d52006-05-27 19:21:47 +00003450
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003451/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003452
3453static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003454sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003457
Antoine Pitrou19467d22010-08-17 19:33:30 +00003458 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 Py_buffer pbuf;
3460 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003461 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003464
Antoine Pitrou19467d22010-08-17 19:33:30 +00003465 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 kwlist, &pbuf,
3467 &recvlen, &flags))
3468 return NULL;
3469 buf = pbuf.buf;
3470 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 if (recvlen < 0) {
3473 PyBuffer_Release(&pbuf);
3474 PyErr_SetString(PyExc_ValueError,
3475 "negative buffersize in recvfrom_into");
3476 return NULL;
3477 }
3478 if (recvlen == 0) {
3479 /* If nbytes was not specified, use the buffer's length */
3480 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003481 } else if (recvlen > buflen) {
3482 PyBuffer_Release(&pbuf);
3483 PyErr_SetString(PyExc_ValueError,
3484 "nbytes is greater than the length of the buffer");
3485 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3489 if (readlen < 0) {
3490 PyBuffer_Release(&pbuf);
3491 /* Return an error */
3492 Py_XDECREF(addr);
3493 return NULL;
3494 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 PyBuffer_Release(&pbuf);
3497 /* Return the number of bytes read and the address. Note that we do
3498 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003499 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003500}
3501
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003502PyDoc_STRVAR(recvfrom_into_doc,
3503"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003504\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003505Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003506
Victor Stinner35bee932015-04-02 12:28:07 +02003507/* The sendmsg() and recvmsg[_into]() methods require a working
3508 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3509#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003510struct sock_recvmsg {
3511 struct msghdr *msg;
3512 int flags;
3513 ssize_t result;
3514};
3515
3516static int
3517sock_recvmsg_impl(PySocketSockObject *s, void *data)
3518{
3519 struct sock_recvmsg *ctx = data;
3520
3521 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3522 return (ctx->result >= 0);
3523}
3524
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003525/*
3526 * Call recvmsg() with the supplied iovec structures, flags, and
3527 * ancillary data buffer size (controllen). Returns the tuple return
3528 * value for recvmsg() or recvmsg_into(), with the first item provided
3529 * by the supplied makeval() function. makeval() will be called with
3530 * the length read and makeval_data as arguments, and must return a
3531 * new reference (which will be decrefed if there is a subsequent
3532 * error). On error, closes any file descriptors received via
3533 * SCM_RIGHTS.
3534 */
3535static PyObject *
3536sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3537 int flags, Py_ssize_t controllen,
3538 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3539{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003540 sock_addr_t addrbuf;
3541 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003542 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543 PyObject *cmsg_list = NULL, *retval = NULL;
3544 void *controlbuf = NULL;
3545 struct cmsghdr *cmsgh;
3546 size_t cmsgdatalen = 0;
3547 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003548 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003549
3550 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3551 ignored" when the socket is connected (Linux fills them in
3552 anyway for AF_UNIX sockets at least). Normally msg_namelen
3553 seems to be set to 0 if there's no address, but try to
3554 initialize msg_name to something that won't be mistaken for a
3555 real address if that doesn't happen. */
3556 if (!getsockaddrlen(s, &addrbuflen))
3557 return NULL;
3558 memset(&addrbuf, 0, addrbuflen);
3559 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3560
3561 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3562 PyErr_SetString(PyExc_ValueError,
3563 "invalid ancillary data buffer length");
3564 return NULL;
3565 }
3566 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3567 return PyErr_NoMemory();
3568
3569 /* Make the system call. */
3570 if (!IS_SELECTABLE(s)) {
3571 select_error();
3572 goto finally;
3573 }
3574
Victor Stinner31bf2d52015-04-01 21:57:09 +02003575 msg.msg_name = SAS2SA(&addrbuf);
3576 msg.msg_namelen = addrbuflen;
3577 msg.msg_iov = iov;
3578 msg.msg_iovlen = iovlen;
3579 msg.msg_control = controlbuf;
3580 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003581
Victor Stinner31bf2d52015-04-01 21:57:09 +02003582 ctx.msg = &msg;
3583 ctx.flags = flags;
3584 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003585 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003586
3587 /* Make list of (level, type, data) tuples from control messages. */
3588 if ((cmsg_list = PyList_New(0)) == NULL)
3589 goto err_closefds;
3590 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3591 implementations didn't do so. */
3592 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3593 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3594 PyObject *bytes, *tuple;
3595 int tmp;
3596
3597 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3598 if (cmsg_status != 0) {
3599 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3600 "received malformed or improperly-truncated "
3601 "ancillary data", 1) == -1)
3602 goto err_closefds;
3603 }
3604 if (cmsg_status < 0)
3605 break;
3606 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003607 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003608 goto err_closefds;
3609 }
3610
3611 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3612 cmsgdatalen);
3613 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3614 (int)cmsgh->cmsg_type, bytes);
3615 if (tuple == NULL)
3616 goto err_closefds;
3617 tmp = PyList_Append(cmsg_list, tuple);
3618 Py_DECREF(tuple);
3619 if (tmp != 0)
3620 goto err_closefds;
3621
3622 if (cmsg_status != 0)
3623 break;
3624 }
3625
3626 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003627 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628 cmsg_list,
3629 (int)msg.msg_flags,
3630 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3631 ((msg.msg_namelen > addrbuflen) ?
3632 addrbuflen : msg.msg_namelen),
3633 s->sock_proto));
3634 if (retval == NULL)
3635 goto err_closefds;
3636
3637finally:
3638 Py_XDECREF(cmsg_list);
3639 PyMem_Free(controlbuf);
3640 return retval;
3641
3642err_closefds:
3643#ifdef SCM_RIGHTS
3644 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3645 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3646 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3647 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3648 if (cmsg_status < 0)
3649 break;
3650 if (cmsgh->cmsg_level == SOL_SOCKET &&
3651 cmsgh->cmsg_type == SCM_RIGHTS) {
3652 size_t numfds;
3653 int *fdp;
3654
3655 numfds = cmsgdatalen / sizeof(int);
3656 fdp = (int *)CMSG_DATA(cmsgh);
3657 while (numfds-- > 0)
3658 close(*fdp++);
3659 }
3660 if (cmsg_status != 0)
3661 break;
3662 }
3663#endif /* SCM_RIGHTS */
3664 goto finally;
3665}
3666
3667
3668static PyObject *
3669makeval_recvmsg(ssize_t received, void *data)
3670{
3671 PyObject **buf = data;
3672
3673 if (received < PyBytes_GET_SIZE(*buf))
3674 _PyBytes_Resize(buf, received);
3675 Py_XINCREF(*buf);
3676 return *buf;
3677}
3678
3679/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3680
3681static PyObject *
3682sock_recvmsg(PySocketSockObject *s, PyObject *args)
3683{
3684 Py_ssize_t bufsize, ancbufsize = 0;
3685 int flags = 0;
3686 struct iovec iov;
3687 PyObject *buf = NULL, *retval = NULL;
3688
3689 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3690 return NULL;
3691
3692 if (bufsize < 0) {
3693 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3694 return NULL;
3695 }
3696 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3697 return NULL;
3698 iov.iov_base = PyBytes_AS_STRING(buf);
3699 iov.iov_len = bufsize;
3700
3701 /* Note that we're passing a pointer to *our pointer* to the bytes
3702 object here (&buf); makeval_recvmsg() may incref the object, or
3703 deallocate it and set our pointer to NULL. */
3704 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3705 &makeval_recvmsg, &buf);
3706 Py_XDECREF(buf);
3707 return retval;
3708}
3709
3710PyDoc_STRVAR(recvmsg_doc,
3711"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3712\n\
3713Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3714socket. The ancbufsize argument sets the size in bytes of the\n\
3715internal buffer used to receive the ancillary data; it defaults to 0,\n\
3716meaning that no ancillary data will be received. Appropriate buffer\n\
3717sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3718CMSG_LEN(), and items which do not fit into the buffer might be\n\
3719truncated or discarded. The flags argument defaults to 0 and has the\n\
3720same meaning as for recv().\n\
3721\n\
3722The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3723The data item is a bytes object holding the non-ancillary data\n\
3724received. The ancdata item is a list of zero or more tuples\n\
3725(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3726(control messages) received: cmsg_level and cmsg_type are integers\n\
3727specifying the protocol level and protocol-specific type respectively,\n\
3728and cmsg_data is a bytes object holding the associated data. The\n\
3729msg_flags item is the bitwise OR of various flags indicating\n\
3730conditions on the received message; see your system documentation for\n\
3731details. If the receiving socket is unconnected, address is the\n\
3732address of the sending socket, if available; otherwise, its value is\n\
3733unspecified.\n\
3734\n\
3735If recvmsg() raises an exception after the system call returns, it\n\
3736will first attempt to close any file descriptors received via the\n\
3737SCM_RIGHTS mechanism.");
3738
3739
3740static PyObject *
3741makeval_recvmsg_into(ssize_t received, void *data)
3742{
3743 return PyLong_FromSsize_t(received);
3744}
3745
3746/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3747
3748static PyObject *
3749sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3750{
3751 Py_ssize_t ancbufsize = 0;
3752 int flags = 0;
3753 struct iovec *iovs = NULL;
3754 Py_ssize_t i, nitems, nbufs = 0;
3755 Py_buffer *bufs = NULL;
3756 PyObject *buffers_arg, *fast, *retval = NULL;
3757
3758 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3759 &buffers_arg, &ancbufsize, &flags))
3760 return NULL;
3761
3762 if ((fast = PySequence_Fast(buffers_arg,
3763 "recvmsg_into() argument 1 must be an "
3764 "iterable")) == NULL)
3765 return NULL;
3766 nitems = PySequence_Fast_GET_SIZE(fast);
3767 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003768 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003769 goto finally;
3770 }
3771
3772 /* Fill in an iovec for each item, and save the Py_buffer
3773 structs to release afterwards. */
3774 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3775 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3776 PyErr_NoMemory();
3777 goto finally;
3778 }
3779 for (; nbufs < nitems; nbufs++) {
3780 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3781 "w*;recvmsg_into() argument 1 must be an iterable "
3782 "of single-segment read-write buffers",
3783 &bufs[nbufs]))
3784 goto finally;
3785 iovs[nbufs].iov_base = bufs[nbufs].buf;
3786 iovs[nbufs].iov_len = bufs[nbufs].len;
3787 }
3788
3789 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3790 &makeval_recvmsg_into, NULL);
3791finally:
3792 for (i = 0; i < nbufs; i++)
3793 PyBuffer_Release(&bufs[i]);
3794 PyMem_Free(bufs);
3795 PyMem_Free(iovs);
3796 Py_DECREF(fast);
3797 return retval;
3798}
3799
3800PyDoc_STRVAR(recvmsg_into_doc,
3801"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3802\n\
3803Receive normal data and ancillary data from the socket, scattering the\n\
3804non-ancillary data into a series of buffers. The buffers argument\n\
3805must be an iterable of objects that export writable buffers\n\
3806(e.g. bytearray objects); these will be filled with successive chunks\n\
3807of the non-ancillary data until it has all been written or there are\n\
3808no more buffers. The ancbufsize argument sets the size in bytes of\n\
3809the internal buffer used to receive the ancillary data; it defaults to\n\
38100, meaning that no ancillary data will be received. Appropriate\n\
3811buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3812or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3813truncated or discarded. The flags argument defaults to 0 and has the\n\
3814same meaning as for recv().\n\
3815\n\
3816The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3817The nbytes item is the total number of bytes of non-ancillary data\n\
3818written into the buffers. The ancdata item is a list of zero or more\n\
3819tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3820data (control messages) received: cmsg_level and cmsg_type are\n\
3821integers specifying the protocol level and protocol-specific type\n\
3822respectively, and cmsg_data is a bytes object holding the associated\n\
3823data. The msg_flags item is the bitwise OR of various flags\n\
3824indicating conditions on the received message; see your system\n\
3825documentation for details. If the receiving socket is unconnected,\n\
3826address is the address of the sending socket, if available; otherwise,\n\
3827its value is unspecified.\n\
3828\n\
3829If recvmsg_into() raises an exception after the system call returns,\n\
3830it will first attempt to close any file descriptors received via the\n\
3831SCM_RIGHTS mechanism.");
3832#endif /* CMSG_LEN */
3833
3834
Victor Stinner31bf2d52015-04-01 21:57:09 +02003835struct sock_send {
3836 char *buf;
3837 Py_ssize_t len;
3838 int flags;
3839 Py_ssize_t result;
3840};
3841
3842static int
3843sock_send_impl(PySocketSockObject *s, void *data)
3844{
3845 struct sock_send *ctx = data;
3846
3847#ifdef MS_WINDOWS
3848 if (ctx->len > INT_MAX)
3849 ctx->len = INT_MAX;
3850 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3851#else
3852 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3853#endif
3854 return (ctx->result >= 0);
3855}
3856
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003857/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003858
Guido van Rossum73624e91994-10-10 17:59:00 +00003859static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003860sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003861{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003862 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003863 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003864 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3867 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 if (!IS_SELECTABLE(s)) {
3870 PyBuffer_Release(&pbuf);
3871 return select_error();
3872 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003873 ctx.buf = pbuf.buf;
3874 ctx.len = pbuf.len;
3875 ctx.flags = flags;
3876 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003877 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 return NULL;
3879 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003880 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003881
3882 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003883}
3884
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003885PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003886"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003887\n\
3888Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003889argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003890sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003891
3892
3893/* s.sendall(data [,flags]) method */
3894
3895static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003896sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003898 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003899 Py_ssize_t len, n;
3900 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003902 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003903 int has_timeout = (s->sock_timeout > 0);
3904 _PyTime_t interval = s->sock_timeout;
3905 _PyTime_t deadline = 0;
3906 int deadline_initialized = 0;
3907 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3910 return NULL;
3911 buf = pbuf.buf;
3912 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 if (!IS_SELECTABLE(s)) {
3915 PyBuffer_Release(&pbuf);
3916 return select_error();
3917 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003919 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003920 if (has_timeout) {
3921 if (deadline_initialized) {
3922 /* recompute the timeout */
3923 interval = deadline - _PyTime_GetMonotonicClock();
3924 }
3925 else {
3926 deadline_initialized = 1;
3927 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3928 }
3929
3930 if (interval <= 0) {
3931 PyErr_SetString(socket_timeout, "timed out");
3932 goto done;
3933 }
3934 }
3935
Victor Stinner02f32ab2015-04-01 22:53:26 +02003936 ctx.buf = buf;
3937 ctx.len = len;
3938 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003939 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3940 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003941 n = ctx.result;
3942 assert(n >= 0);
3943
3944 buf += n;
3945 len -= n;
3946
3947 /* We must run our signal handlers before looping again.
3948 send() can return a successful partial write when it is
3949 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003950 if (PyErr_CheckSignals())
3951 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003952 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003954
Victor Stinner8912d142015-04-06 23:16:34 +02003955 Py_INCREF(Py_None);
3956 res = Py_None;
3957
3958done:
3959 PyBuffer_Release(&pbuf);
3960 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003961}
3962
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003963PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003964"sendall(data[, flags])\n\
3965\n\
3966Send a data string to the socket. For the optional flags\n\
3967argument, see the Unix manual. This calls send() repeatedly\n\
3968until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003969to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003970
Guido van Rossum30a685f1991-06-27 15:51:29 +00003971
Victor Stinner31bf2d52015-04-01 21:57:09 +02003972struct sock_sendto {
3973 char *buf;
3974 Py_ssize_t len;
3975 int flags;
3976 int addrlen;
3977 sock_addr_t *addrbuf;
3978 Py_ssize_t result;
3979};
3980
3981static int
3982sock_sendto_impl(PySocketSockObject *s, void *data)
3983{
3984 struct sock_sendto *ctx = data;
3985
3986#ifdef MS_WINDOWS
3987 if (ctx->len > INT_MAX)
3988 ctx->len = INT_MAX;
3989 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3990 SAS2SA(ctx->addrbuf), ctx->addrlen);
3991#else
3992 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3993 SAS2SA(ctx->addrbuf), ctx->addrlen);
3994#endif
3995 return (ctx->result >= 0);
3996}
3997
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003998/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003999
Guido van Rossum73624e91994-10-10 17:59:00 +00004000static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004001sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 Py_buffer pbuf;
4004 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004005 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004007 int addrlen, flags;
4008 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004010 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004011 arglen = PyTuple_Size(args);
4012 switch (arglen) {
4013 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004014 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4015 return NULL;
4016 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004017 break;
4018 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004019 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4020 &pbuf, &flags, &addro)) {
4021 return NULL;
4022 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004023 break;
4024 default:
4025 PyErr_Format(PyExc_TypeError,
4026 "sendto() takes 2 or 3 arguments (%d given)",
4027 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004028 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 if (!IS_SELECTABLE(s)) {
4032 PyBuffer_Release(&pbuf);
4033 return select_error();
4034 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4037 PyBuffer_Release(&pbuf);
4038 return NULL;
4039 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004040
Victor Stinner31bf2d52015-04-01 21:57:09 +02004041 ctx.buf = pbuf.buf;
4042 ctx.len = pbuf.len;
4043 ctx.flags = flags;
4044 ctx.addrlen = addrlen;
4045 ctx.addrbuf = &addrbuf;
4046 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004047 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 return NULL;
4049 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004050 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004051
4052 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004053}
4054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004055PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004056"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004057\n\
4058Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004059For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004060
Guido van Rossum30a685f1991-06-27 15:51:29 +00004061
Victor Stinner35bee932015-04-02 12:28:07 +02004062/* The sendmsg() and recvmsg[_into]() methods require a working
4063 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4064#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004065struct sock_sendmsg {
4066 struct msghdr *msg;
4067 int flags;
4068 ssize_t result;
4069};
4070
4071static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004072sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4073 struct msghdr *msg,
4074 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4075 Py_ssize_t ndataparts, ndatabufs = 0;
4076 int result = -1;
4077 struct iovec *iovs = NULL;
4078 PyObject *data_fast = NULL;
4079 Py_buffer *databufs = NULL;
4080
4081 /* Fill in an iovec for each message part, and save the Py_buffer
4082 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004083 data_fast = PySequence_Fast(data_arg,
4084 "sendmsg() argument 1 must be an "
4085 "iterable");
4086 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004087 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004088 }
4089
Christian Heimesdffa3942016-09-05 23:54:41 +02004090 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4091 if (ndataparts > INT_MAX) {
4092 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4093 goto finally;
4094 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004095
Christian Heimesdffa3942016-09-05 23:54:41 +02004096 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004097 if (ndataparts > 0) {
4098 iovs = PyMem_New(struct iovec, ndataparts);
4099 if (iovs == NULL) {
4100 PyErr_NoMemory();
4101 goto finally;
4102 }
4103 msg->msg_iov = iovs;
4104
4105 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004106 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004107 PyErr_NoMemory();
4108 goto finally;
4109 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004110 }
4111 for (; ndatabufs < ndataparts; ndatabufs++) {
4112 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4113 "y*;sendmsg() argument 1 must be an iterable of "
4114 "bytes-like objects",
4115 &databufs[ndatabufs]))
4116 goto finally;
4117 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4118 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4119 }
4120 result = 0;
4121 finally:
4122 *databufsout = databufs;
4123 *ndatabufsout = ndatabufs;
4124 Py_XDECREF(data_fast);
4125 return result;
4126}
4127
4128static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004129sock_sendmsg_impl(PySocketSockObject *s, void *data)
4130{
4131 struct sock_sendmsg *ctx = data;
4132
4133 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4134 return (ctx->result >= 0);
4135}
4136
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004137/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4138
4139static PyObject *
4140sock_sendmsg(PySocketSockObject *s, PyObject *args)
4141{
Christian Heimesdffa3942016-09-05 23:54:41 +02004142 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004143 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004144 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004145 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004146 struct cmsginfo {
4147 int level;
4148 int type;
4149 Py_buffer data;
4150 } *cmsgs = NULL;
4151 void *controlbuf = NULL;
4152 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004153 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004154 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004155 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004156 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004157
4158 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004159 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004160 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004161 }
4162
4163 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004164
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004165 /* Parse destination address. */
4166 if (addr_arg != NULL && addr_arg != Py_None) {
4167 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4168 goto finally;
4169 msg.msg_name = &addrbuf;
4170 msg.msg_namelen = addrlen;
4171 }
4172
4173 /* Fill in an iovec for each message part, and save the Py_buffer
4174 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004175 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004176 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004177 }
4178
4179 if (cmsg_arg == NULL)
4180 ncmsgs = 0;
4181 else {
4182 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4183 "sendmsg() argument 2 must be an "
4184 "iterable")) == NULL)
4185 goto finally;
4186 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4187 }
4188
4189#ifndef CMSG_SPACE
4190 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004191 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004192 "sending multiple control messages is not supported "
4193 "on this system");
4194 goto finally;
4195 }
4196#endif
4197 /* Save level, type and Py_buffer for each control message,
4198 and calculate total size. */
4199 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4200 PyErr_NoMemory();
4201 goto finally;
4202 }
4203 controllen = controllen_last = 0;
4204 while (ncmsgbufs < ncmsgs) {
4205 size_t bufsize, space;
4206
4207 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4208 "(iiy*):[sendmsg() ancillary data items]",
4209 &cmsgs[ncmsgbufs].level,
4210 &cmsgs[ncmsgbufs].type,
4211 &cmsgs[ncmsgbufs].data))
4212 goto finally;
4213 bufsize = cmsgs[ncmsgbufs++].data.len;
4214
4215#ifdef CMSG_SPACE
4216 if (!get_CMSG_SPACE(bufsize, &space)) {
4217#else
4218 if (!get_CMSG_LEN(bufsize, &space)) {
4219#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004220 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221 goto finally;
4222 }
4223 controllen += space;
4224 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004225 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004226 goto finally;
4227 }
4228 controllen_last = controllen;
4229 }
4230
4231 /* Construct ancillary data block from control message info. */
4232 if (ncmsgbufs > 0) {
4233 struct cmsghdr *cmsgh = NULL;
4234
Victor Stinner52d61e42016-09-12 11:41:58 +02004235 controlbuf = PyMem_Malloc(controllen);
4236 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004237 PyErr_NoMemory();
4238 goto finally;
4239 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004240 msg.msg_control = controlbuf;
4241
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004242 msg.msg_controllen = controllen;
4243
4244 /* Need to zero out the buffer as a workaround for glibc's
4245 CMSG_NXTHDR() implementation. After getting the pointer to
4246 the next header, it checks its (uninitialized) cmsg_len
4247 member to see if the "message" fits in the buffer, and
4248 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004249 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004250 memset(controlbuf, 0, controllen);
4251
4252 for (i = 0; i < ncmsgbufs; i++) {
4253 size_t msg_len, data_len = cmsgs[i].data.len;
4254 int enough_space = 0;
4255
4256 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4257 if (cmsgh == NULL) {
4258 PyErr_Format(PyExc_RuntimeError,
4259 "unexpected NULL result from %s()",
4260 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4261 goto finally;
4262 }
4263 if (!get_CMSG_LEN(data_len, &msg_len)) {
4264 PyErr_SetString(PyExc_RuntimeError,
4265 "item size out of range for CMSG_LEN()");
4266 goto finally;
4267 }
4268 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4269 size_t space;
4270
4271 cmsgh->cmsg_len = msg_len;
4272 if (get_cmsg_data_space(&msg, cmsgh, &space))
4273 enough_space = (space >= data_len);
4274 }
4275 if (!enough_space) {
4276 PyErr_SetString(PyExc_RuntimeError,
4277 "ancillary data does not fit in calculated "
4278 "space");
4279 goto finally;
4280 }
4281 cmsgh->cmsg_level = cmsgs[i].level;
4282 cmsgh->cmsg_type = cmsgs[i].type;
4283 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4284 }
4285 }
4286
4287 /* Make the system call. */
4288 if (!IS_SELECTABLE(s)) {
4289 select_error();
4290 goto finally;
4291 }
4292
Victor Stinner31bf2d52015-04-01 21:57:09 +02004293 ctx.msg = &msg;
4294 ctx.flags = flags;
4295 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004296 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004297
4298 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004299
4300finally:
4301 PyMem_Free(controlbuf);
4302 for (i = 0; i < ncmsgbufs; i++)
4303 PyBuffer_Release(&cmsgs[i].data);
4304 PyMem_Free(cmsgs);
4305 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004306 PyMem_Free(msg.msg_iov);
4307 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004308 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004309 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004310 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004311 return retval;
4312}
4313
4314PyDoc_STRVAR(sendmsg_doc,
4315"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4316\n\
4317Send normal and ancillary data to the socket, gathering the\n\
4318non-ancillary data from a series of buffers and concatenating it into\n\
4319a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004320data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321The ancdata argument specifies the ancillary data (control messages)\n\
4322as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4323cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4324protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004325is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004326argument defaults to 0 and has the same meaning as for send(). If\n\
4327address is supplied and not None, it sets a destination address for\n\
4328the message. The return value is the number of bytes of non-ancillary\n\
4329data sent.");
4330#endif /* CMSG_LEN */
4331
Christian Heimesdffa3942016-09-05 23:54:41 +02004332#ifdef HAVE_SOCKADDR_ALG
4333static PyObject*
4334sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4335{
4336 PyObject *retval = NULL;
4337
4338 Py_ssize_t i, ndatabufs = 0;
4339 Py_buffer *databufs = NULL;
4340 PyObject *data_arg = NULL;
4341
4342 Py_buffer iv = {NULL, NULL};
4343
4344 PyObject *opobj = NULL;
4345 int op = -1;
4346
4347 PyObject *assoclenobj = NULL;
4348 int assoclen = -1;
4349
4350 unsigned int *uiptr;
4351 int flags = 0;
4352
4353 struct msghdr msg;
4354 struct cmsghdr *header = NULL;
4355 struct af_alg_iv *alg_iv = NULL;
4356 struct sock_sendmsg ctx;
4357 Py_ssize_t controllen;
4358 void *controlbuf = NULL;
4359 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4360
4361 if (self->sock_family != AF_ALG) {
4362 PyErr_SetString(PyExc_OSError,
4363 "algset is only supported for AF_ALG");
4364 return NULL;
4365 }
4366
4367 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4368 "|O$O!y*O!i:sendmsg_afalg", keywords,
4369 &data_arg,
4370 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004371 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004372 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004373 }
4374
4375 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004376
4377 /* op is a required, keyword-only argument >= 0 */
4378 if (opobj != NULL) {
4379 op = _PyLong_AsInt(opobj);
4380 }
4381 if (op < 0) {
4382 /* override exception from _PyLong_AsInt() */
4383 PyErr_SetString(PyExc_TypeError,
4384 "Invalid or missing argument 'op'");
4385 goto finally;
4386 }
4387 /* assoclen is optional but must be >= 0 */
4388 if (assoclenobj != NULL) {
4389 assoclen = _PyLong_AsInt(assoclenobj);
4390 if (assoclen == -1 && PyErr_Occurred()) {
4391 goto finally;
4392 }
4393 if (assoclen < 0) {
4394 PyErr_SetString(PyExc_TypeError,
4395 "assoclen must be positive");
4396 goto finally;
4397 }
4398 }
4399
4400 controllen = CMSG_SPACE(4);
4401 if (iv.buf != NULL) {
4402 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4403 }
4404 if (assoclen >= 0) {
4405 controllen += CMSG_SPACE(4);
4406 }
4407
4408 controlbuf = PyMem_Malloc(controllen);
4409 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004410 PyErr_NoMemory();
4411 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004412 }
4413 memset(controlbuf, 0, controllen);
4414
Christian Heimesdffa3942016-09-05 23:54:41 +02004415 msg.msg_controllen = controllen;
4416 msg.msg_control = controlbuf;
4417
4418 /* Fill in an iovec for each message part, and save the Py_buffer
4419 structs to release afterwards. */
4420 if (data_arg != NULL) {
4421 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4422 goto finally;
4423 }
4424 }
4425
4426 /* set operation to encrypt or decrypt */
4427 header = CMSG_FIRSTHDR(&msg);
4428 if (header == NULL) {
4429 PyErr_SetString(PyExc_RuntimeError,
4430 "unexpected NULL result from CMSG_FIRSTHDR");
4431 goto finally;
4432 }
4433 header->cmsg_level = SOL_ALG;
4434 header->cmsg_type = ALG_SET_OP;
4435 header->cmsg_len = CMSG_LEN(4);
4436 uiptr = (void*)CMSG_DATA(header);
4437 *uiptr = (unsigned int)op;
4438
4439 /* set initialization vector */
4440 if (iv.buf != NULL) {
4441 header = CMSG_NXTHDR(&msg, header);
4442 if (header == NULL) {
4443 PyErr_SetString(PyExc_RuntimeError,
4444 "unexpected NULL result from CMSG_NXTHDR(iv)");
4445 goto finally;
4446 }
4447 header->cmsg_level = SOL_ALG;
4448 header->cmsg_type = ALG_SET_IV;
4449 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4450 alg_iv = (void*)CMSG_DATA(header);
4451 alg_iv->ivlen = iv.len;
4452 memcpy(alg_iv->iv, iv.buf, iv.len);
4453 }
4454
4455 /* set length of associated data for AEAD */
4456 if (assoclen >= 0) {
4457 header = CMSG_NXTHDR(&msg, header);
4458 if (header == NULL) {
4459 PyErr_SetString(PyExc_RuntimeError,
4460 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4461 goto finally;
4462 }
4463 header->cmsg_level = SOL_ALG;
4464 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4465 header->cmsg_len = CMSG_LEN(4);
4466 uiptr = (void*)CMSG_DATA(header);
4467 *uiptr = (unsigned int)assoclen;
4468 }
4469
4470 ctx.msg = &msg;
4471 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004472 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004473 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004474 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004475
4476 retval = PyLong_FromSsize_t(ctx.result);
4477
4478 finally:
4479 PyMem_Free(controlbuf);
4480 if (iv.buf != NULL) {
4481 PyBuffer_Release(&iv);
4482 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004483 PyMem_Free(msg.msg_iov);
4484 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004485 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004486 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004487 PyMem_Free(databufs);
4488 return retval;
4489}
4490
4491PyDoc_STRVAR(sendmsg_afalg_doc,
4492"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4493\n\
4494Set operation mode, IV and length of associated data for an AF_ALG\n\
4495operation socket.");
4496#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004497
Guido van Rossum30a685f1991-06-27 15:51:29 +00004498/* s.shutdown(how) method */
4499
Guido van Rossum73624e91994-10-10 17:59:00 +00004500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004501sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 int how;
4504 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004505
Serhiy Storchaka78980432013-01-15 01:12:17 +02004506 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 if (how == -1 && PyErr_Occurred())
4508 return NULL;
4509 Py_BEGIN_ALLOW_THREADS
4510 res = shutdown(s->sock_fd, how);
4511 Py_END_ALLOW_THREADS
4512 if (res < 0)
4513 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004514 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004515}
4516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004517PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004518"shutdown(flag)\n\
4519\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004520Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4521of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004522
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004523#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004524static PyObject*
4525sock_ioctl(PySocketSockObject *s, PyObject *arg)
4526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 unsigned long cmd = SIO_RCVALL;
4528 PyObject *argO;
4529 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4532 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 switch (cmd) {
4535 case SIO_RCVALL: {
4536 unsigned int option = RCVALL_ON;
4537 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4538 return NULL;
4539 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4540 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4541 return set_error();
4542 }
4543 return PyLong_FromUnsignedLong(recv); }
4544 case SIO_KEEPALIVE_VALS: {
4545 struct tcp_keepalive ka;
4546 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4547 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4548 return NULL;
4549 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4550 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4551 return set_error();
4552 }
4553 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004554#if defined(SIO_LOOPBACK_FAST_PATH)
4555 case SIO_LOOPBACK_FAST_PATH: {
4556 unsigned int option;
4557 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4558 return NULL;
4559 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4560 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4561 return set_error();
4562 }
4563 return PyLong_FromUnsignedLong(recv); }
4564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 default:
4566 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4567 return NULL;
4568 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004569}
4570PyDoc_STRVAR(sock_ioctl_doc,
4571"ioctl(cmd, option) -> long\n\
4572\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004573Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4574SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004575SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4576SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004577#endif
4578
4579#if defined(MS_WINDOWS)
4580static PyObject*
4581sock_share(PySocketSockObject *s, PyObject *arg)
4582{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004583 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004584 DWORD processId;
4585 int result;
4586
4587 if (!PyArg_ParseTuple(arg, "I", &processId))
4588 return NULL;
4589
4590 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004591 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004592 Py_END_ALLOW_THREADS
4593 if (result == SOCKET_ERROR)
4594 return set_error();
4595 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4596}
4597PyDoc_STRVAR(sock_share_doc,
4598"share(process_id) -> bytes\n\
4599\n\
4600Share the socket with another process. The target process id\n\
4601must be provided and the resulting bytes object passed to the target\n\
4602process. There the shared socket can be instantiated by calling\n\
4603socket.fromshare().");
4604
Christian Heimesfaf2f632008-01-06 16:59:19 +00004605
4606#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004607
4608/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004609
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004610static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4612 accept_doc},
4613 {"bind", (PyCFunction)sock_bind, METH_O,
4614 bind_doc},
4615 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004616 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 {"connect", (PyCFunction)sock_connect, METH_O,
4618 connect_doc},
4619 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4620 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004621 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4622 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4624 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004625#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 {"getpeername", (PyCFunction)sock_getpeername,
4627 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 {"getsockname", (PyCFunction)sock_getsockname,
4630 METH_NOARGS, getsockname_doc},
4631 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4632 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004633#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4635 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004636#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004637#if defined(MS_WINDOWS)
4638 {"share", (PyCFunction)sock_share, METH_VARARGS,
4639 sock_share_doc},
4640#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004641 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 listen_doc},
4643 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4644 recv_doc},
4645 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4646 recv_into_doc},
4647 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4648 recvfrom_doc},
4649 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4650 recvfrom_into_doc},
4651 {"send", (PyCFunction)sock_send, METH_VARARGS,
4652 send_doc},
4653 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4654 sendall_doc},
4655 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4656 sendto_doc},
4657 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4658 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004659 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4660 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4662 settimeout_doc},
4663 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4664 gettimeout_doc},
4665 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4666 setsockopt_doc},
4667 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4668 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004669#ifdef CMSG_LEN
4670 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4671 recvmsg_doc},
4672 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4673 recvmsg_into_doc,},
4674 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4675 sendmsg_doc},
4676#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004677#ifdef HAVE_SOCKADDR_ALG
4678 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4679 sendmsg_afalg_doc},
4680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004682};
4683
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004684/* SockObject members */
4685static PyMemberDef sock_memberlist[] = {
4686 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4687 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4688 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004689 {0},
4690};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004691
Victor Stinner71694d52015-03-28 01:18:54 +01004692static PyGetSetDef sock_getsetlist[] = {
4693 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4694 {NULL} /* sentinel */
4695};
4696
Guido van Rossum73624e91994-10-10 17:59:00 +00004697/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004698 First close the file description. */
4699
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004700static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004701sock_finalize(PySocketSockObject *s)
4702{
4703 SOCKET_T fd;
4704 PyObject *error_type, *error_value, *error_traceback;
4705
4706 /* Save the current exception, if any. */
4707 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4708
Victor Stinnerd3afb622016-07-22 17:47:09 +02004709 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004710 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4711 /* Spurious errors can appear at shutdown */
4712 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4713 PyErr_WriteUnraisable((PyObject *)s);
4714 }
4715 }
4716
4717 /* Only close the socket *after* logging the ResourceWarning warning
4718 to allow the logger to call socket methods like
4719 socket.getsockname(). If the socket is closed before, socket
4720 methods fails with the EBADF error. */
4721 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004722 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004723
4724 /* We do not want to retry upon EINTR: see sock_close() */
4725 Py_BEGIN_ALLOW_THREADS
4726 (void) SOCKETCLOSE(fd);
4727 Py_END_ALLOW_THREADS
4728 }
4729
4730 /* Restore the saved exception. */
4731 PyErr_Restore(error_type, error_value, error_traceback);
4732}
4733
4734static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004735sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004736{
Victor Stinner19a8e842016-03-21 16:36:48 +01004737 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4738 return;
4739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004741}
4742
Guido van Rossum30a685f1991-06-27 15:51:29 +00004743
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004744static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004745sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004746{
Victor Stinnere254e532014-07-26 14:36:55 +02004747 long sock_fd;
4748 /* On Windows, this test is needed because SOCKET_T is unsigned */
4749 if (s->sock_fd == INVALID_SOCKET) {
4750 sock_fd = -1;
4751 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004752#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004753 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 /* this can occur on Win64, and actually there is a special
4755 ugly printf formatter for decimal pointer length integer
4756 printing, only bother if necessary*/
4757 PyErr_SetString(PyExc_OverflowError,
4758 "no printf formatter to display "
4759 "the socket descriptor in decimal");
4760 return NULL;
4761 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004762#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004763 else
4764 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 return PyUnicode_FromFormat(
4766 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004767 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 s->sock_type,
4769 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004770}
4771
4772
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004773/* Create a new, uninitialized socket object. */
4774
4775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004776sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 new = type->tp_alloc(type, 0);
4781 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004782 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004783 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 ((PySocketSockObject *)new)->errorhandler = &set_error;
4785 }
4786 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004787}
4788
4789
4790/* Initialize a new socket object. */
4791
Victor Stinnerdaf45552013-08-28 00:53:59 +02004792#ifdef SOCK_CLOEXEC
4793/* socket() and socketpair() fail with EINVAL on Linux kernel older
4794 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4795static int sock_cloexec_works = -1;
4796#endif
4797
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004798/*ARGSUSED*/
4799static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004800sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 PySocketSockObject *s = (PySocketSockObject *)self;
4803 PyObject *fdobj = NULL;
4804 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004805 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004807#ifndef MS_WINDOWS
4808#ifdef SOCK_CLOEXEC
4809 int *atomic_flag_works = &sock_cloexec_works;
4810#else
4811 int *atomic_flag_works = NULL;
4812#endif
4813#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4816 "|iiiO:socket", keywords,
4817 &family, &type, &proto, &fdobj))
4818 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004821#ifdef MS_WINDOWS
4822 /* recreate a socket that was duplicated */
4823 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004824 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004825 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4826 PyErr_Format(PyExc_ValueError,
4827 "socket descriptor string has wrong size, "
4828 "should be %zu bytes.", sizeof(info));
4829 return -1;
4830 }
4831 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4832 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004833 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004834 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4835 Py_END_ALLOW_THREADS
4836 if (fd == INVALID_SOCKET) {
4837 set_error();
4838 return -1;
4839 }
4840 family = info.iAddressFamily;
4841 type = info.iSocketType;
4842 proto = info.iProtocol;
4843 }
4844 else
4845#endif
4846 {
4847 fd = PyLong_AsSocket_t(fdobj);
4848 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4849 return -1;
4850 if (fd == INVALID_SOCKET) {
4851 PyErr_SetString(PyExc_ValueError,
4852 "can't use invalid socket value");
4853 return -1;
4854 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004855
4856 if (family == -1) {
4857 sock_addr_t addrbuf;
4858 socklen_t addrlen = sizeof(sock_addr_t);
4859
4860 memset(&addrbuf, 0, addrlen);
4861 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4862 family = SAS2SA(&addrbuf)->sa_family;
4863 } else {
4864#ifdef MS_WINDOWS
4865 PyErr_SetFromWindowsErrWithFilename(0, "family");
4866#else
4867 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4868#endif
4869 return -1;
4870 }
4871 }
4872#ifdef SO_TYPE
4873 if (type == -1) {
4874 int tmp;
4875 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004876 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4877 (void *)&tmp, &slen) == 0)
4878 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004879 type = tmp;
4880 } else {
4881#ifdef MS_WINDOWS
4882 PyErr_SetFromWindowsErrWithFilename(0, "type");
4883#else
4884 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4885#endif
4886 return -1;
4887 }
4888 }
4889#else
4890 type = SOCK_STREAM;
4891#endif
4892#ifdef SO_PROTOCOL
4893 if (proto == -1) {
4894 int tmp;
4895 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004896 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4897 (void *)&tmp, &slen) == 0)
4898 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004899 proto = tmp;
4900 } else {
4901#ifdef MS_WINDOWS
4902 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4903#else
4904 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4905#endif
4906 return -1;
4907 }
4908 }
4909#else
4910 proto = 0;
4911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 }
4913 }
4914 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004915 /* No fd, default to AF_INET and SOCK_STREAM */
4916 if (family == -1) {
4917 family = AF_INET;
4918 }
4919 if (type == -1) {
4920 type = SOCK_STREAM;
4921 }
4922 if (proto == -1) {
4923 proto = 0;
4924 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004925#ifdef MS_WINDOWS
4926 /* Windows implementation */
4927#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4928#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4929#endif
4930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004932 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004933 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004934 NULL, 0,
4935 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4936 if (fd == INVALID_SOCKET) {
4937 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4938 support_wsa_no_inherit = 0;
4939 fd = socket(family, type, proto);
4940 }
4941 }
4942 else {
4943 fd = socket(family, type, proto);
4944 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 if (fd == INVALID_SOCKET) {
4948 set_error();
4949 return -1;
4950 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004951
4952 if (!support_wsa_no_inherit) {
4953 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4954 closesocket(fd);
4955 PyErr_SetFromWindowsErr(0);
4956 return -1;
4957 }
4958 }
4959#else
4960 /* UNIX */
4961 Py_BEGIN_ALLOW_THREADS
4962#ifdef SOCK_CLOEXEC
4963 if (sock_cloexec_works != 0) {
4964 fd = socket(family, type | SOCK_CLOEXEC, proto);
4965 if (sock_cloexec_works == -1) {
4966 if (fd >= 0) {
4967 sock_cloexec_works = 1;
4968 }
4969 else if (errno == EINVAL) {
4970 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4971 sock_cloexec_works = 0;
4972 fd = socket(family, type, proto);
4973 }
4974 }
4975 }
4976 else
4977#endif
4978 {
4979 fd = socket(family, type, proto);
4980 }
4981 Py_END_ALLOW_THREADS
4982
4983 if (fd == INVALID_SOCKET) {
4984 set_error();
4985 return -1;
4986 }
4987
4988 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4989 SOCKETCLOSE(fd);
4990 return -1;
4991 }
4992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004994 if (init_sockobject(s, fd, family, type, proto) == -1) {
4995 SOCKETCLOSE(fd);
4996 return -1;
4997 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005000
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005001}
5002
5003
Guido van Rossumb6775db1994-08-01 11:34:53 +00005004/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005005
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005006static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5008 "_socket.socket", /* tp_name */
5009 sizeof(PySocketSockObject), /* tp_basicsize */
5010 0, /* tp_itemsize */
5011 (destructor)sock_dealloc, /* tp_dealloc */
5012 0, /* tp_print */
5013 0, /* tp_getattr */
5014 0, /* tp_setattr */
5015 0, /* tp_reserved */
5016 (reprfunc)sock_repr, /* tp_repr */
5017 0, /* tp_as_number */
5018 0, /* tp_as_sequence */
5019 0, /* tp_as_mapping */
5020 0, /* tp_hash */
5021 0, /* tp_call */
5022 0, /* tp_str */
5023 PyObject_GenericGetAttr, /* tp_getattro */
5024 0, /* tp_setattro */
5025 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005026 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5027 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 sock_doc, /* tp_doc */
5029 0, /* tp_traverse */
5030 0, /* tp_clear */
5031 0, /* tp_richcompare */
5032 0, /* tp_weaklistoffset */
5033 0, /* tp_iter */
5034 0, /* tp_iternext */
5035 sock_methods, /* tp_methods */
5036 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005037 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 0, /* tp_base */
5039 0, /* tp_dict */
5040 0, /* tp_descr_get */
5041 0, /* tp_descr_set */
5042 0, /* tp_dictoffset */
5043 sock_initobj, /* tp_init */
5044 PyType_GenericAlloc, /* tp_alloc */
5045 sock_new, /* tp_new */
5046 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005047 0, /* tp_is_gc */
5048 0, /* tp_bases */
5049 0, /* tp_mro */
5050 0, /* tp_cache */
5051 0, /* tp_subclasses */
5052 0, /* tp_weaklist */
5053 0, /* tp_del */
5054 0, /* tp_version_tag */
5055 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005056};
5057
Guido van Rossum30a685f1991-06-27 15:51:29 +00005058
Guido van Rossum81194471991-07-27 21:42:02 +00005059/* Python interface to gethostname(). */
5060
5061/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005062static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005063socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005064{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005065#ifdef MS_WINDOWS
5066 /* Don't use winsock's gethostname, as this returns the ANSI
5067 version of the hostname, whereas we need a Unicode string.
5068 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005069 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005070 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005071 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005072 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005073
5074 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005075 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005076
5077 if (GetLastError() != ERROR_MORE_DATA)
5078 return PyErr_SetFromWindowsErr(0);
5079
5080 if (size == 0)
5081 return PyUnicode_New(0, 0);
5082
5083 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5084 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005085 name = PyMem_New(wchar_t, size);
5086 if (!name) {
5087 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005088 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005089 }
Victor Stinner74168972011-11-17 01:11:36 +01005090 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5091 name,
5092 &size))
5093 {
5094 PyMem_Free(name);
5095 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005096 }
Victor Stinner74168972011-11-17 01:11:36 +01005097
5098 result = PyUnicode_FromWideChar(name, size);
5099 PyMem_Free(name);
5100 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 char buf[1024];
5103 int res;
5104 Py_BEGIN_ALLOW_THREADS
5105 res = gethostname(buf, (int) sizeof buf - 1);
5106 Py_END_ALLOW_THREADS
5107 if (res < 0)
5108 return set_error();
5109 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005110 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005111#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005112}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005113
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005114PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005115"gethostname() -> string\n\
5116\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005117Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005118
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005119#ifdef HAVE_SETHOSTNAME
5120PyDoc_STRVAR(sethostname_doc,
5121"sethostname(name)\n\n\
5122Sets the hostname to name.");
5123
5124static PyObject *
5125socket_sethostname(PyObject *self, PyObject *args)
5126{
5127 PyObject *hnobj;
5128 Py_buffer buf;
5129 int res, flag = 0;
5130
Christian Heimesd2774c72013-06-19 02:06:29 +02005131#ifdef _AIX
5132/* issue #18259, not declared in any useful header file */
5133extern int sethostname(const char *, size_t);
5134#endif
5135
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005136 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5137 PyErr_Clear();
5138 if (!PyArg_ParseTuple(args, "O&:sethostname",
5139 PyUnicode_FSConverter, &hnobj))
5140 return NULL;
5141 flag = 1;
5142 }
5143 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5144 if (!res) {
5145 res = sethostname(buf.buf, buf.len);
5146 PyBuffer_Release(&buf);
5147 }
5148 if (flag)
5149 Py_DECREF(hnobj);
5150 if (res)
5151 return set_error();
5152 Py_RETURN_NONE;
5153}
5154#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005155
Guido van Rossum30a685f1991-06-27 15:51:29 +00005156/* Python interface to gethostbyname(name). */
5157
5158/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005159static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005160socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 char *name;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005163 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005164 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005165
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005166 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 return NULL;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005168 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005169 goto finally;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005170 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005171finally:
5172 PyMem_Free(name);
5173 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005174}
5175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005176PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005177"gethostbyname(host) -> address\n\
5178\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005179Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005180
5181
Victor Stinner72400302016-01-28 15:41:01 +01005182static PyObject*
5183sock_decode_hostname(const char *name)
5184{
5185#ifdef MS_WINDOWS
5186 /* Issue #26227: gethostbyaddr() returns a string encoded
5187 * to the ANSI code page */
5188 return PyUnicode_DecodeFSDefault(name);
5189#else
5190 /* Decode from UTF-8 */
5191 return PyUnicode_FromString(name);
5192#endif
5193}
5194
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005195/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5196
5197static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005198gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 char **pch;
5201 PyObject *rtn_tuple = (PyObject *)NULL;
5202 PyObject *name_list = (PyObject *)NULL;
5203 PyObject *addr_list = (PyObject *)NULL;
5204 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005205 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 if (h == NULL) {
5208 /* Let's get real error message to return */
5209 set_herror(h_errno);
5210 return NULL;
5211 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 if (h->h_addrtype != af) {
5214 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005215 errno = EAFNOSUPPORT;
5216 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 return NULL;
5218 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 case AF_INET:
5223 if (alen < sizeof(struct sockaddr_in))
5224 return NULL;
5225 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005226
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005227#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 case AF_INET6:
5229 if (alen < sizeof(struct sockaddr_in6))
5230 return NULL;
5231 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005232#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 if ((name_list = PyList_New(0)) == NULL)
5237 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 if ((addr_list = PyList_New(0)) == NULL)
5240 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 /* SF #1511317: h_aliases can be NULL */
5243 if (h->h_aliases) {
5244 for (pch = h->h_aliases; *pch != NULL; pch++) {
5245 int status;
5246 tmp = PyUnicode_FromString(*pch);
5247 if (tmp == NULL)
5248 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 status = PyList_Append(name_list, tmp);
5251 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 if (status)
5254 goto err;
5255 }
5256 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5259 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 case AF_INET:
5264 {
5265 struct sockaddr_in sin;
5266 memset(&sin, 0, sizeof(sin));
5267 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005268#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005272 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 if (pch == h->h_addr_list && alen >= sizeof(sin))
5275 memcpy((char *) addr, &sin, sizeof(sin));
5276 break;
5277 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005278
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005279#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 case AF_INET6:
5281 {
5282 struct sockaddr_in6 sin6;
5283 memset(&sin6, 0, sizeof(sin6));
5284 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005285#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005289 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5292 memcpy((char *) addr, &sin6, sizeof(sin6));
5293 break;
5294 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005295#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005298 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 "unsupported address family");
5300 return NULL;
5301 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 if (tmp == NULL)
5304 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 status = PyList_Append(addr_list, tmp);
5307 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 if (status)
5310 goto err;
5311 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005312
Victor Stinner72400302016-01-28 15:41:01 +01005313 name = sock_decode_hostname(h->h_name);
5314 if (name == NULL)
5315 goto err;
5316 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005317
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005318 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 Py_XDECREF(name_list);
5320 Py_XDECREF(addr_list);
5321 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005322}
5323
5324
5325/* Python interface to gethostbyname_ex(name). */
5326
5327/*ARGSUSED*/
5328static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005329socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 char *name;
5332 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005333 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005335 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005336#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005338#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005340#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 char buf[16384];
5342 int buf_len = (sizeof buf) - 1;
5343 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005344#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005345#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005347#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005348#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005350 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005352 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005353 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005355#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005356#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005357 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005359#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005361#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 memset((void *) &data, '\0', sizeof(data));
5363 result = gethostbyname_r(name, &hp_allocated, &data);
5364 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005365#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005366#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005367#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005369#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005370 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005372#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 Py_END_ALLOW_THREADS
5374 /* Some C libraries would require addr.__ss_family instead of
5375 addr.ss_family.
5376 Therefore, we cast the sockaddr_storage into sockaddr to
5377 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005378 sa = SAS2SA(&addr);
5379 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005381#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005383#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005384finally:
5385 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005387}
5388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005389PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005390"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5391\n\
5392Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005393for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005394
5395
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005396/* Python interface to gethostbyaddr(IP). */
5397
5398/*ARGSUSED*/
5399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005400socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005401{
Charles-François Natali8b759652011-12-23 16:44:51 +01005402 sock_addr_t addr;
5403 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 char *ip_num;
5405 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005406 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005407#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005409#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005411#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 /* glibcs up to 2.10 assume that the buf argument to
5413 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5414 does not ensure. The attribute below instructs the compiler
5415 to maintain this alignment. */
5416 char buf[16384] Py_ALIGNED(8);
5417 int buf_len = (sizeof buf) - 1;
5418 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005419#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005420#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005422#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005423#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005424 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 int al;
5426 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005427
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005428 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 return NULL;
5430 af = AF_UNSPEC;
5431 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005432 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 af = sa->sa_family;
5434 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005435 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 switch (af) {
5437 case AF_INET:
5438 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5439 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5440 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005441#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 case AF_INET6:
5443 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5444 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5445 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005448 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005449 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 }
5451 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005452#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005453#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005454 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 &hp_allocated, buf, buf_len,
5456 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005457#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 h = gethostbyaddr_r(ap, al, af,
5459 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005460#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 memset((void *) &data, '\0', sizeof(data));
5462 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5463 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005464#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005465#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005466#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005468#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005469 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005471#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005473 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005474#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005476#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005477finally:
5478 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005480}
5481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005482PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005483"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5484\n\
5485Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005486for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005487
Guido van Rossum30a685f1991-06-27 15:51:29 +00005488
5489/* Python interface to getservbyname(name).
5490 This only returns the port number, since the other info is already
5491 known or not useful (like the list of aliases). */
5492
5493/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005495socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005496{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005497 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 struct servent *sp;
5499 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5500 return NULL;
5501 Py_BEGIN_ALLOW_THREADS
5502 sp = getservbyname(name, proto);
5503 Py_END_ALLOW_THREADS
5504 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005505 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 return NULL;
5507 }
5508 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005509}
5510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005511PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005512"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005513\n\
5514Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005515The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5516otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005517
Guido van Rossum30a685f1991-06-27 15:51:29 +00005518
Barry Warsaw11b91a02004-06-28 00:50:43 +00005519/* Python interface to getservbyport(port).
5520 This only returns the service name, since the other info is already
5521 known or not useful (like the list of aliases). */
5522
5523/*ARGSUSED*/
5524static PyObject *
5525socket_getservbyport(PyObject *self, PyObject *args)
5526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005528 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 struct servent *sp;
5530 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5531 return NULL;
5532 if (port < 0 || port > 0xffff) {
5533 PyErr_SetString(
5534 PyExc_OverflowError,
5535 "getservbyport: port must be 0-65535.");
5536 return NULL;
5537 }
5538 Py_BEGIN_ALLOW_THREADS
5539 sp = getservbyport(htons((short)port), proto);
5540 Py_END_ALLOW_THREADS
5541 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005542 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 return NULL;
5544 }
5545 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005546}
5547
5548PyDoc_STRVAR(getservbyport_doc,
5549"getservbyport(port[, protocolname]) -> string\n\
5550\n\
5551Return the service name from a port number and protocol name.\n\
5552The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5553otherwise any protocol will match.");
5554
Guido van Rossum3901d851996-12-19 16:35:04 +00005555/* Python interface to getprotobyname(name).
5556 This only returns the protocol number, since the other info is
5557 already known or not useful (like the list of aliases). */
5558
5559/*ARGSUSED*/
5560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005561socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005562{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005563 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 struct protoent *sp;
5565 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5566 return NULL;
5567 Py_BEGIN_ALLOW_THREADS
5568 sp = getprotobyname(name);
5569 Py_END_ALLOW_THREADS
5570 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005571 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 return NULL;
5573 }
5574 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005575}
5576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005577PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005578"getprotobyname(name) -> integer\n\
5579\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005580Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005581
Christian Heimesd0e31b92018-01-27 09:54:13 +01005582static PyObject *
5583socket_close(PyObject *self, PyObject *fdobj)
5584{
5585 SOCKET_T fd;
5586 int res;
5587
5588 fd = PyLong_AsSocket_t(fdobj);
5589 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5590 return NULL;
5591 Py_BEGIN_ALLOW_THREADS
5592 res = SOCKETCLOSE(fd);
5593 Py_END_ALLOW_THREADS
5594 /* bpo-30319: The peer can already have closed the connection.
5595 Python ignores ECONNRESET on close(). */
5596 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5597 return set_error();
5598 }
5599 Py_RETURN_NONE;
5600}
5601
5602PyDoc_STRVAR(close_doc,
5603"close(integer) -> None\n\
5604\n\
5605Close an integer socket file descriptor. This is like os.close(), but for\n\
5606sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005607
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005608#ifndef NO_DUP
5609/* dup() function for socket fds */
5610
5611static PyObject *
5612socket_dup(PyObject *self, PyObject *fdobj)
5613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 SOCKET_T fd, newfd;
5615 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005616#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005617 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005618#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 fd = PyLong_AsSocket_t(fdobj);
5621 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5622 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005623
Victor Stinnerdaf45552013-08-28 00:53:59 +02005624#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005625 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005626 return set_error();
5627
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005628 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005629 FROM_PROTOCOL_INFO,
5630 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 if (newfd == INVALID_SOCKET)
5632 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005633
Victor Stinnerdaf45552013-08-28 00:53:59 +02005634 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5635 closesocket(newfd);
5636 PyErr_SetFromWindowsErr(0);
5637 return NULL;
5638 }
5639#else
5640 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5641 newfd = _Py_dup(fd);
5642 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005643 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005644#endif
5645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 newfdobj = PyLong_FromSocket_t(newfd);
5647 if (newfdobj == NULL)
5648 SOCKETCLOSE(newfd);
5649 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005650}
5651
5652PyDoc_STRVAR(dup_doc,
5653"dup(integer) -> integer\n\
5654\n\
5655Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5656sockets; on some platforms os.dup() won't work for socket file descriptors.");
5657#endif
5658
5659
Dave Cole331708b2004-08-09 04:51:41 +00005660#ifdef HAVE_SOCKETPAIR
5661/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005662 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005663 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005664
5665/*ARGSUSED*/
5666static PyObject *
5667socket_socketpair(PyObject *self, PyObject *args)
5668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 PySocketSockObject *s0 = NULL, *s1 = NULL;
5670 SOCKET_T sv[2];
5671 int family, type = SOCK_STREAM, proto = 0;
5672 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005673#ifdef SOCK_CLOEXEC
5674 int *atomic_flag_works = &sock_cloexec_works;
5675#else
5676 int *atomic_flag_works = NULL;
5677#endif
5678 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005679
5680#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005682#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5686 &family, &type, &proto))
5687 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005690 Py_BEGIN_ALLOW_THREADS
5691#ifdef SOCK_CLOEXEC
5692 if (sock_cloexec_works != 0) {
5693 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5694 if (sock_cloexec_works == -1) {
5695 if (ret >= 0) {
5696 sock_cloexec_works = 1;
5697 }
5698 else if (errno == EINVAL) {
5699 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5700 sock_cloexec_works = 0;
5701 ret = socketpair(family, type, proto, sv);
5702 }
5703 }
5704 }
5705 else
5706#endif
5707 {
5708 ret = socketpair(family, type, proto, sv);
5709 }
5710 Py_END_ALLOW_THREADS
5711
5712 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005714
5715 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5716 goto finally;
5717 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5718 goto finally;
5719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 s0 = new_sockobject(sv[0], family, type, proto);
5721 if (s0 == NULL)
5722 goto finally;
5723 s1 = new_sockobject(sv[1], family, type, proto);
5724 if (s1 == NULL)
5725 goto finally;
5726 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005727
5728finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 if (res == NULL) {
5730 if (s0 == NULL)
5731 SOCKETCLOSE(sv[0]);
5732 if (s1 == NULL)
5733 SOCKETCLOSE(sv[1]);
5734 }
5735 Py_XDECREF(s0);
5736 Py_XDECREF(s1);
5737 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005738}
5739
5740PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005741"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005742\n\
5743Create a pair of socket objects from the sockets returned by the platform\n\
5744socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005745The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005746AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005747
5748#endif /* HAVE_SOCKETPAIR */
5749
5750
Guido van Rossum006bf911996-06-12 04:04:55 +00005751static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005752socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005753{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005754 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005755
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005756 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 return NULL;
5758 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005759 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005761 "ntohs: can't convert negative Python int to C "
5762 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 return NULL;
5764 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005765 if (x > 0xffff) {
5766 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5767 "ntohs: Python int too large to convert to C "
5768 "16-bit unsigned integer (The silent truncation "
5769 "is deprecated)",
5770 1)) {
5771 return NULL;
5772 }
5773 }
5774 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005775}
5776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005777PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005778"ntohs(integer) -> integer\n\
5779\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005780Convert a 16-bit unsigned integer from network to host byte order.\n\
5781Note that in case the received integer does not fit in 16-bit unsigned\n\
5782integer, but does fit in a positive C int, it is silently truncated to\n\
578316-bit unsigned integer.\n\
5784However, this silent truncation feature is deprecated, and will raise an \n\
5785exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005786
5787
Guido van Rossum006bf911996-06-12 04:04:55 +00005788static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005789socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 if (PyLong_Check(arg)) {
5794 x = PyLong_AsUnsignedLong(arg);
5795 if (x == (unsigned long) -1 && PyErr_Occurred())
5796 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005797#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 {
5799 unsigned long y;
5800 /* only want the trailing 32 bits */
5801 y = x & 0xFFFFFFFFUL;
5802 if (y ^ x)
5803 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005804 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 x = y;
5806 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 }
5809 else
5810 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005811 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005814}
5815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005816PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005817"ntohl(integer) -> integer\n\
5818\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005819Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005820
5821
Guido van Rossum006bf911996-06-12 04:04:55 +00005822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005823socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005824{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005825 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005826
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005827 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 return NULL;
5829 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005830 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005832 "htons: can't convert negative Python int to C "
5833 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005836 if (x > 0xffff) {
5837 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5838 "htons: Python int too large to convert to C "
5839 "16-bit unsigned integer (The silent truncation "
5840 "is deprecated)",
5841 1)) {
5842 return NULL;
5843 }
5844 }
5845 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005846}
5847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005848PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005849"htons(integer) -> integer\n\
5850\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005851Convert a 16-bit unsigned integer from host to network byte order.\n\
5852Note that in case the received integer does not fit in 16-bit unsigned\n\
5853integer, but does fit in a positive C int, it is silently truncated to\n\
585416-bit unsigned integer.\n\
5855However, this silent truncation feature is deprecated, and will raise an \n\
5856exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005857
5858
Guido van Rossum006bf911996-06-12 04:04:55 +00005859static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005860socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 if (PyLong_Check(arg)) {
5865 x = PyLong_AsUnsignedLong(arg);
5866 if (x == (unsigned long) -1 && PyErr_Occurred())
5867 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005868#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 {
5870 unsigned long y;
5871 /* only want the trailing 32 bits */
5872 y = x & 0xFFFFFFFFUL;
5873 if (y ^ x)
5874 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005875 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 x = y;
5877 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 }
5880 else
5881 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005882 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 Py_TYPE(arg)->tp_name);
5884 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005885}
5886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005887PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005888"htonl(integer) -> integer\n\
5889\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005890Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005891
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005892/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005894PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005895"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005896\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005897Convert 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 +00005898binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005899
5900static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005901socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005902{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005903#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005905#endif
5906
5907#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005908#if (SIZEOF_INT != 4)
5909#error "Not sure if in_addr_t exists and int is not 32-bits."
5910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 /* Have to use inet_addr() instead */
5912 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005913#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005914 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5917 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005918
Tim Peters1df9fdd2003-02-13 03:13:40 +00005919
5920#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005921
5922#ifdef USE_INET_ATON_WEAKLINK
5923 if (inet_aton != NULL) {
5924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 if (inet_aton(ip_addr, &buf))
5926 return PyBytes_FromStringAndSize((char *)(&buf),
5927 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005928
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005929 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 "illegal IP address string passed to inet_aton");
5931 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005932
Thomas Wouters477c8d52006-05-27 19:21:47 +00005933#ifdef USE_INET_ATON_WEAKLINK
5934 } else {
5935#endif
5936
5937#endif
5938
5939#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 /* special-case this address as inet_addr might return INADDR_NONE
5942 * for this */
5943 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005944 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005946
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005947 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005951 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 "illegal IP address string passed to inet_aton");
5953 return NULL;
5954 }
5955 }
5956 return PyBytes_FromStringAndSize((char *) &packed_addr,
5957 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005958
5959#ifdef USE_INET_ATON_WEAKLINK
5960 }
5961#endif
5962
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005963#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005964}
5965
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005966PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005967"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005968\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005969Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005970
5971static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005972socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005973{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005974 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005976
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005977 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 return NULL;
5979 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005980
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005981 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005982 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005984 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 return NULL;
5986 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005987
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005988 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5989 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005990
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005991 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005993}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005994
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005995#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005996
5997PyDoc_STRVAR(inet_pton_doc,
5998"inet_pton(af, ip) -> packed IP address string\n\
5999\n\
6000Convert an IP address from string format to a packed string suitable\n\
6001for use with low-level network functions.");
6002
6003static PyObject *
6004socket_inet_pton(PyObject *self, PyObject *args)
6005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006007 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006009#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006010 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6015 return NULL;
6016 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006017
Martin v. Löwis04697e82004-06-02 12:35:29 +00006018#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006020 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 "can't use AF_INET6, IPv6 is disabled");
6022 return NULL;
6023 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006024#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 retval = inet_pton(af, ip, packed);
6027 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006028 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 return NULL;
6030 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006031 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 "illegal IP address string passed to inet_pton");
6033 return NULL;
6034 } else if (af == AF_INET) {
6035 return PyBytes_FromStringAndSize(packed,
6036 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006037#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 } else if (af == AF_INET6) {
6039 return PyBytes_FromStringAndSize(packed,
6040 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006043 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044 return NULL;
6045 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006046}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006047
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006048PyDoc_STRVAR(inet_ntop_doc,
6049"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6050\n\
6051Convert a packed IP address of the given family to string format.");
6052
6053static PyObject *
6054socket_inet_ntop(PyObject *self, PyObject *args)
6055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006057 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006059#ifdef ENABLE_IPV6
Miss Islington (bot)04425992018-02-12 12:12:24 -08006060 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006061#else
Miss Islington (bot)04425992018-02-12 12:12:24 -08006062 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006063#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006064
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006065 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 return NULL;
6067 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006070 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 PyErr_SetString(PyExc_ValueError,
6072 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006073 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 return NULL;
6075 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006076#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006078 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 PyErr_SetString(PyExc_ValueError,
6080 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006081 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 return NULL;
6083 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 } else {
6086 PyErr_Format(PyExc_ValueError,
6087 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006088 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 return NULL;
6090 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006091
Miss Islington (bot)04425992018-02-12 12:12:24 -08006092 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006093 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6094 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006096 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 return NULL;
6098 } else {
6099 return PyUnicode_FromString(retval);
6100 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006101}
6102
6103#endif /* HAVE_INET_PTON */
6104
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006105/* Python interface to getaddrinfo(host, port). */
6106
6107/*ARGSUSED*/
6108static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006109socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006110{
Victor Stinner77af1722011-05-26 14:05:59 +02006111 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006112 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 struct addrinfo hints, *res;
6114 struct addrinfo *res0 = NULL;
6115 PyObject *hobj = NULL;
6116 PyObject *pobj = (PyObject *)NULL;
6117 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006118 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 int family, socktype, protocol, flags;
6120 int error;
6121 PyObject *all = (PyObject *)NULL;
6122 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006123
Georg Brandl6083a4b2013-10-14 06:51:46 +02006124 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006126 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006127 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 &protocol, &flags)) {
6129 return NULL;
6130 }
6131 if (hobj == Py_None) {
6132 hptr = NULL;
6133 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006134 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 if (!idna)
6136 return NULL;
6137 assert(PyBytes_Check(idna));
6138 hptr = PyBytes_AS_STRING(idna);
6139 } else if (PyBytes_Check(hobj)) {
6140 hptr = PyBytes_AsString(hobj);
6141 } else {
6142 PyErr_SetString(PyExc_TypeError,
6143 "getaddrinfo() argument 1 must be string or None");
6144 return NULL;
6145 }
6146 if (PyLong_CheckExact(pobj)) {
6147 long value = PyLong_AsLong(pobj);
6148 if (value == -1 && PyErr_Occurred())
6149 goto err;
6150 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6151 pptr = pbuf;
6152 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006153 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006154 if (pptr == NULL)
6155 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006157 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 } else if (pobj == Py_None) {
6159 pptr = (char *)NULL;
6160 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006161 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 goto err;
6163 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006164#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006165 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006166 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006167 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6168 * This workaround avoids a segfault in libsystem.
6169 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006170 pptr = "00";
6171 }
6172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 memset(&hints, 0, sizeof(hints));
6174 hints.ai_family = family;
6175 hints.ai_socktype = socktype;
6176 hints.ai_protocol = protocol;
6177 hints.ai_flags = flags;
6178 Py_BEGIN_ALLOW_THREADS
6179 ACQUIRE_GETADDRINFO_LOCK
6180 error = getaddrinfo(hptr, pptr, &hints, &res0);
6181 Py_END_ALLOW_THREADS
6182 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6183 if (error) {
6184 set_gaierror(error);
6185 goto err;
6186 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006187
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006188 all = PyList_New(0);
6189 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 goto err;
6191 for (res = res0; res; res = res->ai_next) {
6192 PyObject *single;
6193 PyObject *addr =
6194 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6195 if (addr == NULL)
6196 goto err;
6197 single = Py_BuildValue("iiisO", res->ai_family,
6198 res->ai_socktype, res->ai_protocol,
6199 res->ai_canonname ? res->ai_canonname : "",
6200 addr);
6201 Py_DECREF(addr);
6202 if (single == NULL)
6203 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 if (PyList_Append(all, single))
6206 goto err;
6207 Py_XDECREF(single);
6208 }
6209 Py_XDECREF(idna);
6210 if (res0)
6211 freeaddrinfo(res0);
6212 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006213 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 Py_XDECREF(all);
6215 Py_XDECREF(idna);
6216 if (res0)
6217 freeaddrinfo(res0);
6218 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006219}
6220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006221PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006222"getaddrinfo(host, port [, family, type, proto, flags])\n\
6223 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006224\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006225Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006226
6227/* Python interface to getnameinfo(sa, flags). */
6228
6229/*ARGSUSED*/
6230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006231socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 PyObject *sa = (PyObject *)NULL;
6234 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006235 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006236 int port;
6237 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6239 struct addrinfo hints, *res = NULL;
6240 int error;
6241 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006242 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 flags = flowinfo = scope_id = 0;
6245 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6246 return NULL;
6247 if (!PyTuple_Check(sa)) {
6248 PyErr_SetString(PyExc_TypeError,
6249 "getnameinfo() argument 1 must be a tuple");
6250 return NULL;
6251 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006252 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006254 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006256 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006257 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006258 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006259 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006260 return NULL;
6261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006262 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6263 memset(&hints, 0, sizeof(hints));
6264 hints.ai_family = AF_UNSPEC;
6265 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006266 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 Py_BEGIN_ALLOW_THREADS
6268 ACQUIRE_GETADDRINFO_LOCK
6269 error = getaddrinfo(hostp, pbuf, &hints, &res);
6270 Py_END_ALLOW_THREADS
6271 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6272 if (error) {
6273 set_gaierror(error);
6274 goto fail;
6275 }
6276 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006277 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 "sockaddr resolved to multiple addresses");
6279 goto fail;
6280 }
6281 switch (res->ai_family) {
6282 case AF_INET:
6283 {
6284 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006285 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 "IPv4 sockaddr must be 2 tuple");
6287 goto fail;
6288 }
6289 break;
6290 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006291#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 case AF_INET6:
6293 {
6294 struct sockaddr_in6 *sin6;
6295 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006296 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 sin6->sin6_scope_id = scope_id;
6298 break;
6299 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006302 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6304 if (error) {
6305 set_gaierror(error);
6306 goto fail;
6307 }
Victor Stinner72400302016-01-28 15:41:01 +01006308
6309 name = sock_decode_hostname(hbuf);
6310 if (name == NULL)
6311 goto fail;
6312 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006313
6314fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 if (res)
6316 freeaddrinfo(res);
6317 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006318}
6319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006320PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006321"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006322\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006323Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006324
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006325
6326/* Python API to getting and setting the default timeout value. */
6327
6328static PyObject *
6329socket_getdefaulttimeout(PyObject *self)
6330{
Victor Stinner71694d52015-03-28 01:18:54 +01006331 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006332 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 }
Victor Stinner71694d52015-03-28 01:18:54 +01006334 else {
6335 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6336 return PyFloat_FromDouble(seconds);
6337 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006338}
6339
6340PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006341"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006342\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006343Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006344A value of None indicates that new socket objects have no timeout.\n\
6345When the socket module is first imported, the default is None.");
6346
6347static PyObject *
6348socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6349{
Victor Stinner71694d52015-03-28 01:18:54 +01006350 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006351
Victor Stinner71694d52015-03-28 01:18:54 +01006352 if (socket_parse_timeout(&timeout, arg) < 0)
6353 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006356
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006357 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006358}
6359
6360PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006361"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006362\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006363Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006364A value of None indicates that new socket objects have no timeout.\n\
6365When the socket module is first imported, the default is None.");
6366
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006367#ifdef HAVE_IF_NAMEINDEX
6368/* Python API for getting interface indices and names */
6369
6370static PyObject *
6371socket_if_nameindex(PyObject *self, PyObject *arg)
6372{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006373 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006374 int i;
6375 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006376
Charles-François Natali60713592011-05-20 16:55:06 +02006377 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006378 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006379 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006380 return NULL;
6381 }
6382
6383 list = PyList_New(0);
6384 if (list == NULL) {
6385 if_freenameindex(ni);
6386 return NULL;
6387 }
6388
Charles-François Natali60713592011-05-20 16:55:06 +02006389 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6390 PyObject *ni_tuple = Py_BuildValue("IO&",
6391 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006392
6393 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6394 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006395 Py_DECREF(list);
6396 if_freenameindex(ni);
6397 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006398 }
6399 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006400 }
6401
6402 if_freenameindex(ni);
6403 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006404}
6405
6406PyDoc_STRVAR(if_nameindex_doc,
6407"if_nameindex()\n\
6408\n\
6409Returns a list of network interface information (index, name) tuples.");
6410
Charles-François Natali60713592011-05-20 16:55:06 +02006411static PyObject *
6412socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006413{
Charles-François Natali60713592011-05-20 16:55:06 +02006414 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006415 unsigned long index;
6416
Charles-François Natali60713592011-05-20 16:55:06 +02006417 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6418 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006419 return NULL;
6420
Charles-François Natali60713592011-05-20 16:55:06 +02006421 index = if_nametoindex(PyBytes_AS_STRING(oname));
6422 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006423 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006424 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006425 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006426 return NULL;
6427 }
6428
6429 return PyLong_FromUnsignedLong(index);
6430}
6431
6432PyDoc_STRVAR(if_nametoindex_doc,
6433"if_nametoindex(if_name)\n\
6434\n\
6435Returns the interface index corresponding to the interface name if_name.");
6436
Charles-François Natali60713592011-05-20 16:55:06 +02006437static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006438socket_if_indextoname(PyObject *self, PyObject *arg)
6439{
Charles-François Natali60713592011-05-20 16:55:06 +02006440 unsigned long index;
6441 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006442
Charles-François Natali60713592011-05-20 16:55:06 +02006443 index = PyLong_AsUnsignedLong(arg);
6444 if (index == (unsigned long) -1)
6445 return NULL;
6446
6447 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006448 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006449 return NULL;
6450 }
6451
Charles-François Natali60713592011-05-20 16:55:06 +02006452 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006453}
6454
6455PyDoc_STRVAR(if_indextoname_doc,
6456"if_indextoname(if_index)\n\
6457\n\
6458Returns the interface name corresponding to the interface index if_index.");
6459
6460#endif /* HAVE_IF_NAMEINDEX */
6461
6462
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006463#ifdef CMSG_LEN
6464/* Python interface to CMSG_LEN(length). */
6465
6466static PyObject *
6467socket_CMSG_LEN(PyObject *self, PyObject *args)
6468{
6469 Py_ssize_t length;
6470 size_t result;
6471
6472 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6473 return NULL;
6474 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6475 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6476 return NULL;
6477 }
6478 return PyLong_FromSize_t(result);
6479}
6480
6481PyDoc_STRVAR(CMSG_LEN_doc,
6482"CMSG_LEN(length) -> control message length\n\
6483\n\
6484Return the total length, without trailing padding, of an ancillary\n\
6485data item with associated data of the given length. This value can\n\
6486often be used as the buffer size for recvmsg() to receive a single\n\
6487item of ancillary data, but RFC 3542 requires portable applications to\n\
6488use CMSG_SPACE() and thus include space for padding, even when the\n\
6489item will be the last in the buffer. Raises OverflowError if length\n\
6490is outside the permissible range of values.");
6491
6492
6493#ifdef CMSG_SPACE
6494/* Python interface to CMSG_SPACE(length). */
6495
6496static PyObject *
6497socket_CMSG_SPACE(PyObject *self, PyObject *args)
6498{
6499 Py_ssize_t length;
6500 size_t result;
6501
6502 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6503 return NULL;
6504 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6505 PyErr_SetString(PyExc_OverflowError,
6506 "CMSG_SPACE() argument out of range");
6507 return NULL;
6508 }
6509 return PyLong_FromSize_t(result);
6510}
6511
6512PyDoc_STRVAR(CMSG_SPACE_doc,
6513"CMSG_SPACE(length) -> buffer size\n\
6514\n\
6515Return the buffer size needed for recvmsg() to receive an ancillary\n\
6516data item with associated data of the given length, along with any\n\
6517trailing padding. The buffer space needed to receive multiple items\n\
6518is the sum of the CMSG_SPACE() values for their associated data\n\
6519lengths. Raises OverflowError if length is outside the permissible\n\
6520range of values.");
6521#endif /* CMSG_SPACE */
6522#endif /* CMSG_LEN */
6523
6524
Guido van Rossum30a685f1991-06-27 15:51:29 +00006525/* List of functions exported by this module. */
6526
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006527static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528 {"gethostbyname", socket_gethostbyname,
6529 METH_VARARGS, gethostbyname_doc},
6530 {"gethostbyname_ex", socket_gethostbyname_ex,
6531 METH_VARARGS, ghbn_ex_doc},
6532 {"gethostbyaddr", socket_gethostbyaddr,
6533 METH_VARARGS, gethostbyaddr_doc},
6534 {"gethostname", socket_gethostname,
6535 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006536#ifdef HAVE_SETHOSTNAME
6537 {"sethostname", socket_sethostname,
6538 METH_VARARGS, sethostname_doc},
6539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540 {"getservbyname", socket_getservbyname,
6541 METH_VARARGS, getservbyname_doc},
6542 {"getservbyport", socket_getservbyport,
6543 METH_VARARGS, getservbyport_doc},
6544 {"getprotobyname", socket_getprotobyname,
6545 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006546 {"close", socket_close,
6547 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006548#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549 {"dup", socket_dup,
6550 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006551#endif
Dave Cole331708b2004-08-09 04:51:41 +00006552#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 {"socketpair", socket_socketpair,
6554 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 {"ntohs", socket_ntohs,
6557 METH_VARARGS, ntohs_doc},
6558 {"ntohl", socket_ntohl,
6559 METH_O, ntohl_doc},
6560 {"htons", socket_htons,
6561 METH_VARARGS, htons_doc},
6562 {"htonl", socket_htonl,
6563 METH_O, htonl_doc},
6564 {"inet_aton", socket_inet_aton,
6565 METH_VARARGS, inet_aton_doc},
6566 {"inet_ntoa", socket_inet_ntoa,
6567 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006568#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 {"inet_pton", socket_inet_pton,
6570 METH_VARARGS, inet_pton_doc},
6571 {"inet_ntop", socket_inet_ntop,
6572 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006573#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006574 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6575 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576 {"getnameinfo", socket_getnameinfo,
6577 METH_VARARGS, getnameinfo_doc},
6578 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6579 METH_NOARGS, getdefaulttimeout_doc},
6580 {"setdefaulttimeout", socket_setdefaulttimeout,
6581 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006582#ifdef HAVE_IF_NAMEINDEX
6583 {"if_nameindex", socket_if_nameindex,
6584 METH_NOARGS, if_nameindex_doc},
6585 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006586 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006587 {"if_indextoname", socket_if_indextoname,
6588 METH_O, if_indextoname_doc},
6589#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006590#ifdef CMSG_LEN
6591 {"CMSG_LEN", socket_CMSG_LEN,
6592 METH_VARARGS, CMSG_LEN_doc},
6593#ifdef CMSG_SPACE
6594 {"CMSG_SPACE", socket_CMSG_SPACE,
6595 METH_VARARGS, CMSG_SPACE_doc},
6596#endif
6597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006599};
6600
Guido van Rossum30a685f1991-06-27 15:51:29 +00006601
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006602#ifdef MS_WINDOWS
6603#define OS_INIT_DEFINED
6604
6605/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006606
6607static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006608os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006611}
6612
6613static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006614os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 WSADATA WSAData;
6617 int ret;
6618 ret = WSAStartup(0x0101, &WSAData);
6619 switch (ret) {
6620 case 0: /* No error */
6621 Py_AtExit(os_cleanup);
6622 return 1; /* Success */
6623 case WSASYSNOTREADY:
6624 PyErr_SetString(PyExc_ImportError,
6625 "WSAStartup failed: network not ready");
6626 break;
6627 case WSAVERNOTSUPPORTED:
6628 case WSAEINVAL:
6629 PyErr_SetString(
6630 PyExc_ImportError,
6631 "WSAStartup failed: requested version not supported");
6632 break;
6633 default:
6634 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6635 break;
6636 }
6637 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006638}
6639
Guido van Rossum8d665e61996-06-26 18:22:49 +00006640#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006641
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006642
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006643
6644#ifndef OS_INIT_DEFINED
6645static int
6646os_init(void)
6647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006649}
6650#endif
6651
6652
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006653/* C API table - always add new things to the end for binary
6654 compatibility. */
6655static
6656PySocketModule_APIObject PySocketModuleAPI =
6657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006659 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006661};
6662
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006663
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006664/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006665
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006666 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006667 "socket.py" which implements some additional functionality.
6668 The import of "_socket" may fail with an ImportError exception if
6669 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006670 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006671 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006672*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006673
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006674PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006675"Implementation module for socket operations.\n\
6676\n\
6677See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006678
Martin v. Löwis1a214512008-06-11 05:26:20 +00006679static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 PyModuleDef_HEAD_INIT,
6681 PySocket_MODULE_NAME,
6682 socket_doc,
6683 -1,
6684 socket_methods,
6685 NULL,
6686 NULL,
6687 NULL,
6688 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006689};
6690
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006691PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006692PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006694 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696 if (!os_init())
6697 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006698
Victor Stinnerdaf45552013-08-28 00:53:59 +02006699#ifdef MS_WINDOWS
6700 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006701 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006702 }
6703#endif
6704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 Py_TYPE(&sock_type) = &PyType_Type;
6706 m = PyModule_Create(&socketmodule);
6707 if (m == NULL)
6708 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006709
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006710 Py_INCREF(PyExc_OSError);
6711 PySocketModuleAPI.error = PyExc_OSError;
6712 Py_INCREF(PyExc_OSError);
6713 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006715 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716 if (socket_herror == NULL)
6717 return NULL;
6718 Py_INCREF(socket_herror);
6719 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006720 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 NULL);
6722 if (socket_gaierror == NULL)
6723 return NULL;
6724 Py_INCREF(socket_gaierror);
6725 PyModule_AddObject(m, "gaierror", socket_gaierror);
6726 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006727 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 if (socket_timeout == NULL)
6729 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006730 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731 Py_INCREF(socket_timeout);
6732 PyModule_AddObject(m, "timeout", socket_timeout);
6733 Py_INCREF((PyObject *)&sock_type);
6734 if (PyModule_AddObject(m, "SocketType",
6735 (PyObject *)&sock_type) != 0)
6736 return NULL;
6737 Py_INCREF((PyObject *)&sock_type);
6738 if (PyModule_AddObject(m, "socket",
6739 (PyObject *)&sock_type) != 0)
6740 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006741
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006742#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006744#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 Py_INCREF(has_ipv6);
6748 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* Export C API */
6751 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6752 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6753 ) != 0)
6754 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006757#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006759#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006761#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006763#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006764#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006767#endif
6768#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006770#endif
6771#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006774#endif
6775#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006778#endif
6779#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006782#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006783#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006786#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006787#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006790#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006791#ifdef HAVE_SOCKADDR_ALG
6792 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6793#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006794#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006797#endif
6798#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006800#endif
6801#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006804#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006805#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006808#endif
6809#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006812#endif
6813#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006816#endif
6817#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006820#endif
6821#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, AF_NETLINK);
6824 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006825#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006827#endif
6828#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006830#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6832 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006833#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006835#endif
6836#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006838#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006839#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006841#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006842#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006844#endif
6845#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006847#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006849#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006851#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006852#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006854#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006855#ifdef NETLINK_CRYPTO
6856 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6857#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006858#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006859
6860#ifdef AF_VSOCK
6861 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6862 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6863 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6864 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6865 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6866 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6867 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6868 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6869 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6870#endif
6871
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006872#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006875#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006876#ifdef AF_LINK
6877 PyModule_AddIntMacro(m, AF_LINK);
6878#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006879#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006882#endif
6883#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006884 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006886#endif
6887#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006890#endif
6891#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006894#endif
6895#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006898#endif
6899#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006902#endif
6903#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006906#endif
6907#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006908 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006910#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006911
Hye-Shik Chang81268602004-02-02 06:05:24 +00006912#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6914 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6915 PyModule_AddIntMacro(m, BTPROTO_HCI);
6916 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006917#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006919#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006920#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006921#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006923#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6925 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006926#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6929 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006930#endif
6931
Charles-François Natali47413c12011-10-06 19:47:44 +02006932#ifdef AF_CAN
6933 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006935#endif
6936#ifdef PF_CAN
6937 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006939#endif
6940
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006941/* Reliable Datagram Sockets */
6942#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006944#endif
6945#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006947#endif
6948
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006949/* Kernel event messages */
6950#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006952#endif
6953#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006955#endif
6956
Antoine Pitroub156a462010-10-27 20:13:57 +00006957#ifdef AF_PACKET
6958 PyModule_AddIntMacro(m, AF_PACKET);
6959#endif
6960#ifdef PF_PACKET
6961 PyModule_AddIntMacro(m, PF_PACKET);
6962#endif
6963#ifdef PACKET_HOST
6964 PyModule_AddIntMacro(m, PACKET_HOST);
6965#endif
6966#ifdef PACKET_BROADCAST
6967 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6968#endif
6969#ifdef PACKET_MULTICAST
6970 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6971#endif
6972#ifdef PACKET_OTHERHOST
6973 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6974#endif
6975#ifdef PACKET_OUTGOING
6976 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6977#endif
6978#ifdef PACKET_LOOPBACK
6979 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6980#endif
6981#ifdef PACKET_FASTROUTE
6982 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006983#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006984
Christian Heimes043d6f62008-01-07 17:19:16 +00006985#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006988 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6990 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6991 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006992
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6994 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6995 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006997 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, SOL_TIPC);
6999 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7000 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7001 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7002 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007003
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7005 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7006 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7007 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7011 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007012#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007014 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007015#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7017 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7018 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7019 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7020 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7021 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007022#endif
7023
Christian Heimesdffa3942016-09-05 23:54:41 +02007024#ifdef HAVE_SOCKADDR_ALG
7025 /* Socket options */
7026 PyModule_AddIntMacro(m, ALG_SET_KEY);
7027 PyModule_AddIntMacro(m, ALG_SET_IV);
7028 PyModule_AddIntMacro(m, ALG_SET_OP);
7029 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7030 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7031 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7032
7033 /* Operations */
7034 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7035 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7036 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7037 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7038#endif
7039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, SOCK_STREAM);
7042 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007043/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007044#ifdef SOCK_RAW
7045 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007047#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007049#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007051#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007052#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007054#endif
7055#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007057#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007067#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007068#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007070#endif
7071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007081#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007084#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007087#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007089#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007090#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007093#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007121#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007122#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007124#endif
7125#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007127#endif
7128#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007130#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007131#ifdef SO_PASSSEC
7132 PyModule_AddIntMacro(m, SO_PASSSEC);
7133#endif
7134#ifdef SO_PEERSEC
7135 PyModule_AddIntMacro(m, SO_PEERSEC);
7136#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007137#ifdef SO_BINDTODEVICE
7138 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7139#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007140#ifdef SO_PRIORITY
7141 PyModule_AddIntMacro(m, SO_PRIORITY);
7142#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007143#ifdef SO_MARK
7144 PyModule_AddIntMacro(m, SO_MARK);
7145#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007146#ifdef SO_DOMAIN
7147 PyModule_AddIntMacro(m, SO_DOMAIN);
7148#endif
7149#ifdef SO_PROTOCOL
7150 PyModule_AddIntMacro(m, SO_PROTOCOL);
7151#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007153 /* Maximum number of connections for "listen" */
7154#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007156#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007158#endif
7159
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007160 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007161#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007163#endif
7164#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007166#endif
7167#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007169#endif
7170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171 /* Flags for send, recv */
7172#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007201#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007202#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007204#endif
7205#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007207#endif
7208#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007210#endif
7211#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007213#endif
7214#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007216#endif
7217#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007219#endif
7220#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007222#endif
7223#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007225#endif
7226#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007228#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007229#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007231#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* Protocol level and numbers, usable for [gs]etsockopt */
7234#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007259#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007264#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007266#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007267#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007269#endif
7270#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7272 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007273#endif
7274#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7276 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7277 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007278
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7280 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7281 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007282#ifdef CAN_ISOTP
7283 PyModule_AddIntMacro(m, CAN_ISOTP);
7284#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007285#endif
7286#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7288 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7289 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7290 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007291#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007292#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7293 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7294#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007295#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007297 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7298 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7299 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7300 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7301 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7302 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7303 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7304 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7305 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7306 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7307 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7308 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7309#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007310#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007312#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007313#ifdef HAVE_SOCKADDR_ALG
7314 PyModule_AddIntMacro(m, SOL_ALG);
7315#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007316#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007318#endif
7319#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007321#endif
7322#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007324#endif
7325#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007327#endif
7328#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007330#endif
7331#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007344#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007364#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007375#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007376 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007396#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007405#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007411#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007434#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007435#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007440#endif
7441/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007444#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007449#endif
7450
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007451#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007453#endif
7454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455 /* Some port configuration */
7456#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007458#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007459 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007465#endif
7466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467 /* Some reserved IP v.4 addresses */
7468#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007470#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007480#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007483#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007485#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007486 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef INADDR_ALLHOSTS_GROUP
7489 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7490 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007491#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007492 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007496#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007501#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007503#endif
7504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505 /* IPv4 [gs]etsockopt options */
7506#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007553#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007554#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007556#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7559#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007574#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007577 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007578#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007581 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007582#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007584#endif
7585#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007587#endif
7588#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007590#endif
7591#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007593#endif
7594#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007596#endif
7597#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007599#endif
7600#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007602#endif
7603#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007605#endif
7606#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007608#endif
7609#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007611#endif
7612#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007614#endif
7615#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007617#endif
7618#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007620#endif
7621#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007623#endif
7624#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007626#endif
7627#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007629#endif
7630#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007632#endif
7633#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007635#endif
7636#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007638#endif
7639#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007641#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007643 /* TCP options */
7644#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007679#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007680#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007682#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007683#ifdef TCP_CONGESTION
7684 PyModule_AddIntMacro(m, TCP_CONGESTION);
7685#endif
7686#ifdef TCP_USER_TIMEOUT
7687 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7688#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007689#ifdef TCP_NOTSENT_LOWAT
7690 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7691#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693 /* IPX options */
7694#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007696#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007697
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007698/* Reliable Datagram Sockets */
7699#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007701#endif
7702#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007704#endif
7705#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007707#endif
7708#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007710#endif
7711#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007713#endif
7714#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007716#endif
7717#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007719#endif
7720#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007722#endif
7723#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007725#endif
7726#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007728#endif
7729#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007731#endif
7732#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007734#endif
7735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007736 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007737#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007739#endif
7740#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007742#endif
7743#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007745#endif
7746#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007748#endif
7749#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007751#endif
7752#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007754#endif
7755#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007757#endif
7758#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007759 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007760#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007761#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007763#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007764#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007765 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007766#endif
7767#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007769#endif
7770#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007771 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007772#endif
7773#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007774 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007775#endif
7776#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007777 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007778#endif
7779#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007781#endif
7782#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007783 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007784#endif
7785#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007787#endif
7788#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007790#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007791#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007793#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007794#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007796#endif
7797#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007799#endif
7800#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007802#endif
7803#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007805#endif
7806#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007808#endif
7809#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007811#endif
7812#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007813 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007814#endif
7815#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007816 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007817#endif
7818#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007819 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007820#endif
7821#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007822 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007823#endif
7824#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007825 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007826#endif
7827#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007828 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007829#endif
7830#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007831 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007832#endif
7833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007835#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007837#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007838 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007839#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007841#endif
7842#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007843 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007844#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007845 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007846#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007847 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007848#endif
7849#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007851#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007852 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007853#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007854 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007855#endif
7856
Christian Heimesfaf2f632008-01-06 16:59:19 +00007857#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007858 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007859 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7860#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007861 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007862#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007863 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007864 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7865#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007866 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007867#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007868 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007869 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007870 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007871 PyObject *tmp;
7872 tmp = PyLong_FromUnsignedLong(codes[i]);
7873 if (tmp == NULL)
7874 return NULL;
7875 PyModule_AddObject(m, names[i], tmp);
7876 }
7877 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, RCVALL_OFF);
7879 PyModule_AddIntMacro(m, RCVALL_ON);
7880 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007881#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007883#endif
7884#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007885 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007886#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007887#endif /* _MSTCPIP_ */
7888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007889 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007890#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007891 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007893 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007894}