blob: 7fc3d877bba5349047e5050f531410cf03a5aee4 [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
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001102/* Create a string object representing an IP address.
1103 This is always a string of the form 'dd.dd.dd.dd' (with variable
1104 size numbers). */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105
Guido van Rossum73624e91994-10-10 17:59:00 +00001106static PyObject *
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001107makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108{
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001109 char buf[NI_MAXHOST];
1110 int error;
1111
1112 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1113 NI_NUMERICHOST);
1114 if (error) {
1115 set_gaierror(error);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 return NULL;
1117 }
1118 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119}
1120
1121
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001122#ifdef USE_BLUETOOTH
1123/* Convert a string representation of a Bluetooth address into a numeric
1124 address. Returns the length (6), or raises an exception and returns -1 if
1125 an error occurred. */
1126
1127static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001128setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 unsigned int b0, b1, b2, b3, b4, b5;
1131 char ch;
1132 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1135 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1136 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1137 bdaddr->b[0] = b0;
1138 bdaddr->b[1] = b1;
1139 bdaddr->b[2] = b2;
1140 bdaddr->b[3] = b3;
1141 bdaddr->b[4] = b4;
1142 bdaddr->b[5] = b5;
1143 return 6;
1144 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001145 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 return -1;
1147 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001148}
1149
1150/* Create a string representation of the Bluetooth address. This is always a
1151 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1152 value (zero padded if necessary). */
1153
1154static PyObject *
1155makebdaddr(bdaddr_t *bdaddr)
1156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1160 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1161 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1162 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001163}
1164#endif
1165
1166
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167/* Create an object representing the given socket address,
1168 suitable for passing it back to bind(), connect() etc.
1169 The family field of the sockaddr structure is inspected
1170 to determine what kind of address it really is. */
1171
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001173static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001174makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 if (addrlen == 0) {
1177 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001178 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 case AF_INET:
1184 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001185 struct sockaddr_in *a;
1186 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 PyObject *ret = NULL;
1188 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001189 a = (struct sockaddr_in *)addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1191 Py_DECREF(addrobj);
1192 }
1193 return ret;
1194 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001195
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001196#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 case AF_UNIX:
1198 {
1199 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001200#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001201 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1202 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1203 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 }
1205 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001206#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 {
1208 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001209 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 }
1211 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001212#endif /* AF_UNIX */
1213
Martin v. Löwis11017b12006-01-14 18:12:57 +00001214#if defined(AF_NETLINK)
1215 case AF_NETLINK:
1216 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1218 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001219 }
1220#endif /* AF_NETLINK */
1221
caaveryeffc12f2017-09-06 18:18:10 -04001222#if defined(AF_VSOCK)
1223 case AF_VSOCK:
1224 {
1225 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1226 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1227 }
1228#endif /* AF_VSOCK */
1229
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001230#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 case AF_INET6:
1232 {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001233 struct sockaddr_in6 *a;
1234 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 PyObject *ret = NULL;
1236 if (addrobj) {
Yury Selivanov0ceb7172018-01-28 16:08:32 -05001237 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001238 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 addrobj,
1240 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001241 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 a->sin6_scope_id);
1243 Py_DECREF(addrobj);
1244 }
1245 return ret;
1246 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001247#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 case AF_BLUETOOTH:
1251 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 case BTPROTO_L2CAP:
1254 {
1255 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1256 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1257 PyObject *ret = NULL;
1258 if (addrobj) {
1259 ret = Py_BuildValue("Oi",
1260 addrobj,
1261 _BT_L2_MEMB(a, psm));
1262 Py_DECREF(addrobj);
1263 }
1264 return ret;
1265 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case BTPROTO_RFCOMM:
1268 {
1269 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1270 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1271 PyObject *ret = NULL;
1272 if (addrobj) {
1273 ret = Py_BuildValue("Oi",
1274 addrobj,
1275 _BT_RC_MEMB(a, channel));
1276 Py_DECREF(addrobj);
1277 }
1278 return ret;
1279 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 case BTPROTO_HCI:
1282 {
1283 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001284#if defined(__NetBSD__) || defined(__DragonFly__)
1285 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001286#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyObject *ret = NULL;
1288 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1289 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001290#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001292
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case BTPROTO_SCO:
1295 {
1296 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1297 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1298 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001299#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 default:
1302 PyErr_SetString(PyExc_ValueError,
1303 "Unknown Bluetooth protocol");
1304 return NULL;
1305 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001306#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001307
Antoine Pitroub156a462010-10-27 20:13:57 +00001308#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 case AF_PACKET:
1310 {
1311 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001312 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 struct ifreq ifr;
1314 /* need to look up interface name give index */
1315 if (a->sll_ifindex) {
1316 ifr.ifr_ifindex = a->sll_ifindex;
1317 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1318 ifname = ifr.ifr_name;
1319 }
1320 return Py_BuildValue("shbhy#",
1321 ifname,
1322 ntohs(a->sll_protocol),
1323 a->sll_pkttype,
1324 a->sll_hatype,
1325 a->sll_addr,
1326 a->sll_halen);
1327 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001328#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001329
Christian Heimes043d6f62008-01-07 17:19:16 +00001330#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case AF_TIPC:
1332 {
1333 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1334 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1335 return Py_BuildValue("IIIII",
1336 a->addrtype,
1337 a->addr.nameseq.type,
1338 a->addr.nameseq.lower,
1339 a->addr.nameseq.upper,
1340 a->scope);
1341 } else if (a->addrtype == TIPC_ADDR_NAME) {
1342 return Py_BuildValue("IIIII",
1343 a->addrtype,
1344 a->addr.name.name.type,
1345 a->addr.name.name.instance,
1346 a->addr.name.name.instance,
1347 a->scope);
1348 } else if (a->addrtype == TIPC_ADDR_ID) {
1349 return Py_BuildValue("IIIII",
1350 a->addrtype,
1351 a->addr.id.node,
1352 a->addr.id.ref,
1353 0,
1354 a->scope);
1355 } else {
1356 PyErr_SetString(PyExc_ValueError,
1357 "Invalid address type");
1358 return NULL;
1359 }
1360 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001361#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001362
Serhiy Storchakad3187152017-11-09 18:00:38 +02001363#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001364 case AF_CAN:
1365 {
1366 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001367 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001368 struct ifreq ifr;
1369 /* need to look up interface name given index */
1370 if (a->can_ifindex) {
1371 ifr.ifr_ifindex = a->can_ifindex;
1372 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1373 ifname = ifr.ifr_name;
1374 }
1375
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001376 switch (proto) {
1377#ifdef CAN_ISOTP
1378 case CAN_ISOTP:
1379 {
1380 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1381 ifname,
1382 a->can_addr.tp.rx_id,
1383 a->can_addr.tp.tx_id);
1384 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001385#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001386 default:
1387 {
1388 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1389 ifname);
1390 }
1391 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001392 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001393#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001394
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001395#ifdef PF_SYSTEM
1396 case PF_SYSTEM:
1397 switch(proto) {
1398#ifdef SYSPROTO_CONTROL
1399 case SYSPROTO_CONTROL:
1400 {
1401 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1402 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1403 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001404#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001405 default:
1406 PyErr_SetString(PyExc_ValueError,
1407 "Invalid address type");
1408 return 0;
1409 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001410#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001411
Christian Heimesdffa3942016-09-05 23:54:41 +02001412#ifdef HAVE_SOCKADDR_ALG
1413 case AF_ALG:
1414 {
1415 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1416 return Py_BuildValue("s#s#HH",
1417 a->salg_type,
1418 strnlen((const char*)a->salg_type,
1419 sizeof(a->salg_type)),
1420 a->salg_name,
1421 strnlen((const char*)a->salg_name,
1422 sizeof(a->salg_name)),
1423 a->salg_feat,
1424 a->salg_mask);
1425 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001426#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 default:
1431 /* If we don't know the address family, don't raise an
1432 exception -- return it as an (int, bytes) tuple. */
1433 return Py_BuildValue("iy#",
1434 addr->sa_family,
1435 addr->sa_data,
1436 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439}
1440
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001441/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1442 (in particular, numeric IP addresses). */
1443struct maybe_idna {
1444 PyObject *obj;
1445 char *buf;
1446};
1447
1448static void
1449idna_cleanup(struct maybe_idna *data)
1450{
1451 Py_CLEAR(data->obj);
1452}
1453
1454static int
1455idna_converter(PyObject *obj, struct maybe_idna *data)
1456{
1457 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001458 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001459 if (obj == NULL) {
1460 idna_cleanup(data);
1461 return 1;
1462 }
1463 data->obj = NULL;
1464 len = -1;
1465 if (PyBytes_Check(obj)) {
1466 data->buf = PyBytes_AsString(obj);
1467 len = PyBytes_Size(obj);
1468 }
1469 else if (PyByteArray_Check(obj)) {
1470 data->buf = PyByteArray_AsString(obj);
1471 len = PyByteArray_Size(obj);
1472 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001473 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001474 if (PyUnicode_READY(obj) == -1) {
1475 return 0;
1476 }
1477 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001478 data->buf = PyUnicode_DATA(obj);
1479 len = PyUnicode_GET_LENGTH(obj);
1480 }
1481 else {
1482 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1483 if (!obj2) {
1484 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1485 return 0;
1486 }
1487 assert(PyBytes_Check(obj2));
1488 data->obj = obj2;
1489 data->buf = PyBytes_AS_STRING(obj2);
1490 len = PyBytes_GET_SIZE(obj2);
1491 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001492 }
1493 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001494 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1495 obj->ob_type->tp_name);
1496 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001497 }
1498 if (strlen(data->buf) != len) {
1499 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001500 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001501 return 0;
1502 }
1503 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001504}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505
1506/* Parse a socket address argument according to the socket object's
1507 address family. Return 1 if the address was in the proper format,
1508 0 of not. The address is returned through addr_ret, its length
1509 through len_ret. */
1510
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001511static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001512getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001516
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001517#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 case AF_UNIX:
1519 {
1520 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001521 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001522 int retval = 0;
1523
1524 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1525 allow embedded nulls on Linux. */
1526 if (PyUnicode_Check(args)) {
1527 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1528 return 0;
1529 }
1530 else
1531 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001532 if (!PyArg_Parse(args, "y*", &path)) {
1533 Py_DECREF(args);
1534 return retval;
1535 }
1536 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001539#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001540 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001542 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001543 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001545 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 }
1547 }
1548 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001549#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 {
1551 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001553 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001555 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001557 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 }
1559 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001560 memcpy(addr->sun_path, path.buf, path.len);
1561 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001562 retval = 1;
1563 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001564 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001565 Py_DECREF(args);
1566 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001568#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001569
Martin v. Löwis11017b12006-01-14 18:12:57 +00001570#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 case AF_NETLINK:
1572 {
1573 struct sockaddr_nl* addr;
1574 int pid, groups;
1575 addr = (struct sockaddr_nl *)addr_ret;
1576 if (!PyTuple_Check(args)) {
1577 PyErr_Format(
1578 PyExc_TypeError,
1579 "getsockaddrarg: "
1580 "AF_NETLINK address must be tuple, not %.500s",
1581 Py_TYPE(args)->tp_name);
1582 return 0;
1583 }
1584 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1585 return 0;
1586 addr->nl_family = AF_NETLINK;
1587 addr->nl_pid = pid;
1588 addr->nl_groups = groups;
1589 *len_ret = sizeof(*addr);
1590 return 1;
1591 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001592#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001593
caaveryeffc12f2017-09-06 18:18:10 -04001594#if defined(AF_VSOCK)
1595 case AF_VSOCK:
1596 {
1597 struct sockaddr_vm* addr;
1598 int port, cid;
1599 addr = (struct sockaddr_vm *)addr_ret;
1600 memset(addr, 0, sizeof(struct sockaddr_vm));
1601 if (!PyTuple_Check(args)) {
1602 PyErr_Format(
1603 PyExc_TypeError,
1604 "getsockaddrarg: "
1605 "AF_VSOCK address must be tuple, not %.500s",
1606 Py_TYPE(args)->tp_name);
1607 return 0;
1608 }
1609 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1610 return 0;
1611 addr->svm_family = s->sock_family;
1612 addr->svm_port = port;
1613 addr->svm_cid = cid;
1614 *len_ret = sizeof(*addr);
1615 return 1;
1616 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001617#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001618
1619
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001620#ifdef AF_RDS
1621 case AF_RDS:
1622 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001623#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 case AF_INET:
1626 {
1627 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001628 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 int port, result;
1630 if (!PyTuple_Check(args)) {
1631 PyErr_Format(
1632 PyExc_TypeError,
1633 "getsockaddrarg: "
1634 "AF_INET address must be tuple, not %.500s",
1635 Py_TYPE(args)->tp_name);
1636 return 0;
1637 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1639 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 return 0;
1641 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001642 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001644 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 if (result < 0)
1646 return 0;
1647 if (port < 0 || port > 0xffff) {
1648 PyErr_SetString(
1649 PyExc_OverflowError,
1650 "getsockaddrarg: port must be 0-65535.");
1651 return 0;
1652 }
1653 addr->sin_family = AF_INET;
1654 addr->sin_port = htons((short)port);
1655 *len_ret = sizeof *addr;
1656 return 1;
1657 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001658
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001659#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 case AF_INET6:
1661 {
1662 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001663 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001664 int port, result;
1665 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 flowinfo = scope_id = 0;
1667 if (!PyTuple_Check(args)) {
1668 PyErr_Format(
1669 PyExc_TypeError,
1670 "getsockaddrarg: "
1671 "AF_INET6 address must be tuple, not %.500s",
1672 Py_TYPE(args)->tp_name);
1673 return 0;
1674 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001675 if (!PyArg_ParseTuple(args, "O&i|II",
1676 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 &scope_id)) {
1678 return 0;
1679 }
1680 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001681 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001683 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 if (result < 0)
1685 return 0;
1686 if (port < 0 || port > 0xffff) {
1687 PyErr_SetString(
1688 PyExc_OverflowError,
1689 "getsockaddrarg: port must be 0-65535.");
1690 return 0;
1691 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001692 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001693 PyErr_SetString(
1694 PyExc_OverflowError,
1695 "getsockaddrarg: flowinfo must be 0-1048575.");
1696 return 0;
1697 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 addr->sin6_family = s->sock_family;
1699 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001700 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 addr->sin6_scope_id = scope_id;
1702 *len_ret = sizeof *addr;
1703 return 1;
1704 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001705#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001706
Hye-Shik Chang81268602004-02-02 06:05:24 +00001707#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 case AF_BLUETOOTH:
1709 {
1710 switch (s->sock_proto) {
1711 case BTPROTO_L2CAP:
1712 {
1713 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001714 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 addr = (struct sockaddr_l2 *)addr_ret;
1717 memset(addr, 0, sizeof(struct sockaddr_l2));
1718 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1719 if (!PyArg_ParseTuple(args, "si", &straddr,
1720 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001721 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 "wrong format");
1723 return 0;
1724 }
1725 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1726 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 *len_ret = sizeof *addr;
1729 return 1;
1730 }
1731 case BTPROTO_RFCOMM:
1732 {
1733 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001734 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 addr = (struct sockaddr_rc *)addr_ret;
1737 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1738 if (!PyArg_ParseTuple(args, "si", &straddr,
1739 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001740 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 "wrong format");
1742 return 0;
1743 }
1744 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1745 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 *len_ret = sizeof *addr;
1748 return 1;
1749 }
1750 case BTPROTO_HCI:
1751 {
1752 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001753#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001754 const char *straddr;
1755 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1756 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001757 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001758 "wrong format");
1759 return 0;
1760 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001761 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001762 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1763 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001764#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1766 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001767 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 "wrong format");
1769 return 0;
1770 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001771#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 *len_ret = sizeof *addr;
1773 return 1;
1774 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001775#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 case BTPROTO_SCO:
1777 {
1778 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001779 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 addr = (struct sockaddr_sco *)addr_ret;
1782 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1783 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001784 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 "wrong format");
1786 return 0;
1787 }
1788 straddr = PyBytes_AS_STRING(args);
1789 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1790 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 *len_ret = sizeof *addr;
1793 return 1;
1794 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001795#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001797 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 return 0;
1799 }
1800 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001801#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001802
Antoine Pitroub156a462010-10-27 20:13:57 +00001803#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 case AF_PACKET:
1805 {
1806 struct sockaddr_ll* addr;
1807 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001808 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 int protoNumber;
1810 int hatype = 0;
1811 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001812 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (!PyTuple_Check(args)) {
1815 PyErr_Format(
1816 PyExc_TypeError,
1817 "getsockaddrarg: "
1818 "AF_PACKET address must be tuple, not %.500s",
1819 Py_TYPE(args)->tp_name);
1820 return 0;
1821 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001822 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001824 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 return 0;
1826 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1827 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1828 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1829 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001830 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 0;
1832 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001833 if (haddr.buf && haddr.len > 8) {
1834 PyErr_SetString(PyExc_ValueError,
1835 "Hardware address must be 8 bytes or less");
1836 PyBuffer_Release(&haddr);
1837 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 }
1839 if (protoNumber < 0 || protoNumber > 0xffff) {
1840 PyErr_SetString(
1841 PyExc_OverflowError,
1842 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001843 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return 0;
1845 }
1846 addr = (struct sockaddr_ll*)addr_ret;
1847 addr->sll_family = AF_PACKET;
1848 addr->sll_protocol = htons((short)protoNumber);
1849 addr->sll_ifindex = ifr.ifr_ifindex;
1850 addr->sll_pkttype = pkttype;
1851 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001852 if (haddr.buf) {
1853 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1854 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001856 else
1857 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001859 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return 1;
1861 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001862#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001863
Christian Heimes043d6f62008-01-07 17:19:16 +00001864#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 case AF_TIPC:
1866 {
1867 unsigned int atype, v1, v2, v3;
1868 unsigned int scope = TIPC_CLUSTER_SCOPE;
1869 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 if (!PyTuple_Check(args)) {
1872 PyErr_Format(
1873 PyExc_TypeError,
1874 "getsockaddrarg: "
1875 "AF_TIPC address must be tuple, not %.500s",
1876 Py_TYPE(args)->tp_name);
1877 return 0;
1878 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 if (!PyArg_ParseTuple(args,
1881 "IIII|I;Invalid TIPC address format",
1882 &atype, &v1, &v2, &v3, &scope))
1883 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 addr = (struct sockaddr_tipc *) addr_ret;
1886 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 addr->family = AF_TIPC;
1889 addr->scope = scope;
1890 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 if (atype == TIPC_ADDR_NAMESEQ) {
1893 addr->addr.nameseq.type = v1;
1894 addr->addr.nameseq.lower = v2;
1895 addr->addr.nameseq.upper = v3;
1896 } else if (atype == TIPC_ADDR_NAME) {
1897 addr->addr.name.name.type = v1;
1898 addr->addr.name.name.instance = v2;
1899 } else if (atype == TIPC_ADDR_ID) {
1900 addr->addr.id.node = v1;
1901 addr->addr.id.ref = v2;
1902 } else {
1903 /* Shouldn't happen */
1904 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1905 return 0;
1906 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 return 1;
1911 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001912#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001913
Serhiy Storchakad3187152017-11-09 18:00:38 +02001914#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001915 case AF_CAN:
1916 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001917#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001918 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001919 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001920#endif
1921#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001922 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001923#endif
1924#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001925 {
1926 struct sockaddr_can *addr;
1927 PyObject *interfaceName;
1928 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001929 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001930 addr = (struct sockaddr_can *)addr_ret;
1931
Charles-François Natali47413c12011-10-06 19:47:44 +02001932 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1933 &interfaceName))
1934 return 0;
1935
1936 len = PyBytes_GET_SIZE(interfaceName);
1937
1938 if (len == 0) {
1939 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001940 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001941 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1942 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001943 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1944 s->errorhandler();
1945 Py_DECREF(interfaceName);
1946 return 0;
1947 }
1948 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001949 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001950 "AF_CAN interface name too long");
1951 Py_DECREF(interfaceName);
1952 return 0;
1953 }
1954
1955 addr->can_family = AF_CAN;
1956 addr->can_ifindex = ifr.ifr_ifindex;
1957
1958 *len_ret = sizeof(*addr);
1959 Py_DECREF(interfaceName);
1960 return 1;
1961 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001962#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001963
1964#ifdef CAN_ISOTP
1965 case CAN_ISOTP:
1966 {
1967 struct sockaddr_can *addr;
1968 PyObject *interfaceName;
1969 struct ifreq ifr;
1970 Py_ssize_t len;
1971 unsigned long int rx_id, tx_id;
1972
1973 addr = (struct sockaddr_can *)addr_ret;
1974
1975 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1976 &interfaceName,
1977 &rx_id,
1978 &tx_id))
1979 return 0;
1980
1981 len = PyBytes_GET_SIZE(interfaceName);
1982
1983 if (len == 0) {
1984 ifr.ifr_ifindex = 0;
1985 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1986 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1987 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1988 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1989 s->errorhandler();
1990 Py_DECREF(interfaceName);
1991 return 0;
1992 }
1993 } else {
1994 PyErr_SetString(PyExc_OSError,
1995 "AF_CAN interface name too long");
1996 Py_DECREF(interfaceName);
1997 return 0;
1998 }
1999
2000 addr->can_family = AF_CAN;
2001 addr->can_ifindex = ifr.ifr_ifindex;
2002 addr->can_addr.tp.rx_id = rx_id;
2003 addr->can_addr.tp.tx_id = tx_id;
2004
2005 *len_ret = sizeof(*addr);
2006 Py_DECREF(interfaceName);
2007 return 1;
2008 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002009#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002010 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002011 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002012 "getsockaddrarg: unsupported CAN protocol");
2013 return 0;
2014 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002015#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002016
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002017#ifdef PF_SYSTEM
2018 case PF_SYSTEM:
2019 switch (s->sock_proto) {
2020#ifdef SYSPROTO_CONTROL
2021 case SYSPROTO_CONTROL:
2022 {
2023 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002024
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002025 addr = (struct sockaddr_ctl *)addr_ret;
2026 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002027 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002028
2029 if (PyUnicode_Check(args)) {
2030 struct ctl_info info;
2031 PyObject *ctl_name;
2032
2033 if (!PyArg_Parse(args, "O&",
2034 PyUnicode_FSConverter, &ctl_name)) {
2035 return 0;
2036 }
2037
Victor Stinnerf50e1872015-03-20 11:32:24 +01002038 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002039 PyErr_SetString(PyExc_ValueError,
2040 "provided string is too long");
2041 Py_DECREF(ctl_name);
2042 return 0;
2043 }
2044 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2045 sizeof(info.ctl_name));
2046 Py_DECREF(ctl_name);
2047
2048 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2049 PyErr_SetString(PyExc_OSError,
2050 "cannot find kernel control with provided name");
2051 return 0;
2052 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002053
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002054 addr->sc_id = info.ctl_id;
2055 addr->sc_unit = 0;
2056 } else if (!PyArg_ParseTuple(args, "II",
2057 &(addr->sc_id), &(addr->sc_unit))) {
2058 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2059 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002060
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002061 return 0;
2062 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002063
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002064 *len_ret = sizeof(*addr);
2065 return 1;
2066 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002067#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002068 default:
2069 PyErr_SetString(PyExc_OSError,
2070 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2071 return 0;
2072 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002073#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002074#ifdef HAVE_SOCKADDR_ALG
2075 case AF_ALG:
2076 {
2077 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002078 const char *type;
2079 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002080 sa = (struct sockaddr_alg *)addr_ret;
2081
2082 memset(sa, 0, sizeof(*sa));
2083 sa->salg_family = AF_ALG;
2084
2085 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2086 &type, &name, &sa->salg_feat, &sa->salg_mask))
2087 return 0;
2088 /* sockaddr_alg has fixed-sized char arrays for type and name */
2089 if (strlen(type) > sizeof(sa->salg_type)) {
2090 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2091 return 0;
2092 }
2093 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2094 if (strlen(name) > sizeof(sa->salg_name)) {
2095 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2096 return 0;
2097 }
2098 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2099
2100 *len_ret = sizeof(*sa);
2101 return 1;
2102 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002103#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002108 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002112}
2113
Guido van Rossum30a685f1991-06-27 15:51:29 +00002114
Guido van Rossum48a680c2001-03-02 06:34:14 +00002115/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002116 Return 1 if the family is known, 0 otherwise. The length is returned
2117 through len_ret. */
2118
2119static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002120getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002123
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002124#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 case AF_UNIX:
2126 {
2127 *len_ret = sizeof (struct sockaddr_un);
2128 return 1;
2129 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002130#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002131
Martin v. Löwis11017b12006-01-14 18:12:57 +00002132#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002133 case AF_NETLINK:
2134 {
2135 *len_ret = sizeof (struct sockaddr_nl);
2136 return 1;
2137 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002138#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002139
caaveryeffc12f2017-09-06 18:18:10 -04002140#if defined(AF_VSOCK)
2141 case AF_VSOCK:
2142 {
2143 *len_ret = sizeof (struct sockaddr_vm);
2144 return 1;
2145 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002146#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002147
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002148#ifdef AF_RDS
2149 case AF_RDS:
2150 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002151#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 case AF_INET:
2154 {
2155 *len_ret = sizeof (struct sockaddr_in);
2156 return 1;
2157 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002158
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002159#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 case AF_INET6:
2161 {
2162 *len_ret = sizeof (struct sockaddr_in6);
2163 return 1;
2164 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002165#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002166
Hye-Shik Chang81268602004-02-02 06:05:24 +00002167#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 case AF_BLUETOOTH:
2169 {
2170 switch(s->sock_proto)
2171 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 case BTPROTO_L2CAP:
2174 *len_ret = sizeof (struct sockaddr_l2);
2175 return 1;
2176 case BTPROTO_RFCOMM:
2177 *len_ret = sizeof (struct sockaddr_rc);
2178 return 1;
2179 case BTPROTO_HCI:
2180 *len_ret = sizeof (struct sockaddr_hci);
2181 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002182#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 case BTPROTO_SCO:
2184 *len_ret = sizeof (struct sockaddr_sco);
2185 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002186#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002188 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 "unknown BT protocol");
2190 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 }
2193 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002194#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002195
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002196#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 case AF_PACKET:
2198 {
2199 *len_ret = sizeof (struct sockaddr_ll);
2200 return 1;
2201 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002202#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002203
Christian Heimes043d6f62008-01-07 17:19:16 +00002204#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 case AF_TIPC:
2206 {
2207 *len_ret = sizeof (struct sockaddr_tipc);
2208 return 1;
2209 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002210#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002211
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002212#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002213 case AF_CAN:
2214 {
2215 *len_ret = sizeof (struct sockaddr_can);
2216 return 1;
2217 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002218#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002219
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002220#ifdef PF_SYSTEM
2221 case PF_SYSTEM:
2222 switch(s->sock_proto) {
2223#ifdef SYSPROTO_CONTROL
2224 case SYSPROTO_CONTROL:
2225 *len_ret = sizeof (struct sockaddr_ctl);
2226 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002227#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002228 default:
2229 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2230 "unknown PF_SYSTEM protocol");
2231 return 0;
2232 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002233#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002234#ifdef HAVE_SOCKADDR_ALG
2235 case AF_ALG:
2236 {
2237 *len_ret = sizeof (struct sockaddr_alg);
2238 return 1;
2239 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002240#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002245 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002249}
2250
2251
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002252/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2253 Currently, these methods are only compiled if the RFC 2292/3542
2254 CMSG_LEN() macro is available. Older systems seem to have used
2255 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2256 it may be possible to define CMSG_LEN() that way if it's not
2257 provided. Some architectures might need extra padding after the
2258 cmsghdr, however, and CMSG_LEN() would have to take account of
2259 this. */
2260#ifdef CMSG_LEN
2261/* If length is in range, set *result to CMSG_LEN(length) and return
2262 true; otherwise, return false. */
2263static int
2264get_CMSG_LEN(size_t length, size_t *result)
2265{
2266 size_t tmp;
2267
2268 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2269 return 0;
2270 tmp = CMSG_LEN(length);
2271 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2272 return 0;
2273 *result = tmp;
2274 return 1;
2275}
2276
2277#ifdef CMSG_SPACE
2278/* If length is in range, set *result to CMSG_SPACE(length) and return
2279 true; otherwise, return false. */
2280static int
2281get_CMSG_SPACE(size_t length, size_t *result)
2282{
2283 size_t tmp;
2284
2285 /* Use CMSG_SPACE(1) here in order to take account of the padding
2286 necessary before *and* after the data. */
2287 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2288 return 0;
2289 tmp = CMSG_SPACE(length);
2290 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2291 return 0;
2292 *result = tmp;
2293 return 1;
2294}
2295#endif
2296
2297/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2298 pointer in msg->msg_control with at least "space" bytes after it,
2299 and its cmsg_len member inside the buffer. */
2300static int
2301cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2302{
2303 size_t cmsg_offset;
2304 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2305 sizeof(cmsgh->cmsg_len));
2306
Charles-François Natali466517d2011-08-28 18:23:43 +02002307 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002308 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002309 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002310 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2311 annoying under OS X as it's unsigned there and so it triggers a
2312 tautological comparison warning under Clang when compared against 0.
2313 Since the check is valid on other platforms, silence the warning under
2314 Clang. */
2315 #ifdef __clang__
2316 #pragma clang diagnostic push
2317 #pragma clang diagnostic ignored "-Wtautological-compare"
2318 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002319 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002320 #pragma GCC diagnostic push
2321 #pragma GCC diagnostic ignored "-Wtype-limits"
2322 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002323 if (msg->msg_controllen < 0)
2324 return 0;
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 pop
2327 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002328 #ifdef __clang__
2329 #pragma clang diagnostic pop
2330 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002331 if (space < cmsg_len_end)
2332 space = cmsg_len_end;
2333 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2334 return (cmsg_offset <= (size_t)-1 - space &&
2335 cmsg_offset + space <= msg->msg_controllen);
2336}
2337
2338/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2339 *space to number of bytes following it in the buffer and return
2340 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2341 msg->msg_controllen are valid. */
2342static int
2343get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2344{
2345 size_t data_offset;
2346 char *data_ptr;
2347
2348 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2349 return 0;
2350 data_offset = data_ptr - (char *)msg->msg_control;
2351 if (data_offset > msg->msg_controllen)
2352 return 0;
2353 *space = msg->msg_controllen - data_offset;
2354 return 1;
2355}
2356
2357/* If cmsgh is invalid or not contained in the buffer pointed to by
2358 msg->msg_control, return -1. If cmsgh is valid and its associated
2359 data is entirely contained in the buffer, set *data_len to the
2360 length of the associated data and return 0. If only part of the
2361 associated data is contained in the buffer but cmsgh is otherwise
2362 valid, set *data_len to the length contained in the buffer and
2363 return 1. */
2364static int
2365get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2366{
2367 size_t space, cmsg_data_len;
2368
2369 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2370 cmsgh->cmsg_len < CMSG_LEN(0))
2371 return -1;
2372 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2373 if (!get_cmsg_data_space(msg, cmsgh, &space))
2374 return -1;
2375 if (space >= cmsg_data_len) {
2376 *data_len = cmsg_data_len;
2377 return 0;
2378 }
2379 *data_len = space;
2380 return 1;
2381}
2382#endif /* CMSG_LEN */
2383
2384
Victor Stinner31bf2d52015-04-01 21:57:09 +02002385struct sock_accept {
2386 socklen_t *addrlen;
2387 sock_addr_t *addrbuf;
2388 SOCKET_T result;
2389};
2390
2391#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2392/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2393static int accept4_works = -1;
2394#endif
2395
2396static int
2397sock_accept_impl(PySocketSockObject *s, void *data)
2398{
2399 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002400 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2401 socklen_t *paddrlen = ctx->addrlen;
2402#ifdef HAVE_SOCKADDR_ALG
2403 /* AF_ALG does not support accept() with addr and raises
2404 * ECONNABORTED instead. */
2405 if (s->sock_family == AF_ALG) {
2406 addr = NULL;
2407 paddrlen = NULL;
2408 *ctx->addrlen = 0;
2409 }
2410#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002411
2412#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2413 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002414 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002415 SOCK_CLOEXEC);
2416 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2417 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2418 accept4_works = (errno != ENOSYS);
2419 }
2420 }
2421 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002422 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002423#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002424 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002425#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002426
2427#ifdef MS_WINDOWS
2428 return (ctx->result != INVALID_SOCKET);
2429#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002430 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002431#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002432}
2433
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002434/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002435
Guido van Rossum73624e91994-10-10 17:59:00 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002440 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 socklen_t addrlen;
2442 PyObject *sock = NULL;
2443 PyObject *addr = NULL;
2444 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002445 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (!getsockaddrlen(s, &addrlen))
2448 return NULL;
2449 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (!IS_SELECTABLE(s))
2452 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002453
Victor Stinner31bf2d52015-04-01 21:57:09 +02002454 ctx.addrlen = &addrlen;
2455 ctx.addrbuf = &addrbuf;
2456 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002458 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002459
Victor Stinnerdaf45552013-08-28 00:53:59 +02002460#ifdef MS_WINDOWS
2461 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2462 PyErr_SetFromWindowsErr(0);
2463 SOCKETCLOSE(newfd);
2464 goto finally;
2465 }
2466#else
2467
2468#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2469 if (!accept4_works)
2470#endif
2471 {
2472 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2473 SOCKETCLOSE(newfd);
2474 goto finally;
2475 }
2476 }
2477#endif
2478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 sock = PyLong_FromSocket_t(newfd);
2480 if (sock == NULL) {
2481 SOCKETCLOSE(newfd);
2482 goto finally;
2483 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2486 addrlen, s->sock_proto);
2487 if (addr == NULL)
2488 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002491
Guido van Rossum67f7a382002-06-06 21:08:16 +00002492finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 Py_XDECREF(sock);
2494 Py_XDECREF(addr);
2495 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002496}
2497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002498PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002499"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002500\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002501Wait for an incoming connection. Return a new socket file descriptor\n\
2502representing the connection, and the address of the client.\n\
2503For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002504
Guido van Rossum11ba0942002-06-13 15:07:44 +00002505/* s.setblocking(flag) method. Argument:
2506 False -- non-blocking mode; same as settimeout(0)
2507 True -- blocking mode; same as settimeout(None)
2508*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002509
Guido van Rossum73624e91994-10-10 17:59:00 +00002510static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002511sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002512{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002513 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 block = PyLong_AsLong(arg);
2516 if (block == -1 && PyErr_Occurred())
2517 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Victor Stinner9001d802015-04-06 23:06:01 +02002519 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002520 if (internal_setblocking(s, block) == -1) {
2521 return NULL;
2522 }
2523 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002524}
Guido van Rossume4485b01994-09-07 14:32:49 +00002525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002526PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002527"setblocking(flag)\n\
2528\n\
2529Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002530setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002531setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002532
Yury Selivanovf11b4602018-01-28 17:27:38 -05002533/* s.getblocking() method.
2534 Returns True if socket is in blocking mode,
2535 False if it is in non-blocking mode.
2536*/
2537static PyObject *
2538sock_getblocking(PySocketSockObject *s)
2539{
2540 if (s->sock_timeout) {
2541 Py_RETURN_TRUE;
2542 }
2543 else {
2544 Py_RETURN_FALSE;
2545 }
2546}
2547
2548PyDoc_STRVAR(getblocking_doc,
2549"getblocking()\n\
2550\n\
2551Returns True if socket is in blocking mode, or False if it\n\
2552is in non-blocking mode.");
2553
Victor Stinner71694d52015-03-28 01:18:54 +01002554static int
2555socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2556{
2557#ifdef MS_WINDOWS
2558 struct timeval tv;
2559#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002560#ifndef HAVE_POLL
2561 _PyTime_t ms;
2562#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002563 int overflow = 0;
2564
2565 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002566 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002567 return 0;
2568 }
2569
Victor Stinner869e1772015-03-30 03:49:14 +02002570 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002571 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002572 return -1;
2573
2574 if (*timeout < 0) {
2575 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2576 return -1;
2577 }
2578
2579#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002580 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002581#endif
2582#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002583 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002584 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002585#endif
2586 if (overflow) {
2587 PyErr_SetString(PyExc_OverflowError,
2588 "timeout doesn't fit into C timeval");
2589 return -1;
2590 }
2591
2592 return 0;
2593}
2594
Guido van Rossum11ba0942002-06-13 15:07:44 +00002595/* s.settimeout(timeout) method. Argument:
2596 None -- no timeout, blocking mode; same as setblocking(True)
2597 0.0 -- non-blocking mode; same as setblocking(False)
2598 > 0 -- timeout mode; operations time out after timeout seconds
2599 < 0 -- illegal; raises an exception
2600*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002601static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002602sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002603{
Victor Stinner71694d52015-03-28 01:18:54 +01002604 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002605
Victor Stinner71694d52015-03-28 01:18:54 +01002606 if (socket_parse_timeout(&timeout, arg) < 0)
2607 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002610
2611 int block = timeout < 0;
2612 /* Blocking mode for a Python socket object means that operations
2613 like :meth:`recv` or :meth:`sendall` will block the execution of
2614 the current thread until they are complete or aborted with a
2615 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2616 the underlying FD is in a blocking mode. When timeout is a positive
2617 number, the FD is in a non-blocking mode, and socket ops are
2618 implemented with a `select()` call.
2619
2620 When timeout is 0.0, the FD is in a non-blocking mode.
2621
2622 This table summarizes all states in which the socket object and
2623 its underlying FD can be:
2624
2625 ==================== ===================== ==============
2626 `gettimeout()` `getblocking()` FD
2627 ==================== ===================== ==============
2628 ``None`` ``True`` blocking
2629 ``0.0`` ``False`` non-blocking
2630 ``> 0`` ``True`` non-blocking
2631 */
2632
2633 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002634 return NULL;
2635 }
2636 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637}
2638
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002639PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002640"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002641\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002642Set a timeout on socket operations. 'timeout' can be a float,\n\
2643giving in seconds, or None. Setting a timeout of None disables\n\
2644the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002645Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002646
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002647/* s.gettimeout() method.
2648 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002650sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002651{
Victor Stinner71694d52015-03-28 01:18:54 +01002652 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002653 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 }
Victor Stinner71694d52015-03-28 01:18:54 +01002655 else {
2656 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2657 return PyFloat_FromDouble(seconds);
2658 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002659}
2660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002661PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002662"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002663\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002664Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002666operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002667
Guido van Rossumaee08791992-09-08 09:05:33 +00002668/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002669 With an integer third argument, sets an integer optval with optlen=4.
2670 With None as third argument and an integer fourth argument, set
2671 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002672 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002673 use optional built-in module 'struct' to encode the string.
2674*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002675
Guido van Rossum73624e91994-10-10 17:59:00 +00002676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002677sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 int level;
2680 int optname;
2681 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002682 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002684 unsigned int optlen;
2685 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002686
caaveryeffc12f2017-09-06 18:18:10 -04002687#ifdef AF_VSOCK
2688 if (s->sock_family == AF_VSOCK) {
2689 uint64_t vflag; // Must be set width of 64 bits
2690 /* setsockopt(level, opt, flag) */
2691 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2692 &level, &optname, &vflag)) {
2693 // level should always be set to AF_VSOCK
2694 res = setsockopt(s->sock_fd, level, optname,
2695 (void*)&vflag, sizeof vflag);
2696 goto done;
2697 }
2698 return NULL;
2699 }
2700#endif
2701
Christian Heimesdffa3942016-09-05 23:54:41 +02002702 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 if (PyArg_ParseTuple(args, "iii:setsockopt",
2704 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002705 res = setsockopt(s->sock_fd, level, optname,
2706 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002707 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002709
2710 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002711 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002712 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2713 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2714 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002715 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002716 NULL, (socklen_t)optlen);
2717 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002719
2720 PyErr_Clear();
2721 /* setsockopt(level, opt, buffer) */
2722 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2723 &level, &optname, &optval))
2724 return NULL;
2725
2726#ifdef MS_WINDOWS
2727 if (optval.len > INT_MAX) {
2728 PyBuffer_Release(&optval);
2729 PyErr_Format(PyExc_OverflowError,
2730 "socket option is larger than %i bytes",
2731 INT_MAX);
2732 return NULL;
2733 }
2734 res = setsockopt(s->sock_fd, level, optname,
2735 optval.buf, (int)optval.len);
2736#else
2737 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2738#endif
2739 PyBuffer_Release(&optval);
2740
2741done:
Victor Stinnercc739322016-03-23 21:35:29 +01002742 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002744 }
2745
2746 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002747}
2748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002749PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002750"setsockopt(level, option, value: int)\n\
2751setsockopt(level, option, value: buffer)\n\
2752setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753\n\
2754Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002755The value argument can either be an integer, a string buffer, or \n\
2756None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002758
Guido van Rossumaee08791992-09-08 09:05:33 +00002759/* s.getsockopt() method.
2760 With two arguments, retrieves an integer option.
2761 With a third integer argument, retrieves a string buffer of that size;
2762 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002763
Guido van Rossum73624e91994-10-10 17:59:00 +00002764static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002765sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 int level;
2768 int optname;
2769 int res;
2770 PyObject *buf;
2771 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002772 int flag = 0;
2773 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2776 &level, &optname, &buflen))
2777 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002780#ifdef AF_VSOCK
2781 if (s->sock_family == AF_VSOCK) {
2782 uint64_t vflag = 0; // Must be set width of 64 bits
2783 flagsize = sizeof vflag;
2784 res = getsockopt(s->sock_fd, level, optname,
2785 (void *)&vflag, &flagsize);
2786 if (res < 0)
2787 return s->errorhandler();
2788 return PyLong_FromUnsignedLong(vflag);
2789 }
2790#endif
2791 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 res = getsockopt(s->sock_fd, level, optname,
2793 (void *)&flag, &flagsize);
2794 if (res < 0)
2795 return s->errorhandler();
2796 return PyLong_FromLong(flag);
2797 }
caaveryeffc12f2017-09-06 18:18:10 -04002798#ifdef AF_VSOCK
2799 if (s->sock_family == AF_VSOCK) {
2800 PyErr_SetString(PyExc_OSError,
2801 "getsockopt string buffer not allowed");
2802 return NULL;
2803 }
2804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002806 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 "getsockopt buflen out of range");
2808 return NULL;
2809 }
2810 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2811 if (buf == NULL)
2812 return NULL;
2813 res = getsockopt(s->sock_fd, level, optname,
2814 (void *)PyBytes_AS_STRING(buf), &buflen);
2815 if (res < 0) {
2816 Py_DECREF(buf);
2817 return s->errorhandler();
2818 }
2819 _PyBytes_Resize(&buf, buflen);
2820 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002821}
2822
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002823PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002824"getsockopt(level, option[, buffersize]) -> value\n\
2825\n\
2826Get a socket option. See the Unix manual for level and option.\n\
2827If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002828string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002829
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002830
Fred Drake728819a2000-07-01 03:40:12 +00002831/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002832
Guido van Rossum73624e91994-10-10 17:59:00 +00002833static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002834sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 sock_addr_t addrbuf;
2837 int addrlen;
2838 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2841 return NULL;
2842 Py_BEGIN_ALLOW_THREADS
2843 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2844 Py_END_ALLOW_THREADS
2845 if (res < 0)
2846 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002847 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002848}
2849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002850PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002851"bind(address)\n\
2852\n\
2853Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002854pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002855sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002856
Guido van Rossum30a685f1991-06-27 15:51:29 +00002857
2858/* s.close() method.
2859 Set the file descriptor to -1 so operations tried subsequently
2860 will surely fail. */
2861
Guido van Rossum73624e91994-10-10 17:59:00 +00002862static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002863sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002866 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002867
Victor Stinner19a8e842016-03-21 16:36:48 +01002868 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002869 if (fd != INVALID_SOCKET) {
2870 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002871
2872 /* We do not want to retry upon EINTR: see
2873 http://lwn.net/Articles/576478/ and
2874 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2875 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002877 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002879 /* bpo-30319: The peer can already have closed the connection.
2880 Python ignores ECONNRESET on close(). */
2881 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002882 return s->errorhandler();
2883 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002885 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002886}
2887
Christian Heimesd0e31b92018-01-27 09:54:13 +01002888PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002889"close()\n\
2890\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002891Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002892
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002893static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002894sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002895{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002896 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002897 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002898 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002899}
2900
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002901PyDoc_STRVAR(detach_doc,
2902"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002903\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002904Close the socket object without closing the underlying file descriptor.\n\
2905The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002906can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002907
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002908static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002909sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002910{
Victor Stinner81c41db2015-04-02 11:50:57 +02002911 int err;
2912 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002913
Victor Stinner81c41db2015-04-02 11:50:57 +02002914 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2915 /* getsockopt() failed */
2916 return 0;
2917 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002918
Victor Stinner81c41db2015-04-02 11:50:57 +02002919 if (err == EISCONN)
2920 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002921 if (err != 0) {
2922 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2923 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002924 return 0;
2925 }
2926 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002927}
2928
2929static int
2930internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2931 int raise)
2932{
2933 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002934
2935 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002937 Py_END_ALLOW_THREADS
2938
Victor Stinner70a46f62015-03-31 22:03:59 +02002939 if (!res) {
2940 /* connect() succeeded, the socket is connected */
2941 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002943
Victor Stinner81c41db2015-04-02 11:50:57 +02002944 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002945
Victor Stinner81c41db2015-04-02 11:50:57 +02002946 /* save error, PyErr_CheckSignals() can replace it */
2947 err = GET_SOCK_ERROR;
2948 if (CHECK_ERRNO(EINTR)) {
2949 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002950 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002951
2952 /* Issue #23618: when connect() fails with EINTR, the connection is
2953 running asynchronously.
2954
2955 If the socket is blocking or has a timeout, wait until the
2956 connection completes, fails or timed out using select(), and then
2957 get the connection status using getsockopt(SO_ERROR).
2958
2959 If the socket is non-blocking, raise InterruptedError. The caller is
2960 responsible to wait until the connection completes, fails or timed
2961 out (it's the case in asyncio for example). */
2962 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2963 }
2964 else {
2965 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2966 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002967 }
2968
Victor Stinner81c41db2015-04-02 11:50:57 +02002969 if (!wait_connect) {
2970 if (raise) {
2971 /* restore error, maybe replaced by PyErr_CheckSignals() */
2972 SET_SOCK_ERROR(err);
2973 s->errorhandler();
2974 return -1;
2975 }
2976 else
2977 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002978 }
2979
Victor Stinner81c41db2015-04-02 11:50:57 +02002980 if (raise) {
2981 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002982 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2983 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002984 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002985 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002986 else {
2987 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002988 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2989 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002990 return err;
2991 }
2992 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002993}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002994
Fred Drake728819a2000-07-01 03:40:12 +00002995/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002996
Guido van Rossum73624e91994-10-10 17:59:00 +00002997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002998sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 sock_addr_t addrbuf;
3001 int addrlen;
3002 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3005 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003006
Victor Stinner81c41db2015-04-02 11:50:57 +02003007 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003008 if (res < 0)
3009 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003010
Victor Stinneree699e92015-03-31 21:28:42 +02003011 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003012}
3013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003014PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003015"connect(address)\n\
3016\n\
3017Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003019
Guido van Rossum30a685f1991-06-27 15:51:29 +00003020
Fred Drake728819a2000-07-01 03:40:12 +00003021/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003022
3023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003024sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 sock_addr_t addrbuf;
3027 int addrlen;
3028 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3031 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003032
Victor Stinner81c41db2015-04-02 11:50:57 +02003033 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003034 if (res < 0)
3035 return NULL;
3036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003038}
3039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003040PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003041"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003042\n\
3043This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003044instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003045
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003046
Guido van Rossumed233a51992-06-23 09:07:03 +00003047/* s.fileno() method */
3048
Guido van Rossum73624e91994-10-10 17:59:00 +00003049static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003050sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003053}
3054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003055PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003056"fileno() -> integer\n\
3057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003058Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003059
Guido van Rossumed233a51992-06-23 09:07:03 +00003060
Guido van Rossumc89705d1992-11-26 08:54:07 +00003061/* s.getsockname() method */
3062
Guido van Rossum73624e91994-10-10 17:59:00 +00003063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003064sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 sock_addr_t addrbuf;
3067 int res;
3068 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (!getsockaddrlen(s, &addrlen))
3071 return NULL;
3072 memset(&addrbuf, 0, addrlen);
3073 Py_BEGIN_ALLOW_THREADS
3074 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3075 Py_END_ALLOW_THREADS
3076 if (res < 0)
3077 return s->errorhandler();
3078 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3079 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003080}
3081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003083"getsockname() -> address info\n\
3084\n\
3085Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003086info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003087
Guido van Rossumc89705d1992-11-26 08:54:07 +00003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003090/* s.getpeername() method */
3091
Guido van Rossum73624e91994-10-10 17:59:00 +00003092static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003093sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 sock_addr_t addrbuf;
3096 int res;
3097 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 if (!getsockaddrlen(s, &addrlen))
3100 return NULL;
3101 memset(&addrbuf, 0, addrlen);
3102 Py_BEGIN_ALLOW_THREADS
3103 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3104 Py_END_ALLOW_THREADS
3105 if (res < 0)
3106 return s->errorhandler();
3107 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3108 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003109}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003112"getpeername() -> address info\n\
3113\n\
3114Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003115info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003116
Guido van Rossumb6775db1994-08-01 11:34:53 +00003117#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003118
3119
Guido van Rossum30a685f1991-06-27 15:51:29 +00003120/* s.listen(n) method */
3121
Guido van Rossum73624e91994-10-10 17:59:00 +00003122static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003123sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003124{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003125 /* We try to choose a default backlog high enough to avoid connection drops
3126 * for common workloads, yet not too high to limit resource usage. */
3127 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003129
Charles-François Natali644b8f52014-05-22 19:45:39 +01003130 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003134 /* To avoid problems on systems that don't allow a negative backlog
3135 * (which doesn't make sense anyway) we force a minimum value of 0. */
3136 if (backlog < 0)
3137 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 res = listen(s->sock_fd, backlog);
3139 Py_END_ALLOW_THREADS
3140 if (res < 0)
3141 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003142 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003143}
3144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003145PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003146"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003147\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003148Enable a server to accept connections. If backlog is specified, it must be\n\
3149at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003150unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003151connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003152
Victor Stinner31bf2d52015-04-01 21:57:09 +02003153struct sock_recv {
3154 char *cbuf;
3155 Py_ssize_t len;
3156 int flags;
3157 Py_ssize_t result;
3158};
3159
3160static int
3161sock_recv_impl(PySocketSockObject *s, void *data)
3162{
3163 struct sock_recv *ctx = data;
3164
3165#ifdef MS_WINDOWS
3166 if (ctx->len > INT_MAX)
3167 ctx->len = INT_MAX;
3168 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3169#else
3170 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3171#endif
3172 return (ctx->result >= 0);
3173}
3174
Guido van Rossum82a5c661998-07-07 20:45:43 +00003175
Thomas Wouters477c8d52006-05-27 19:21:47 +00003176/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003177 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003178 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003179 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003180 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003181 * also possible that we return a number of bytes smaller than the request
3182 * bytes.
3183 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003184
Antoine Pitrou19467d22010-08-17 19:33:30 +00003185static Py_ssize_t
3186sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003187{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003188 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 if (!IS_SELECTABLE(s)) {
3191 select_error();
3192 return -1;
3193 }
3194 if (len == 0) {
3195 /* If 0 bytes were requested, do nothing. */
3196 return 0;
3197 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003198
Victor Stinner31bf2d52015-04-01 21:57:09 +02003199 ctx.cbuf = cbuf;
3200 ctx.len = len;
3201 ctx.flags = flags;
3202 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003204
3205 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003206}
3207
Guido van Rossum48a680c2001-03-02 06:34:14 +00003208
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003209/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003210
Guido van Rossum73624e91994-10-10 17:59:00 +00003211static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003212sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003213{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003214 Py_ssize_t recvlen, outlen;
3215 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003217
Antoine Pitrou19467d22010-08-17 19:33:30 +00003218 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 if (recvlen < 0) {
3222 PyErr_SetString(PyExc_ValueError,
3223 "negative buffersize in recv");
3224 return NULL;
3225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 /* Allocate a new string. */
3228 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3229 if (buf == NULL)
3230 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 /* Call the guts */
3233 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3234 if (outlen < 0) {
3235 /* An error occurred, release the string and return an
3236 error. */
3237 Py_DECREF(buf);
3238 return NULL;
3239 }
3240 if (outlen != recvlen) {
3241 /* We did not read as many bytes as we anticipated, resize the
3242 string if possible and be successful. */
3243 _PyBytes_Resize(&buf, outlen);
3244 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003247}
3248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003249PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003250"recv(buffersize[, flags]) -> data\n\
3251\n\
3252Receive up to buffersize bytes from the socket. For the optional flags\n\
3253argument, see the Unix manual. When no data is available, block until\n\
3254at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003255the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003256
Guido van Rossum30a685f1991-06-27 15:51:29 +00003257
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003258/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003259
Thomas Wouters477c8d52006-05-27 19:21:47 +00003260static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003261sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264
Antoine Pitrou19467d22010-08-17 19:33:30 +00003265 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 Py_buffer pbuf;
3267 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003268 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003271 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 &pbuf, &recvlen, &flags))
3273 return NULL;
3274 buf = pbuf.buf;
3275 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 if (recvlen < 0) {
3278 PyBuffer_Release(&pbuf);
3279 PyErr_SetString(PyExc_ValueError,
3280 "negative buffersize in recv_into");
3281 return NULL;
3282 }
3283 if (recvlen == 0) {
3284 /* If nbytes was not specified, use the buffer's length */
3285 recvlen = buflen;
3286 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 /* Check if the buffer is large enough */
3289 if (buflen < recvlen) {
3290 PyBuffer_Release(&pbuf);
3291 PyErr_SetString(PyExc_ValueError,
3292 "buffer too small for requested bytes");
3293 return NULL;
3294 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 /* Call the guts */
3297 readlen = sock_recv_guts(s, buf, recvlen, flags);
3298 if (readlen < 0) {
3299 /* Return an error. */
3300 PyBuffer_Release(&pbuf);
3301 return NULL;
3302 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 PyBuffer_Release(&pbuf);
3305 /* Return the number of bytes read. Note that we do not do anything
3306 special here in the case that readlen < recvlen. */
3307 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003308}
3309
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003310PyDoc_STRVAR(recv_into_doc,
3311"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003312\n\
3313A version of recv() that stores its data into a buffer rather than creating \n\
3314a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3315is not specified (or 0), receive up to the size available in the given buffer.\n\
3316\n\
3317See recv() for documentation about the flags.");
3318
Victor Stinner31bf2d52015-04-01 21:57:09 +02003319struct sock_recvfrom {
3320 char* cbuf;
3321 Py_ssize_t len;
3322 int flags;
3323 socklen_t *addrlen;
3324 sock_addr_t *addrbuf;
3325 Py_ssize_t result;
3326};
3327
3328static int
3329sock_recvfrom_impl(PySocketSockObject *s, void *data)
3330{
3331 struct sock_recvfrom *ctx = data;
3332
3333 memset(ctx->addrbuf, 0, *ctx->addrlen);
3334
3335#ifdef MS_WINDOWS
3336 if (ctx->len > INT_MAX)
3337 ctx->len = INT_MAX;
3338 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3339 SAS2SA(ctx->addrbuf), ctx->addrlen);
3340#else
3341 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3342 SAS2SA(ctx->addrbuf), ctx->addrlen);
3343#endif
3344 return (ctx->result >= 0);
3345}
3346
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347
3348/*
Christian Heimes99170a52007-12-19 02:07:34 +00003349 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3350 * into a char buffer. If you have any inc/def ref to do to the objects that
3351 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003352 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003353 * that it is also possible that we return a number of bytes smaller than the
3354 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003355 *
3356 * 'addr' is a return value for the address object. Note that you must decref
3357 * it yourself.
3358 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003359static Py_ssize_t
3360sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003365 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 if (!getsockaddrlen(s, &addrlen))
3370 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 if (!IS_SELECTABLE(s)) {
3373 select_error();
3374 return -1;
3375 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003376
Victor Stinner31bf2d52015-04-01 21:57:09 +02003377 ctx.cbuf = cbuf;
3378 ctx.len = len;
3379 ctx.flags = flags;
3380 ctx.addrbuf = &addrbuf;
3381 ctx.addrlen = &addrlen;
3382 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003384
Victor Stinner31bf2d52015-04-01 21:57:09 +02003385 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3386 s->sock_proto);
3387 if (*addr == NULL)
3388 return -1;
3389
3390 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003391}
3392
3393/* s.recvfrom(nbytes [,flags]) method */
3394
3395static PyObject *
3396sock_recvfrom(PySocketSockObject *s, PyObject *args)
3397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 PyObject *buf = NULL;
3399 PyObject *addr = NULL;
3400 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003401 int flags = 0;
3402 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003403
Antoine Pitrou19467d22010-08-17 19:33:30 +00003404 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 if (recvlen < 0) {
3408 PyErr_SetString(PyExc_ValueError,
3409 "negative buffersize in recvfrom");
3410 return NULL;
3411 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3414 if (buf == NULL)
3415 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3418 recvlen, flags, &addr);
3419 if (outlen < 0) {
3420 goto finally;
3421 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 if (outlen != recvlen) {
3424 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003425 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003427 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 goto finally;
3429 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003432
3433finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 Py_XDECREF(buf);
3435 Py_XDECREF(addr);
3436 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003437}
3438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003439PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003440"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3441\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003442Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003443
Thomas Wouters477c8d52006-05-27 19:21:47 +00003444
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003445/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003446
3447static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003448sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003451
Antoine Pitrou19467d22010-08-17 19:33:30 +00003452 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 Py_buffer pbuf;
3454 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003455 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003458
Antoine Pitrou19467d22010-08-17 19:33:30 +00003459 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 kwlist, &pbuf,
3461 &recvlen, &flags))
3462 return NULL;
3463 buf = pbuf.buf;
3464 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 if (recvlen < 0) {
3467 PyBuffer_Release(&pbuf);
3468 PyErr_SetString(PyExc_ValueError,
3469 "negative buffersize in recvfrom_into");
3470 return NULL;
3471 }
3472 if (recvlen == 0) {
3473 /* If nbytes was not specified, use the buffer's length */
3474 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003475 } else if (recvlen > buflen) {
3476 PyBuffer_Release(&pbuf);
3477 PyErr_SetString(PyExc_ValueError,
3478 "nbytes is greater than the length of the buffer");
3479 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3483 if (readlen < 0) {
3484 PyBuffer_Release(&pbuf);
3485 /* Return an error */
3486 Py_XDECREF(addr);
3487 return NULL;
3488 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 PyBuffer_Release(&pbuf);
3491 /* Return the number of bytes read and the address. Note that we do
3492 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003493 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003494}
3495
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003496PyDoc_STRVAR(recvfrom_into_doc,
3497"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003498\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003499Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003500
Victor Stinner35bee932015-04-02 12:28:07 +02003501/* The sendmsg() and recvmsg[_into]() methods require a working
3502 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3503#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003504struct sock_recvmsg {
3505 struct msghdr *msg;
3506 int flags;
3507 ssize_t result;
3508};
3509
3510static int
3511sock_recvmsg_impl(PySocketSockObject *s, void *data)
3512{
3513 struct sock_recvmsg *ctx = data;
3514
3515 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3516 return (ctx->result >= 0);
3517}
3518
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003519/*
3520 * Call recvmsg() with the supplied iovec structures, flags, and
3521 * ancillary data buffer size (controllen). Returns the tuple return
3522 * value for recvmsg() or recvmsg_into(), with the first item provided
3523 * by the supplied makeval() function. makeval() will be called with
3524 * the length read and makeval_data as arguments, and must return a
3525 * new reference (which will be decrefed if there is a subsequent
3526 * error). On error, closes any file descriptors received via
3527 * SCM_RIGHTS.
3528 */
3529static PyObject *
3530sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3531 int flags, Py_ssize_t controllen,
3532 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3533{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003534 sock_addr_t addrbuf;
3535 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003536 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003537 PyObject *cmsg_list = NULL, *retval = NULL;
3538 void *controlbuf = NULL;
3539 struct cmsghdr *cmsgh;
3540 size_t cmsgdatalen = 0;
3541 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003542 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543
3544 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3545 ignored" when the socket is connected (Linux fills them in
3546 anyway for AF_UNIX sockets at least). Normally msg_namelen
3547 seems to be set to 0 if there's no address, but try to
3548 initialize msg_name to something that won't be mistaken for a
3549 real address if that doesn't happen. */
3550 if (!getsockaddrlen(s, &addrbuflen))
3551 return NULL;
3552 memset(&addrbuf, 0, addrbuflen);
3553 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3554
3555 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3556 PyErr_SetString(PyExc_ValueError,
3557 "invalid ancillary data buffer length");
3558 return NULL;
3559 }
3560 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3561 return PyErr_NoMemory();
3562
3563 /* Make the system call. */
3564 if (!IS_SELECTABLE(s)) {
3565 select_error();
3566 goto finally;
3567 }
3568
Victor Stinner31bf2d52015-04-01 21:57:09 +02003569 msg.msg_name = SAS2SA(&addrbuf);
3570 msg.msg_namelen = addrbuflen;
3571 msg.msg_iov = iov;
3572 msg.msg_iovlen = iovlen;
3573 msg.msg_control = controlbuf;
3574 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003575
Victor Stinner31bf2d52015-04-01 21:57:09 +02003576 ctx.msg = &msg;
3577 ctx.flags = flags;
3578 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003579 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003580
3581 /* Make list of (level, type, data) tuples from control messages. */
3582 if ((cmsg_list = PyList_New(0)) == NULL)
3583 goto err_closefds;
3584 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3585 implementations didn't do so. */
3586 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3587 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3588 PyObject *bytes, *tuple;
3589 int tmp;
3590
3591 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3592 if (cmsg_status != 0) {
3593 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3594 "received malformed or improperly-truncated "
3595 "ancillary data", 1) == -1)
3596 goto err_closefds;
3597 }
3598 if (cmsg_status < 0)
3599 break;
3600 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003601 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003602 goto err_closefds;
3603 }
3604
3605 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3606 cmsgdatalen);
3607 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3608 (int)cmsgh->cmsg_type, bytes);
3609 if (tuple == NULL)
3610 goto err_closefds;
3611 tmp = PyList_Append(cmsg_list, tuple);
3612 Py_DECREF(tuple);
3613 if (tmp != 0)
3614 goto err_closefds;
3615
3616 if (cmsg_status != 0)
3617 break;
3618 }
3619
3620 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003621 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003622 cmsg_list,
3623 (int)msg.msg_flags,
3624 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3625 ((msg.msg_namelen > addrbuflen) ?
3626 addrbuflen : msg.msg_namelen),
3627 s->sock_proto));
3628 if (retval == NULL)
3629 goto err_closefds;
3630
3631finally:
3632 Py_XDECREF(cmsg_list);
3633 PyMem_Free(controlbuf);
3634 return retval;
3635
3636err_closefds:
3637#ifdef SCM_RIGHTS
3638 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3639 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3640 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3641 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3642 if (cmsg_status < 0)
3643 break;
3644 if (cmsgh->cmsg_level == SOL_SOCKET &&
3645 cmsgh->cmsg_type == SCM_RIGHTS) {
3646 size_t numfds;
3647 int *fdp;
3648
3649 numfds = cmsgdatalen / sizeof(int);
3650 fdp = (int *)CMSG_DATA(cmsgh);
3651 while (numfds-- > 0)
3652 close(*fdp++);
3653 }
3654 if (cmsg_status != 0)
3655 break;
3656 }
3657#endif /* SCM_RIGHTS */
3658 goto finally;
3659}
3660
3661
3662static PyObject *
3663makeval_recvmsg(ssize_t received, void *data)
3664{
3665 PyObject **buf = data;
3666
3667 if (received < PyBytes_GET_SIZE(*buf))
3668 _PyBytes_Resize(buf, received);
3669 Py_XINCREF(*buf);
3670 return *buf;
3671}
3672
3673/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3674
3675static PyObject *
3676sock_recvmsg(PySocketSockObject *s, PyObject *args)
3677{
3678 Py_ssize_t bufsize, ancbufsize = 0;
3679 int flags = 0;
3680 struct iovec iov;
3681 PyObject *buf = NULL, *retval = NULL;
3682
3683 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3684 return NULL;
3685
3686 if (bufsize < 0) {
3687 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3688 return NULL;
3689 }
3690 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3691 return NULL;
3692 iov.iov_base = PyBytes_AS_STRING(buf);
3693 iov.iov_len = bufsize;
3694
3695 /* Note that we're passing a pointer to *our pointer* to the bytes
3696 object here (&buf); makeval_recvmsg() may incref the object, or
3697 deallocate it and set our pointer to NULL. */
3698 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3699 &makeval_recvmsg, &buf);
3700 Py_XDECREF(buf);
3701 return retval;
3702}
3703
3704PyDoc_STRVAR(recvmsg_doc,
3705"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3706\n\
3707Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3708socket. The ancbufsize argument sets the size in bytes of the\n\
3709internal buffer used to receive the ancillary data; it defaults to 0,\n\
3710meaning that no ancillary data will be received. Appropriate buffer\n\
3711sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3712CMSG_LEN(), and items which do not fit into the buffer might be\n\
3713truncated or discarded. The flags argument defaults to 0 and has the\n\
3714same meaning as for recv().\n\
3715\n\
3716The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3717The data item is a bytes object holding the non-ancillary data\n\
3718received. The ancdata item is a list of zero or more tuples\n\
3719(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3720(control messages) received: cmsg_level and cmsg_type are integers\n\
3721specifying the protocol level and protocol-specific type respectively,\n\
3722and cmsg_data is a bytes object holding the associated data. The\n\
3723msg_flags item is the bitwise OR of various flags indicating\n\
3724conditions on the received message; see your system documentation for\n\
3725details. If the receiving socket is unconnected, address is the\n\
3726address of the sending socket, if available; otherwise, its value is\n\
3727unspecified.\n\
3728\n\
3729If recvmsg() raises an exception after the system call returns, it\n\
3730will first attempt to close any file descriptors received via the\n\
3731SCM_RIGHTS mechanism.");
3732
3733
3734static PyObject *
3735makeval_recvmsg_into(ssize_t received, void *data)
3736{
3737 return PyLong_FromSsize_t(received);
3738}
3739
3740/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3741
3742static PyObject *
3743sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3744{
3745 Py_ssize_t ancbufsize = 0;
3746 int flags = 0;
3747 struct iovec *iovs = NULL;
3748 Py_ssize_t i, nitems, nbufs = 0;
3749 Py_buffer *bufs = NULL;
3750 PyObject *buffers_arg, *fast, *retval = NULL;
3751
3752 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3753 &buffers_arg, &ancbufsize, &flags))
3754 return NULL;
3755
3756 if ((fast = PySequence_Fast(buffers_arg,
3757 "recvmsg_into() argument 1 must be an "
3758 "iterable")) == NULL)
3759 return NULL;
3760 nitems = PySequence_Fast_GET_SIZE(fast);
3761 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003762 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 goto finally;
3764 }
3765
3766 /* Fill in an iovec for each item, and save the Py_buffer
3767 structs to release afterwards. */
3768 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3769 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3770 PyErr_NoMemory();
3771 goto finally;
3772 }
3773 for (; nbufs < nitems; nbufs++) {
3774 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3775 "w*;recvmsg_into() argument 1 must be an iterable "
3776 "of single-segment read-write buffers",
3777 &bufs[nbufs]))
3778 goto finally;
3779 iovs[nbufs].iov_base = bufs[nbufs].buf;
3780 iovs[nbufs].iov_len = bufs[nbufs].len;
3781 }
3782
3783 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3784 &makeval_recvmsg_into, NULL);
3785finally:
3786 for (i = 0; i < nbufs; i++)
3787 PyBuffer_Release(&bufs[i]);
3788 PyMem_Free(bufs);
3789 PyMem_Free(iovs);
3790 Py_DECREF(fast);
3791 return retval;
3792}
3793
3794PyDoc_STRVAR(recvmsg_into_doc,
3795"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3796\n\
3797Receive normal data and ancillary data from the socket, scattering the\n\
3798non-ancillary data into a series of buffers. The buffers argument\n\
3799must be an iterable of objects that export writable buffers\n\
3800(e.g. bytearray objects); these will be filled with successive chunks\n\
3801of the non-ancillary data until it has all been written or there are\n\
3802no more buffers. The ancbufsize argument sets the size in bytes of\n\
3803the internal buffer used to receive the ancillary data; it defaults to\n\
38040, meaning that no ancillary data will be received. Appropriate\n\
3805buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3806or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3807truncated or discarded. The flags argument defaults to 0 and has the\n\
3808same meaning as for recv().\n\
3809\n\
3810The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3811The nbytes item is the total number of bytes of non-ancillary data\n\
3812written into the buffers. The ancdata item is a list of zero or more\n\
3813tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3814data (control messages) received: cmsg_level and cmsg_type are\n\
3815integers specifying the protocol level and protocol-specific type\n\
3816respectively, and cmsg_data is a bytes object holding the associated\n\
3817data. The msg_flags item is the bitwise OR of various flags\n\
3818indicating conditions on the received message; see your system\n\
3819documentation for details. If the receiving socket is unconnected,\n\
3820address is the address of the sending socket, if available; otherwise,\n\
3821its value is unspecified.\n\
3822\n\
3823If recvmsg_into() raises an exception after the system call returns,\n\
3824it will first attempt to close any file descriptors received via the\n\
3825SCM_RIGHTS mechanism.");
3826#endif /* CMSG_LEN */
3827
3828
Victor Stinner31bf2d52015-04-01 21:57:09 +02003829struct sock_send {
3830 char *buf;
3831 Py_ssize_t len;
3832 int flags;
3833 Py_ssize_t result;
3834};
3835
3836static int
3837sock_send_impl(PySocketSockObject *s, void *data)
3838{
3839 struct sock_send *ctx = data;
3840
3841#ifdef MS_WINDOWS
3842 if (ctx->len > INT_MAX)
3843 ctx->len = INT_MAX;
3844 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3845#else
3846 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3847#endif
3848 return (ctx->result >= 0);
3849}
3850
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003851/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003852
Guido van Rossum73624e91994-10-10 17:59:00 +00003853static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003854sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003855{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003856 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003858 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003860 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3861 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003863 if (!IS_SELECTABLE(s)) {
3864 PyBuffer_Release(&pbuf);
3865 return select_error();
3866 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003867 ctx.buf = pbuf.buf;
3868 ctx.len = pbuf.len;
3869 ctx.flags = flags;
3870 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003871 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 return NULL;
3873 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003874 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003875
3876 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003877}
3878
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003879PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003880"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003881\n\
3882Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003883argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003884sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003885
3886
3887/* s.sendall(data [,flags]) method */
3888
3889static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003890sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003893 Py_ssize_t len, n;
3894 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003896 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003897 int has_timeout = (s->sock_timeout > 0);
3898 _PyTime_t interval = s->sock_timeout;
3899 _PyTime_t deadline = 0;
3900 int deadline_initialized = 0;
3901 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3904 return NULL;
3905 buf = pbuf.buf;
3906 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003908 if (!IS_SELECTABLE(s)) {
3909 PyBuffer_Release(&pbuf);
3910 return select_error();
3911 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003914 if (has_timeout) {
3915 if (deadline_initialized) {
3916 /* recompute the timeout */
3917 interval = deadline - _PyTime_GetMonotonicClock();
3918 }
3919 else {
3920 deadline_initialized = 1;
3921 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3922 }
3923
3924 if (interval <= 0) {
3925 PyErr_SetString(socket_timeout, "timed out");
3926 goto done;
3927 }
3928 }
3929
Victor Stinner02f32ab2015-04-01 22:53:26 +02003930 ctx.buf = buf;
3931 ctx.len = len;
3932 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003933 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3934 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003935 n = ctx.result;
3936 assert(n >= 0);
3937
3938 buf += n;
3939 len -= n;
3940
3941 /* We must run our signal handlers before looping again.
3942 send() can return a successful partial write when it is
3943 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003944 if (PyErr_CheckSignals())
3945 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003946 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003948
Victor Stinner8912d142015-04-06 23:16:34 +02003949 Py_INCREF(Py_None);
3950 res = Py_None;
3951
3952done:
3953 PyBuffer_Release(&pbuf);
3954 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003955}
3956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003957PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003958"sendall(data[, flags])\n\
3959\n\
3960Send a data string to the socket. For the optional flags\n\
3961argument, see the Unix manual. This calls send() repeatedly\n\
3962until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003963to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003964
Guido van Rossum30a685f1991-06-27 15:51:29 +00003965
Victor Stinner31bf2d52015-04-01 21:57:09 +02003966struct sock_sendto {
3967 char *buf;
3968 Py_ssize_t len;
3969 int flags;
3970 int addrlen;
3971 sock_addr_t *addrbuf;
3972 Py_ssize_t result;
3973};
3974
3975static int
3976sock_sendto_impl(PySocketSockObject *s, void *data)
3977{
3978 struct sock_sendto *ctx = data;
3979
3980#ifdef MS_WINDOWS
3981 if (ctx->len > INT_MAX)
3982 ctx->len = INT_MAX;
3983 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3984 SAS2SA(ctx->addrbuf), ctx->addrlen);
3985#else
3986 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3987 SAS2SA(ctx->addrbuf), ctx->addrlen);
3988#endif
3989 return (ctx->result >= 0);
3990}
3991
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003992/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003993
Guido van Rossum73624e91994-10-10 17:59:00 +00003994static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003995sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 Py_buffer pbuf;
3998 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003999 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004001 int addrlen, flags;
4002 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004005 arglen = PyTuple_Size(args);
4006 switch (arglen) {
4007 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004008 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4009 return NULL;
4010 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004011 break;
4012 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004013 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4014 &pbuf, &flags, &addro)) {
4015 return NULL;
4016 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004017 break;
4018 default:
4019 PyErr_Format(PyExc_TypeError,
4020 "sendto() takes 2 or 3 arguments (%d given)",
4021 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004022 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 if (!IS_SELECTABLE(s)) {
4026 PyBuffer_Release(&pbuf);
4027 return select_error();
4028 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4031 PyBuffer_Release(&pbuf);
4032 return NULL;
4033 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004034
Victor Stinner31bf2d52015-04-01 21:57:09 +02004035 ctx.buf = pbuf.buf;
4036 ctx.len = pbuf.len;
4037 ctx.flags = flags;
4038 ctx.addrlen = addrlen;
4039 ctx.addrbuf = &addrbuf;
4040 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004041 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 return NULL;
4043 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004044 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004045
4046 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004047}
4048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004049PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004050"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004051\n\
4052Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004053For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004054
Guido van Rossum30a685f1991-06-27 15:51:29 +00004055
Victor Stinner35bee932015-04-02 12:28:07 +02004056/* The sendmsg() and recvmsg[_into]() methods require a working
4057 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4058#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004059struct sock_sendmsg {
4060 struct msghdr *msg;
4061 int flags;
4062 ssize_t result;
4063};
4064
4065static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004066sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4067 struct msghdr *msg,
4068 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4069 Py_ssize_t ndataparts, ndatabufs = 0;
4070 int result = -1;
4071 struct iovec *iovs = NULL;
4072 PyObject *data_fast = NULL;
4073 Py_buffer *databufs = NULL;
4074
4075 /* Fill in an iovec for each message part, and save the Py_buffer
4076 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004077 data_fast = PySequence_Fast(data_arg,
4078 "sendmsg() argument 1 must be an "
4079 "iterable");
4080 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004081 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004082 }
4083
Christian Heimesdffa3942016-09-05 23:54:41 +02004084 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4085 if (ndataparts > INT_MAX) {
4086 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4087 goto finally;
4088 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004089
Christian Heimesdffa3942016-09-05 23:54:41 +02004090 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004091 if (ndataparts > 0) {
4092 iovs = PyMem_New(struct iovec, ndataparts);
4093 if (iovs == NULL) {
4094 PyErr_NoMemory();
4095 goto finally;
4096 }
4097 msg->msg_iov = iovs;
4098
4099 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004100 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004101 PyErr_NoMemory();
4102 goto finally;
4103 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004104 }
4105 for (; ndatabufs < ndataparts; ndatabufs++) {
4106 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4107 "y*;sendmsg() argument 1 must be an iterable of "
4108 "bytes-like objects",
4109 &databufs[ndatabufs]))
4110 goto finally;
4111 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4112 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4113 }
4114 result = 0;
4115 finally:
4116 *databufsout = databufs;
4117 *ndatabufsout = ndatabufs;
4118 Py_XDECREF(data_fast);
4119 return result;
4120}
4121
4122static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004123sock_sendmsg_impl(PySocketSockObject *s, void *data)
4124{
4125 struct sock_sendmsg *ctx = data;
4126
4127 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4128 return (ctx->result >= 0);
4129}
4130
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004131/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4132
4133static PyObject *
4134sock_sendmsg(PySocketSockObject *s, PyObject *args)
4135{
Christian Heimesdffa3942016-09-05 23:54:41 +02004136 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004137 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004138 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004139 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004140 struct cmsginfo {
4141 int level;
4142 int type;
4143 Py_buffer data;
4144 } *cmsgs = NULL;
4145 void *controlbuf = NULL;
4146 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004147 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004148 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004149 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004150 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004151
4152 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004153 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004154 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004155 }
4156
4157 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004158
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004159 /* Parse destination address. */
4160 if (addr_arg != NULL && addr_arg != Py_None) {
4161 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4162 goto finally;
4163 msg.msg_name = &addrbuf;
4164 msg.msg_namelen = addrlen;
4165 }
4166
4167 /* Fill in an iovec for each message part, and save the Py_buffer
4168 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004169 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004170 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171 }
4172
4173 if (cmsg_arg == NULL)
4174 ncmsgs = 0;
4175 else {
4176 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4177 "sendmsg() argument 2 must be an "
4178 "iterable")) == NULL)
4179 goto finally;
4180 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4181 }
4182
4183#ifndef CMSG_SPACE
4184 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004185 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004186 "sending multiple control messages is not supported "
4187 "on this system");
4188 goto finally;
4189 }
4190#endif
4191 /* Save level, type and Py_buffer for each control message,
4192 and calculate total size. */
4193 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4194 PyErr_NoMemory();
4195 goto finally;
4196 }
4197 controllen = controllen_last = 0;
4198 while (ncmsgbufs < ncmsgs) {
4199 size_t bufsize, space;
4200
4201 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4202 "(iiy*):[sendmsg() ancillary data items]",
4203 &cmsgs[ncmsgbufs].level,
4204 &cmsgs[ncmsgbufs].type,
4205 &cmsgs[ncmsgbufs].data))
4206 goto finally;
4207 bufsize = cmsgs[ncmsgbufs++].data.len;
4208
4209#ifdef CMSG_SPACE
4210 if (!get_CMSG_SPACE(bufsize, &space)) {
4211#else
4212 if (!get_CMSG_LEN(bufsize, &space)) {
4213#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004214 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215 goto finally;
4216 }
4217 controllen += space;
4218 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004219 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004220 goto finally;
4221 }
4222 controllen_last = controllen;
4223 }
4224
4225 /* Construct ancillary data block from control message info. */
4226 if (ncmsgbufs > 0) {
4227 struct cmsghdr *cmsgh = NULL;
4228
Victor Stinner52d61e42016-09-12 11:41:58 +02004229 controlbuf = PyMem_Malloc(controllen);
4230 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004231 PyErr_NoMemory();
4232 goto finally;
4233 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004234 msg.msg_control = controlbuf;
4235
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004236 msg.msg_controllen = controllen;
4237
4238 /* Need to zero out the buffer as a workaround for glibc's
4239 CMSG_NXTHDR() implementation. After getting the pointer to
4240 the next header, it checks its (uninitialized) cmsg_len
4241 member to see if the "message" fits in the buffer, and
4242 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004243 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004244 memset(controlbuf, 0, controllen);
4245
4246 for (i = 0; i < ncmsgbufs; i++) {
4247 size_t msg_len, data_len = cmsgs[i].data.len;
4248 int enough_space = 0;
4249
4250 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4251 if (cmsgh == NULL) {
4252 PyErr_Format(PyExc_RuntimeError,
4253 "unexpected NULL result from %s()",
4254 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4255 goto finally;
4256 }
4257 if (!get_CMSG_LEN(data_len, &msg_len)) {
4258 PyErr_SetString(PyExc_RuntimeError,
4259 "item size out of range for CMSG_LEN()");
4260 goto finally;
4261 }
4262 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4263 size_t space;
4264
4265 cmsgh->cmsg_len = msg_len;
4266 if (get_cmsg_data_space(&msg, cmsgh, &space))
4267 enough_space = (space >= data_len);
4268 }
4269 if (!enough_space) {
4270 PyErr_SetString(PyExc_RuntimeError,
4271 "ancillary data does not fit in calculated "
4272 "space");
4273 goto finally;
4274 }
4275 cmsgh->cmsg_level = cmsgs[i].level;
4276 cmsgh->cmsg_type = cmsgs[i].type;
4277 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4278 }
4279 }
4280
4281 /* Make the system call. */
4282 if (!IS_SELECTABLE(s)) {
4283 select_error();
4284 goto finally;
4285 }
4286
Victor Stinner31bf2d52015-04-01 21:57:09 +02004287 ctx.msg = &msg;
4288 ctx.flags = flags;
4289 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004290 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004291
4292 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004293
4294finally:
4295 PyMem_Free(controlbuf);
4296 for (i = 0; i < ncmsgbufs; i++)
4297 PyBuffer_Release(&cmsgs[i].data);
4298 PyMem_Free(cmsgs);
4299 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004300 PyMem_Free(msg.msg_iov);
4301 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004302 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004303 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004304 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004305 return retval;
4306}
4307
4308PyDoc_STRVAR(sendmsg_doc,
4309"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4310\n\
4311Send normal and ancillary data to the socket, gathering the\n\
4312non-ancillary data from a series of buffers and concatenating it into\n\
4313a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004314data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004315The ancdata argument specifies the ancillary data (control messages)\n\
4316as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4317cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4318protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004319is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004320argument defaults to 0 and has the same meaning as for send(). If\n\
4321address is supplied and not None, it sets a destination address for\n\
4322the message. The return value is the number of bytes of non-ancillary\n\
4323data sent.");
4324#endif /* CMSG_LEN */
4325
Christian Heimesdffa3942016-09-05 23:54:41 +02004326#ifdef HAVE_SOCKADDR_ALG
4327static PyObject*
4328sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4329{
4330 PyObject *retval = NULL;
4331
4332 Py_ssize_t i, ndatabufs = 0;
4333 Py_buffer *databufs = NULL;
4334 PyObject *data_arg = NULL;
4335
4336 Py_buffer iv = {NULL, NULL};
4337
4338 PyObject *opobj = NULL;
4339 int op = -1;
4340
4341 PyObject *assoclenobj = NULL;
4342 int assoclen = -1;
4343
4344 unsigned int *uiptr;
4345 int flags = 0;
4346
4347 struct msghdr msg;
4348 struct cmsghdr *header = NULL;
4349 struct af_alg_iv *alg_iv = NULL;
4350 struct sock_sendmsg ctx;
4351 Py_ssize_t controllen;
4352 void *controlbuf = NULL;
4353 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4354
4355 if (self->sock_family != AF_ALG) {
4356 PyErr_SetString(PyExc_OSError,
4357 "algset is only supported for AF_ALG");
4358 return NULL;
4359 }
4360
4361 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4362 "|O$O!y*O!i:sendmsg_afalg", keywords,
4363 &data_arg,
4364 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004365 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004366 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004367 }
4368
4369 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004370
4371 /* op is a required, keyword-only argument >= 0 */
4372 if (opobj != NULL) {
4373 op = _PyLong_AsInt(opobj);
4374 }
4375 if (op < 0) {
4376 /* override exception from _PyLong_AsInt() */
4377 PyErr_SetString(PyExc_TypeError,
4378 "Invalid or missing argument 'op'");
4379 goto finally;
4380 }
4381 /* assoclen is optional but must be >= 0 */
4382 if (assoclenobj != NULL) {
4383 assoclen = _PyLong_AsInt(assoclenobj);
4384 if (assoclen == -1 && PyErr_Occurred()) {
4385 goto finally;
4386 }
4387 if (assoclen < 0) {
4388 PyErr_SetString(PyExc_TypeError,
4389 "assoclen must be positive");
4390 goto finally;
4391 }
4392 }
4393
4394 controllen = CMSG_SPACE(4);
4395 if (iv.buf != NULL) {
4396 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4397 }
4398 if (assoclen >= 0) {
4399 controllen += CMSG_SPACE(4);
4400 }
4401
4402 controlbuf = PyMem_Malloc(controllen);
4403 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004404 PyErr_NoMemory();
4405 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004406 }
4407 memset(controlbuf, 0, controllen);
4408
Christian Heimesdffa3942016-09-05 23:54:41 +02004409 msg.msg_controllen = controllen;
4410 msg.msg_control = controlbuf;
4411
4412 /* Fill in an iovec for each message part, and save the Py_buffer
4413 structs to release afterwards. */
4414 if (data_arg != NULL) {
4415 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4416 goto finally;
4417 }
4418 }
4419
4420 /* set operation to encrypt or decrypt */
4421 header = CMSG_FIRSTHDR(&msg);
4422 if (header == NULL) {
4423 PyErr_SetString(PyExc_RuntimeError,
4424 "unexpected NULL result from CMSG_FIRSTHDR");
4425 goto finally;
4426 }
4427 header->cmsg_level = SOL_ALG;
4428 header->cmsg_type = ALG_SET_OP;
4429 header->cmsg_len = CMSG_LEN(4);
4430 uiptr = (void*)CMSG_DATA(header);
4431 *uiptr = (unsigned int)op;
4432
4433 /* set initialization vector */
4434 if (iv.buf != NULL) {
4435 header = CMSG_NXTHDR(&msg, header);
4436 if (header == NULL) {
4437 PyErr_SetString(PyExc_RuntimeError,
4438 "unexpected NULL result from CMSG_NXTHDR(iv)");
4439 goto finally;
4440 }
4441 header->cmsg_level = SOL_ALG;
4442 header->cmsg_type = ALG_SET_IV;
4443 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4444 alg_iv = (void*)CMSG_DATA(header);
4445 alg_iv->ivlen = iv.len;
4446 memcpy(alg_iv->iv, iv.buf, iv.len);
4447 }
4448
4449 /* set length of associated data for AEAD */
4450 if (assoclen >= 0) {
4451 header = CMSG_NXTHDR(&msg, header);
4452 if (header == NULL) {
4453 PyErr_SetString(PyExc_RuntimeError,
4454 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4455 goto finally;
4456 }
4457 header->cmsg_level = SOL_ALG;
4458 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4459 header->cmsg_len = CMSG_LEN(4);
4460 uiptr = (void*)CMSG_DATA(header);
4461 *uiptr = (unsigned int)assoclen;
4462 }
4463
4464 ctx.msg = &msg;
4465 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004466 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004467 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004468 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004469
4470 retval = PyLong_FromSsize_t(ctx.result);
4471
4472 finally:
4473 PyMem_Free(controlbuf);
4474 if (iv.buf != NULL) {
4475 PyBuffer_Release(&iv);
4476 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004477 PyMem_Free(msg.msg_iov);
4478 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004479 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004480 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004481 PyMem_Free(databufs);
4482 return retval;
4483}
4484
4485PyDoc_STRVAR(sendmsg_afalg_doc,
4486"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4487\n\
4488Set operation mode, IV and length of associated data for an AF_ALG\n\
4489operation socket.");
4490#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004491
Guido van Rossum30a685f1991-06-27 15:51:29 +00004492/* s.shutdown(how) method */
4493
Guido van Rossum73624e91994-10-10 17:59:00 +00004494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004495sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 int how;
4498 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004499
Serhiy Storchaka78980432013-01-15 01:12:17 +02004500 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (how == -1 && PyErr_Occurred())
4502 return NULL;
4503 Py_BEGIN_ALLOW_THREADS
4504 res = shutdown(s->sock_fd, how);
4505 Py_END_ALLOW_THREADS
4506 if (res < 0)
4507 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004508 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004509}
4510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004511PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004512"shutdown(flag)\n\
4513\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004514Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4515of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004516
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004517#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004518static PyObject*
4519sock_ioctl(PySocketSockObject *s, PyObject *arg)
4520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 unsigned long cmd = SIO_RCVALL;
4522 PyObject *argO;
4523 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4526 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 switch (cmd) {
4529 case SIO_RCVALL: {
4530 unsigned int option = RCVALL_ON;
4531 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4532 return NULL;
4533 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4534 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4535 return set_error();
4536 }
4537 return PyLong_FromUnsignedLong(recv); }
4538 case SIO_KEEPALIVE_VALS: {
4539 struct tcp_keepalive ka;
4540 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4541 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4542 return NULL;
4543 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4544 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4545 return set_error();
4546 }
4547 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004548#if defined(SIO_LOOPBACK_FAST_PATH)
4549 case SIO_LOOPBACK_FAST_PATH: {
4550 unsigned int option;
4551 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4552 return NULL;
4553 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4554 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4555 return set_error();
4556 }
4557 return PyLong_FromUnsignedLong(recv); }
4558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 default:
4560 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4561 return NULL;
4562 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004563}
4564PyDoc_STRVAR(sock_ioctl_doc,
4565"ioctl(cmd, option) -> long\n\
4566\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004567Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4568SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004569SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4570SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004571#endif
4572
4573#if defined(MS_WINDOWS)
4574static PyObject*
4575sock_share(PySocketSockObject *s, PyObject *arg)
4576{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004577 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004578 DWORD processId;
4579 int result;
4580
4581 if (!PyArg_ParseTuple(arg, "I", &processId))
4582 return NULL;
4583
4584 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004585 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004586 Py_END_ALLOW_THREADS
4587 if (result == SOCKET_ERROR)
4588 return set_error();
4589 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4590}
4591PyDoc_STRVAR(sock_share_doc,
4592"share(process_id) -> bytes\n\
4593\n\
4594Share the socket with another process. The target process id\n\
4595must be provided and the resulting bytes object passed to the target\n\
4596process. There the shared socket can be instantiated by calling\n\
4597socket.fromshare().");
4598
Christian Heimesfaf2f632008-01-06 16:59:19 +00004599
4600#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004601
4602/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004603
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004604static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4606 accept_doc},
4607 {"bind", (PyCFunction)sock_bind, METH_O,
4608 bind_doc},
4609 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004610 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 {"connect", (PyCFunction)sock_connect, METH_O,
4612 connect_doc},
4613 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4614 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004615 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4616 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4618 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004619#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 {"getpeername", (PyCFunction)sock_getpeername,
4621 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 {"getsockname", (PyCFunction)sock_getsockname,
4624 METH_NOARGS, getsockname_doc},
4625 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4626 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004627#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4629 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004630#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004631#if defined(MS_WINDOWS)
4632 {"share", (PyCFunction)sock_share, METH_VARARGS,
4633 sock_share_doc},
4634#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004635 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 listen_doc},
4637 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4638 recv_doc},
4639 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4640 recv_into_doc},
4641 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4642 recvfrom_doc},
4643 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4644 recvfrom_into_doc},
4645 {"send", (PyCFunction)sock_send, METH_VARARGS,
4646 send_doc},
4647 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4648 sendall_doc},
4649 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4650 sendto_doc},
4651 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4652 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004653 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4654 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4656 settimeout_doc},
4657 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4658 gettimeout_doc},
4659 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4660 setsockopt_doc},
4661 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4662 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004663#ifdef CMSG_LEN
4664 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4665 recvmsg_doc},
4666 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4667 recvmsg_into_doc,},
4668 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4669 sendmsg_doc},
4670#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004671#ifdef HAVE_SOCKADDR_ALG
4672 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4673 sendmsg_afalg_doc},
4674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004676};
4677
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004678/* SockObject members */
4679static PyMemberDef sock_memberlist[] = {
4680 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4681 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4682 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004683 {0},
4684};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004685
Victor Stinner71694d52015-03-28 01:18:54 +01004686static PyGetSetDef sock_getsetlist[] = {
4687 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4688 {NULL} /* sentinel */
4689};
4690
Guido van Rossum73624e91994-10-10 17:59:00 +00004691/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004692 First close the file description. */
4693
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004694static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004695sock_finalize(PySocketSockObject *s)
4696{
4697 SOCKET_T fd;
4698 PyObject *error_type, *error_value, *error_traceback;
4699
4700 /* Save the current exception, if any. */
4701 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4702
Victor Stinnerd3afb622016-07-22 17:47:09 +02004703 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004704 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4705 /* Spurious errors can appear at shutdown */
4706 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4707 PyErr_WriteUnraisable((PyObject *)s);
4708 }
4709 }
4710
4711 /* Only close the socket *after* logging the ResourceWarning warning
4712 to allow the logger to call socket methods like
4713 socket.getsockname(). If the socket is closed before, socket
4714 methods fails with the EBADF error. */
4715 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004716 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004717
4718 /* We do not want to retry upon EINTR: see sock_close() */
4719 Py_BEGIN_ALLOW_THREADS
4720 (void) SOCKETCLOSE(fd);
4721 Py_END_ALLOW_THREADS
4722 }
4723
4724 /* Restore the saved exception. */
4725 PyErr_Restore(error_type, error_value, error_traceback);
4726}
4727
4728static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004729sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004730{
Victor Stinner19a8e842016-03-21 16:36:48 +01004731 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4732 return;
4733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004734 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004735}
4736
Guido van Rossum30a685f1991-06-27 15:51:29 +00004737
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004738static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004739sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004740{
Victor Stinnere254e532014-07-26 14:36:55 +02004741 long sock_fd;
4742 /* On Windows, this test is needed because SOCKET_T is unsigned */
4743 if (s->sock_fd == INVALID_SOCKET) {
4744 sock_fd = -1;
4745 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004746#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004747 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 /* this can occur on Win64, and actually there is a special
4749 ugly printf formatter for decimal pointer length integer
4750 printing, only bother if necessary*/
4751 PyErr_SetString(PyExc_OverflowError,
4752 "no printf formatter to display "
4753 "the socket descriptor in decimal");
4754 return NULL;
4755 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004756#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004757 else
4758 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 return PyUnicode_FromFormat(
4760 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004761 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 s->sock_type,
4763 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004764}
4765
4766
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004767/* Create a new, uninitialized socket object. */
4768
4769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004770sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 new = type->tp_alloc(type, 0);
4775 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004776 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004777 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 ((PySocketSockObject *)new)->errorhandler = &set_error;
4779 }
4780 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004781}
4782
4783
4784/* Initialize a new socket object. */
4785
Victor Stinnerdaf45552013-08-28 00:53:59 +02004786#ifdef SOCK_CLOEXEC
4787/* socket() and socketpair() fail with EINVAL on Linux kernel older
4788 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4789static int sock_cloexec_works = -1;
4790#endif
4791
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004792/*ARGSUSED*/
4793static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004794sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 PySocketSockObject *s = (PySocketSockObject *)self;
4797 PyObject *fdobj = NULL;
4798 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004799 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004801#ifndef MS_WINDOWS
4802#ifdef SOCK_CLOEXEC
4803 int *atomic_flag_works = &sock_cloexec_works;
4804#else
4805 int *atomic_flag_works = NULL;
4806#endif
4807#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4810 "|iiiO:socket", keywords,
4811 &family, &type, &proto, &fdobj))
4812 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004815#ifdef MS_WINDOWS
4816 /* recreate a socket that was duplicated */
4817 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004818 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004819 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4820 PyErr_Format(PyExc_ValueError,
4821 "socket descriptor string has wrong size, "
4822 "should be %zu bytes.", sizeof(info));
4823 return -1;
4824 }
4825 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4826 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004827 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004828 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4829 Py_END_ALLOW_THREADS
4830 if (fd == INVALID_SOCKET) {
4831 set_error();
4832 return -1;
4833 }
4834 family = info.iAddressFamily;
4835 type = info.iSocketType;
4836 proto = info.iProtocol;
4837 }
4838 else
4839#endif
4840 {
4841 fd = PyLong_AsSocket_t(fdobj);
4842 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4843 return -1;
4844 if (fd == INVALID_SOCKET) {
4845 PyErr_SetString(PyExc_ValueError,
4846 "can't use invalid socket value");
4847 return -1;
4848 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004849
4850 if (family == -1) {
4851 sock_addr_t addrbuf;
4852 socklen_t addrlen = sizeof(sock_addr_t);
4853
4854 memset(&addrbuf, 0, addrlen);
4855 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4856 family = SAS2SA(&addrbuf)->sa_family;
4857 } else {
4858#ifdef MS_WINDOWS
4859 PyErr_SetFromWindowsErrWithFilename(0, "family");
4860#else
4861 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4862#endif
4863 return -1;
4864 }
4865 }
4866#ifdef SO_TYPE
4867 if (type == -1) {
4868 int tmp;
4869 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004870 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4871 (void *)&tmp, &slen) == 0)
4872 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004873 type = tmp;
4874 } else {
4875#ifdef MS_WINDOWS
4876 PyErr_SetFromWindowsErrWithFilename(0, "type");
4877#else
4878 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4879#endif
4880 return -1;
4881 }
4882 }
4883#else
4884 type = SOCK_STREAM;
4885#endif
4886#ifdef SO_PROTOCOL
4887 if (proto == -1) {
4888 int tmp;
4889 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004890 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4891 (void *)&tmp, &slen) == 0)
4892 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004893 proto = tmp;
4894 } else {
4895#ifdef MS_WINDOWS
4896 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4897#else
4898 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4899#endif
4900 return -1;
4901 }
4902 }
4903#else
4904 proto = 0;
4905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 }
4907 }
4908 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004909 /* No fd, default to AF_INET and SOCK_STREAM */
4910 if (family == -1) {
4911 family = AF_INET;
4912 }
4913 if (type == -1) {
4914 type = SOCK_STREAM;
4915 }
4916 if (proto == -1) {
4917 proto = 0;
4918 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004919#ifdef MS_WINDOWS
4920 /* Windows implementation */
4921#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4922#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4923#endif
4924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004926 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004927 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004928 NULL, 0,
4929 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4930 if (fd == INVALID_SOCKET) {
4931 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4932 support_wsa_no_inherit = 0;
4933 fd = socket(family, type, proto);
4934 }
4935 }
4936 else {
4937 fd = socket(family, type, proto);
4938 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 if (fd == INVALID_SOCKET) {
4942 set_error();
4943 return -1;
4944 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004945
4946 if (!support_wsa_no_inherit) {
4947 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4948 closesocket(fd);
4949 PyErr_SetFromWindowsErr(0);
4950 return -1;
4951 }
4952 }
4953#else
4954 /* UNIX */
4955 Py_BEGIN_ALLOW_THREADS
4956#ifdef SOCK_CLOEXEC
4957 if (sock_cloexec_works != 0) {
4958 fd = socket(family, type | SOCK_CLOEXEC, proto);
4959 if (sock_cloexec_works == -1) {
4960 if (fd >= 0) {
4961 sock_cloexec_works = 1;
4962 }
4963 else if (errno == EINVAL) {
4964 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4965 sock_cloexec_works = 0;
4966 fd = socket(family, type, proto);
4967 }
4968 }
4969 }
4970 else
4971#endif
4972 {
4973 fd = socket(family, type, proto);
4974 }
4975 Py_END_ALLOW_THREADS
4976
4977 if (fd == INVALID_SOCKET) {
4978 set_error();
4979 return -1;
4980 }
4981
4982 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4983 SOCKETCLOSE(fd);
4984 return -1;
4985 }
4986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004988 if (init_sockobject(s, fd, family, type, proto) == -1) {
4989 SOCKETCLOSE(fd);
4990 return -1;
4991 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004994
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004995}
4996
4997
Guido van Rossumb6775db1994-08-01 11:34:53 +00004998/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004999
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005000static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5002 "_socket.socket", /* tp_name */
5003 sizeof(PySocketSockObject), /* tp_basicsize */
5004 0, /* tp_itemsize */
5005 (destructor)sock_dealloc, /* tp_dealloc */
5006 0, /* tp_print */
5007 0, /* tp_getattr */
5008 0, /* tp_setattr */
5009 0, /* tp_reserved */
5010 (reprfunc)sock_repr, /* tp_repr */
5011 0, /* tp_as_number */
5012 0, /* tp_as_sequence */
5013 0, /* tp_as_mapping */
5014 0, /* tp_hash */
5015 0, /* tp_call */
5016 0, /* tp_str */
5017 PyObject_GenericGetAttr, /* tp_getattro */
5018 0, /* tp_setattro */
5019 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005020 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5021 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 sock_doc, /* tp_doc */
5023 0, /* tp_traverse */
5024 0, /* tp_clear */
5025 0, /* tp_richcompare */
5026 0, /* tp_weaklistoffset */
5027 0, /* tp_iter */
5028 0, /* tp_iternext */
5029 sock_methods, /* tp_methods */
5030 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005031 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 0, /* tp_base */
5033 0, /* tp_dict */
5034 0, /* tp_descr_get */
5035 0, /* tp_descr_set */
5036 0, /* tp_dictoffset */
5037 sock_initobj, /* tp_init */
5038 PyType_GenericAlloc, /* tp_alloc */
5039 sock_new, /* tp_new */
5040 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005041 0, /* tp_is_gc */
5042 0, /* tp_bases */
5043 0, /* tp_mro */
5044 0, /* tp_cache */
5045 0, /* tp_subclasses */
5046 0, /* tp_weaklist */
5047 0, /* tp_del */
5048 0, /* tp_version_tag */
5049 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005050};
5051
Guido van Rossum30a685f1991-06-27 15:51:29 +00005052
Guido van Rossum81194471991-07-27 21:42:02 +00005053/* Python interface to gethostname(). */
5054
5055/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005056static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005057socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005058{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005059#ifdef MS_WINDOWS
5060 /* Don't use winsock's gethostname, as this returns the ANSI
5061 version of the hostname, whereas we need a Unicode string.
5062 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005063 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005064 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005065 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005066 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005067
5068 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005069 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005070
5071 if (GetLastError() != ERROR_MORE_DATA)
5072 return PyErr_SetFromWindowsErr(0);
5073
5074 if (size == 0)
5075 return PyUnicode_New(0, 0);
5076
5077 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5078 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005079 name = PyMem_New(wchar_t, size);
5080 if (!name) {
5081 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005082 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005083 }
Victor Stinner74168972011-11-17 01:11:36 +01005084 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5085 name,
5086 &size))
5087 {
5088 PyMem_Free(name);
5089 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005090 }
Victor Stinner74168972011-11-17 01:11:36 +01005091
5092 result = PyUnicode_FromWideChar(name, size);
5093 PyMem_Free(name);
5094 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005095#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 char buf[1024];
5097 int res;
5098 Py_BEGIN_ALLOW_THREADS
5099 res = gethostname(buf, (int) sizeof buf - 1);
5100 Py_END_ALLOW_THREADS
5101 if (res < 0)
5102 return set_error();
5103 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005104 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005105#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005106}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005108PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005109"gethostname() -> string\n\
5110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005111Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005112
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005113#ifdef HAVE_SETHOSTNAME
5114PyDoc_STRVAR(sethostname_doc,
5115"sethostname(name)\n\n\
5116Sets the hostname to name.");
5117
5118static PyObject *
5119socket_sethostname(PyObject *self, PyObject *args)
5120{
5121 PyObject *hnobj;
5122 Py_buffer buf;
5123 int res, flag = 0;
5124
Christian Heimesd2774c72013-06-19 02:06:29 +02005125#ifdef _AIX
5126/* issue #18259, not declared in any useful header file */
5127extern int sethostname(const char *, size_t);
5128#endif
5129
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005130 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5131 PyErr_Clear();
5132 if (!PyArg_ParseTuple(args, "O&:sethostname",
5133 PyUnicode_FSConverter, &hnobj))
5134 return NULL;
5135 flag = 1;
5136 }
5137 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5138 if (!res) {
5139 res = sethostname(buf.buf, buf.len);
5140 PyBuffer_Release(&buf);
5141 }
5142 if (flag)
5143 Py_DECREF(hnobj);
5144 if (res)
5145 return set_error();
5146 Py_RETURN_NONE;
5147}
5148#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005149
Guido van Rossum30a685f1991-06-27 15:51:29 +00005150/* Python interface to gethostbyname(name). */
5151
5152/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005154socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 char *name;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005157 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005158 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005159
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005160 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 return NULL;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005162 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005163 goto finally;
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005164 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005165finally:
5166 PyMem_Free(name);
5167 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005168}
5169
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005170PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005171"gethostbyname(host) -> address\n\
5172\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005173Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005174
5175
Victor Stinner72400302016-01-28 15:41:01 +01005176static PyObject*
5177sock_decode_hostname(const char *name)
5178{
5179#ifdef MS_WINDOWS
5180 /* Issue #26227: gethostbyaddr() returns a string encoded
5181 * to the ANSI code page */
5182 return PyUnicode_DecodeFSDefault(name);
5183#else
5184 /* Decode from UTF-8 */
5185 return PyUnicode_FromString(name);
5186#endif
5187}
5188
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005189/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5190
5191static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005192gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 char **pch;
5195 PyObject *rtn_tuple = (PyObject *)NULL;
5196 PyObject *name_list = (PyObject *)NULL;
5197 PyObject *addr_list = (PyObject *)NULL;
5198 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005199 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 if (h == NULL) {
5202 /* Let's get real error message to return */
5203 set_herror(h_errno);
5204 return NULL;
5205 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 if (h->h_addrtype != af) {
5208 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005209 errno = EAFNOSUPPORT;
5210 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 return NULL;
5212 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 case AF_INET:
5217 if (alen < sizeof(struct sockaddr_in))
5218 return NULL;
5219 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005220
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005221#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 case AF_INET6:
5223 if (alen < sizeof(struct sockaddr_in6))
5224 return NULL;
5225 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005226#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 if ((name_list = PyList_New(0)) == NULL)
5231 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 if ((addr_list = PyList_New(0)) == NULL)
5234 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 /* SF #1511317: h_aliases can be NULL */
5237 if (h->h_aliases) {
5238 for (pch = h->h_aliases; *pch != NULL; pch++) {
5239 int status;
5240 tmp = PyUnicode_FromString(*pch);
5241 if (tmp == NULL)
5242 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 status = PyList_Append(name_list, tmp);
5245 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 if (status)
5248 goto err;
5249 }
5250 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5253 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 case AF_INET:
5258 {
5259 struct sockaddr_in sin;
5260 memset(&sin, 0, sizeof(sin));
5261 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005262#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005266 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 if (pch == h->h_addr_list && alen >= sizeof(sin))
5269 memcpy((char *) addr, &sin, sizeof(sin));
5270 break;
5271 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005272
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005273#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 case AF_INET6:
5275 {
5276 struct sockaddr_in6 sin6;
5277 memset(&sin6, 0, sizeof(sin6));
5278 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005279#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Yury Selivanov0ceb7172018-01-28 16:08:32 -05005283 tmp = makeipaddr((struct sockaddr *)&sin6,
5284 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5287 memcpy((char *) addr, &sin6, sizeof(sin6));
5288 break;
5289 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005290#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005293 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 "unsupported address family");
5295 return NULL;
5296 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 if (tmp == NULL)
5299 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 status = PyList_Append(addr_list, tmp);
5302 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 if (status)
5305 goto err;
5306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005307
Victor Stinner72400302016-01-28 15:41:01 +01005308 name = sock_decode_hostname(h->h_name);
5309 if (name == NULL)
5310 goto err;
5311 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005312
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005313 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 Py_XDECREF(name_list);
5315 Py_XDECREF(addr_list);
5316 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005317}
5318
5319
5320/* Python interface to gethostbyname_ex(name). */
5321
5322/*ARGSUSED*/
5323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005324socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 char *name;
5327 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005328 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005330 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005331#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005333#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 char buf[16384];
5337 int buf_len = (sizeof buf) - 1;
5338 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005339#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005340#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005342#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005343#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005344
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005345 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005347 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005348 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005350#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005351#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005352 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005354#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005356#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 memset((void *) &data, '\0', sizeof(data));
5358 result = gethostbyname_r(name, &hp_allocated, &data);
5359 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005360#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005361#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005362#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005364#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005365 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005367#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 Py_END_ALLOW_THREADS
5369 /* Some C libraries would require addr.__ss_family instead of
5370 addr.ss_family.
5371 Therefore, we cast the sockaddr_storage into sockaddr to
5372 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005373 sa = SAS2SA(&addr);
5374 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005376#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005378#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005379finally:
5380 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005382}
5383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005384PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005385"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5386\n\
5387Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005388for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005389
5390
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005391/* Python interface to gethostbyaddr(IP). */
5392
5393/*ARGSUSED*/
5394static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005395socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005396{
Charles-François Natali8b759652011-12-23 16:44:51 +01005397 sock_addr_t addr;
5398 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 char *ip_num;
5400 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005401 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005402#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005404#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005406#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 /* glibcs up to 2.10 assume that the buf argument to
5408 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5409 does not ensure. The attribute below instructs the compiler
5410 to maintain this alignment. */
5411 char buf[16384] Py_ALIGNED(8);
5412 int buf_len = (sizeof buf) - 1;
5413 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005414#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005415#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005417#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005418#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005419 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 int al;
5421 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005422
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005423 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 return NULL;
5425 af = AF_UNSPEC;
5426 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005427 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 af = sa->sa_family;
5429 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005430 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 switch (af) {
5432 case AF_INET:
5433 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5434 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5435 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005436#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 case AF_INET6:
5438 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5439 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5440 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005443 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005444 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 }
5446 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005447#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005448#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005449 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 &hp_allocated, buf, buf_len,
5451 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005452#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 h = gethostbyaddr_r(ap, al, af,
5454 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005455#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 memset((void *) &data, '\0', sizeof(data));
5457 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5458 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005459#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005460#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005461#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005463#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005464 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005466#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005468 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005469#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005471#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005472finally:
5473 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005475}
5476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005477PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005478"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5479\n\
5480Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005481for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005482
Guido van Rossum30a685f1991-06-27 15:51:29 +00005483
5484/* Python interface to getservbyname(name).
5485 This only returns the port number, since the other info is already
5486 known or not useful (like the list of aliases). */
5487
5488/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005489static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005490socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005491{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005492 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 struct servent *sp;
5494 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5495 return NULL;
5496 Py_BEGIN_ALLOW_THREADS
5497 sp = getservbyname(name, proto);
5498 Py_END_ALLOW_THREADS
5499 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005500 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 return NULL;
5502 }
5503 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005504}
5505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005506PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005507"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005508\n\
5509Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005510The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5511otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005512
Guido van Rossum30a685f1991-06-27 15:51:29 +00005513
Barry Warsaw11b91a02004-06-28 00:50:43 +00005514/* Python interface to getservbyport(port).
5515 This only returns the service name, since the other info is already
5516 known or not useful (like the list of aliases). */
5517
5518/*ARGSUSED*/
5519static PyObject *
5520socket_getservbyport(PyObject *self, PyObject *args)
5521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005523 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 struct servent *sp;
5525 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5526 return NULL;
5527 if (port < 0 || port > 0xffff) {
5528 PyErr_SetString(
5529 PyExc_OverflowError,
5530 "getservbyport: port must be 0-65535.");
5531 return NULL;
5532 }
5533 Py_BEGIN_ALLOW_THREADS
5534 sp = getservbyport(htons((short)port), proto);
5535 Py_END_ALLOW_THREADS
5536 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005537 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 return NULL;
5539 }
5540 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005541}
5542
5543PyDoc_STRVAR(getservbyport_doc,
5544"getservbyport(port[, protocolname]) -> string\n\
5545\n\
5546Return the service name from a port number and protocol name.\n\
5547The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5548otherwise any protocol will match.");
5549
Guido van Rossum3901d851996-12-19 16:35:04 +00005550/* Python interface to getprotobyname(name).
5551 This only returns the protocol number, since the other info is
5552 already known or not useful (like the list of aliases). */
5553
5554/*ARGSUSED*/
5555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005556socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005557{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005558 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 struct protoent *sp;
5560 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5561 return NULL;
5562 Py_BEGIN_ALLOW_THREADS
5563 sp = getprotobyname(name);
5564 Py_END_ALLOW_THREADS
5565 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005566 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 return NULL;
5568 }
5569 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005570}
5571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005572PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005573"getprotobyname(name) -> integer\n\
5574\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005575Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005576
Christian Heimesd0e31b92018-01-27 09:54:13 +01005577static PyObject *
5578socket_close(PyObject *self, PyObject *fdobj)
5579{
5580 SOCKET_T fd;
5581 int res;
5582
5583 fd = PyLong_AsSocket_t(fdobj);
5584 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5585 return NULL;
5586 Py_BEGIN_ALLOW_THREADS
5587 res = SOCKETCLOSE(fd);
5588 Py_END_ALLOW_THREADS
5589 /* bpo-30319: The peer can already have closed the connection.
5590 Python ignores ECONNRESET on close(). */
5591 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5592 return set_error();
5593 }
5594 Py_RETURN_NONE;
5595}
5596
5597PyDoc_STRVAR(close_doc,
5598"close(integer) -> None\n\
5599\n\
5600Close an integer socket file descriptor. This is like os.close(), but for\n\
5601sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005602
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005603#ifndef NO_DUP
5604/* dup() function for socket fds */
5605
5606static PyObject *
5607socket_dup(PyObject *self, PyObject *fdobj)
5608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 SOCKET_T fd, newfd;
5610 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005611#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005612 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005613#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 fd = PyLong_AsSocket_t(fdobj);
5616 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5617 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005618
Victor Stinnerdaf45552013-08-28 00:53:59 +02005619#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005620 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005621 return set_error();
5622
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005623 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005624 FROM_PROTOCOL_INFO,
5625 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 if (newfd == INVALID_SOCKET)
5627 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005628
Victor Stinnerdaf45552013-08-28 00:53:59 +02005629 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5630 closesocket(newfd);
5631 PyErr_SetFromWindowsErr(0);
5632 return NULL;
5633 }
5634#else
5635 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5636 newfd = _Py_dup(fd);
5637 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005638 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005639#endif
5640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 newfdobj = PyLong_FromSocket_t(newfd);
5642 if (newfdobj == NULL)
5643 SOCKETCLOSE(newfd);
5644 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005645}
5646
5647PyDoc_STRVAR(dup_doc,
5648"dup(integer) -> integer\n\
5649\n\
5650Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5651sockets; on some platforms os.dup() won't work for socket file descriptors.");
5652#endif
5653
5654
Dave Cole331708b2004-08-09 04:51:41 +00005655#ifdef HAVE_SOCKETPAIR
5656/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005657 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005658 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005659
5660/*ARGSUSED*/
5661static PyObject *
5662socket_socketpair(PyObject *self, PyObject *args)
5663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 PySocketSockObject *s0 = NULL, *s1 = NULL;
5665 SOCKET_T sv[2];
5666 int family, type = SOCK_STREAM, proto = 0;
5667 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005668#ifdef SOCK_CLOEXEC
5669 int *atomic_flag_works = &sock_cloexec_works;
5670#else
5671 int *atomic_flag_works = NULL;
5672#endif
5673 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005674
5675#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005677#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5681 &family, &type, &proto))
5682 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005685 Py_BEGIN_ALLOW_THREADS
5686#ifdef SOCK_CLOEXEC
5687 if (sock_cloexec_works != 0) {
5688 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5689 if (sock_cloexec_works == -1) {
5690 if (ret >= 0) {
5691 sock_cloexec_works = 1;
5692 }
5693 else if (errno == EINVAL) {
5694 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5695 sock_cloexec_works = 0;
5696 ret = socketpair(family, type, proto, sv);
5697 }
5698 }
5699 }
5700 else
5701#endif
5702 {
5703 ret = socketpair(family, type, proto, sv);
5704 }
5705 Py_END_ALLOW_THREADS
5706
5707 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005709
5710 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5711 goto finally;
5712 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5713 goto finally;
5714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 s0 = new_sockobject(sv[0], family, type, proto);
5716 if (s0 == NULL)
5717 goto finally;
5718 s1 = new_sockobject(sv[1], family, type, proto);
5719 if (s1 == NULL)
5720 goto finally;
5721 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005722
5723finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 if (res == NULL) {
5725 if (s0 == NULL)
5726 SOCKETCLOSE(sv[0]);
5727 if (s1 == NULL)
5728 SOCKETCLOSE(sv[1]);
5729 }
5730 Py_XDECREF(s0);
5731 Py_XDECREF(s1);
5732 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005733}
5734
5735PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005736"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005737\n\
5738Create a pair of socket objects from the sockets returned by the platform\n\
5739socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005740The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005741AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005742
5743#endif /* HAVE_SOCKETPAIR */
5744
5745
Guido van Rossum006bf911996-06-12 04:04:55 +00005746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005747socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005748{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005749 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005750
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005751 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 return NULL;
5753 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005754 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005756 "ntohs: can't convert negative Python int to C "
5757 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 return NULL;
5759 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005760 if (x > 0xffff) {
5761 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5762 "ntohs: Python int too large to convert to C "
5763 "16-bit unsigned integer (The silent truncation "
5764 "is deprecated)",
5765 1)) {
5766 return NULL;
5767 }
5768 }
5769 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005770}
5771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005772PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005773"ntohs(integer) -> integer\n\
5774\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005775Convert a 16-bit unsigned integer from network to host byte order.\n\
5776Note that in case the received integer does not fit in 16-bit unsigned\n\
5777integer, but does fit in a positive C int, it is silently truncated to\n\
577816-bit unsigned integer.\n\
5779However, this silent truncation feature is deprecated, and will raise an \n\
5780exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005781
5782
Guido van Rossum006bf911996-06-12 04:04:55 +00005783static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005784socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 if (PyLong_Check(arg)) {
5789 x = PyLong_AsUnsignedLong(arg);
5790 if (x == (unsigned long) -1 && PyErr_Occurred())
5791 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005792#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 {
5794 unsigned long y;
5795 /* only want the trailing 32 bits */
5796 y = x & 0xFFFFFFFFUL;
5797 if (y ^ x)
5798 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005799 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 x = y;
5801 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 }
5804 else
5805 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005806 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005809}
5810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005811PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005812"ntohl(integer) -> integer\n\
5813\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005814Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005815
5816
Guido van Rossum006bf911996-06-12 04:04:55 +00005817static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005818socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005819{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005820 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005821
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005822 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 return NULL;
5824 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005825 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005827 "htons: can't convert negative Python int to C "
5828 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 return NULL;
5830 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005831 if (x > 0xffff) {
5832 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5833 "htons: Python int too large to convert to C "
5834 "16-bit unsigned integer (The silent truncation "
5835 "is deprecated)",
5836 1)) {
5837 return NULL;
5838 }
5839 }
5840 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005841}
5842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005843PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005844"htons(integer) -> integer\n\
5845\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005846Convert a 16-bit unsigned integer from host to network byte order.\n\
5847Note that in case the received integer does not fit in 16-bit unsigned\n\
5848integer, but does fit in a positive C int, it is silently truncated to\n\
584916-bit unsigned integer.\n\
5850However, this silent truncation feature is deprecated, and will raise an \n\
5851exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005852
5853
Guido van Rossum006bf911996-06-12 04:04:55 +00005854static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005855socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 if (PyLong_Check(arg)) {
5860 x = PyLong_AsUnsignedLong(arg);
5861 if (x == (unsigned long) -1 && PyErr_Occurred())
5862 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005863#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 {
5865 unsigned long y;
5866 /* only want the trailing 32 bits */
5867 y = x & 0xFFFFFFFFUL;
5868 if (y ^ x)
5869 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005870 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 x = y;
5872 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 }
5875 else
5876 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005877 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 Py_TYPE(arg)->tp_name);
5879 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005880}
5881
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005882PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005883"htonl(integer) -> integer\n\
5884\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005885Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005886
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005887/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005889PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005890"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005891\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005892Convert 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 +00005893binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005894
5895static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005896socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005897{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005898#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005900#endif
5901
5902#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005903#if (SIZEOF_INT != 4)
5904#error "Not sure if in_addr_t exists and int is not 32-bits."
5905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 /* Have to use inet_addr() instead */
5907 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005908#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005909 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5912 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005913
Tim Peters1df9fdd2003-02-13 03:13:40 +00005914
5915#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005916
5917#ifdef USE_INET_ATON_WEAKLINK
5918 if (inet_aton != NULL) {
5919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 if (inet_aton(ip_addr, &buf))
5921 return PyBytes_FromStringAndSize((char *)(&buf),
5922 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005923
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005924 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 "illegal IP address string passed to inet_aton");
5926 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005927
Thomas Wouters477c8d52006-05-27 19:21:47 +00005928#ifdef USE_INET_ATON_WEAKLINK
5929 } else {
5930#endif
5931
5932#endif
5933
5934#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 /* special-case this address as inet_addr might return INADDR_NONE
5937 * for this */
5938 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005939 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005941
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005942 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005946 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 "illegal IP address string passed to inet_aton");
5948 return NULL;
5949 }
5950 }
5951 return PyBytes_FromStringAndSize((char *) &packed_addr,
5952 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005953
5954#ifdef USE_INET_ATON_WEAKLINK
5955 }
5956#endif
5957
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005958#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005959}
5960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005961PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005962"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005963\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005964Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005965
5966static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005967socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005968{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005969 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005971
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005972 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 return NULL;
5974 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005975
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005976 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005977 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005979 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 return NULL;
5981 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005982
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005983 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5984 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005985
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005986 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005988}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005989
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005990#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005991
5992PyDoc_STRVAR(inet_pton_doc,
5993"inet_pton(af, ip) -> packed IP address string\n\
5994\n\
5995Convert an IP address from string format to a packed string suitable\n\
5996for use with low-level network functions.");
5997
5998static PyObject *
5999socket_inet_pton(PyObject *self, PyObject *args)
6000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006002 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006004#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006005 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006006#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6010 return NULL;
6011 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006012
Martin v. Löwis04697e82004-06-02 12:35:29 +00006013#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006015 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 "can't use AF_INET6, IPv6 is disabled");
6017 return NULL;
6018 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006019#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 retval = inet_pton(af, ip, packed);
6022 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006023 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 return NULL;
6025 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006026 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 "illegal IP address string passed to inet_pton");
6028 return NULL;
6029 } else if (af == AF_INET) {
6030 return PyBytes_FromStringAndSize(packed,
6031 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006032#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 } else if (af == AF_INET6) {
6034 return PyBytes_FromStringAndSize(packed,
6035 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006038 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 return NULL;
6040 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006041}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006042
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006043PyDoc_STRVAR(inet_ntop_doc,
6044"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6045\n\
6046Convert a packed IP address of the given family to string format.");
6047
6048static PyObject *
6049socket_inet_ntop(PyObject *self, PyObject *args)
6050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006052 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006054#ifdef ENABLE_IPV6
Yury Selivanov0ceb7172018-01-28 16:08:32 -05006055 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006056#else
Yury Selivanov0ceb7172018-01-28 16:08:32 -05006057 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006058#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006059
Yury Selivanov0ceb7172018-01-28 16:08:32 -05006060 /* Guarantee NUL-termination for PyUnicode_FromString() below */
6061 memset((void *) &ip[0], '\0', sizeof(ip));
6062
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006063 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 return NULL;
6065 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006068 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 PyErr_SetString(PyExc_ValueError,
6070 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006071 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 return NULL;
6073 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006074#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006076 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 PyErr_SetString(PyExc_ValueError,
6078 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006079 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 return NULL;
6081 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 } else {
6084 PyErr_Format(PyExc_ValueError,
6085 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006086 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 return NULL;
6088 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006089
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006090 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6091 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006093 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 return NULL;
6095 } else {
6096 return PyUnicode_FromString(retval);
6097 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006098}
6099
6100#endif /* HAVE_INET_PTON */
6101
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006102/* Python interface to getaddrinfo(host, port). */
6103
6104/*ARGSUSED*/
6105static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006106socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006107{
Victor Stinner77af1722011-05-26 14:05:59 +02006108 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006109 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 struct addrinfo hints, *res;
6111 struct addrinfo *res0 = NULL;
6112 PyObject *hobj = NULL;
6113 PyObject *pobj = (PyObject *)NULL;
6114 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006115 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 int family, socktype, protocol, flags;
6117 int error;
6118 PyObject *all = (PyObject *)NULL;
6119 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006120
Georg Brandl6083a4b2013-10-14 06:51:46 +02006121 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006123 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006124 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 &protocol, &flags)) {
6126 return NULL;
6127 }
6128 if (hobj == Py_None) {
6129 hptr = NULL;
6130 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006131 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 if (!idna)
6133 return NULL;
6134 assert(PyBytes_Check(idna));
6135 hptr = PyBytes_AS_STRING(idna);
6136 } else if (PyBytes_Check(hobj)) {
6137 hptr = PyBytes_AsString(hobj);
6138 } else {
6139 PyErr_SetString(PyExc_TypeError,
6140 "getaddrinfo() argument 1 must be string or None");
6141 return NULL;
6142 }
6143 if (PyLong_CheckExact(pobj)) {
6144 long value = PyLong_AsLong(pobj);
6145 if (value == -1 && PyErr_Occurred())
6146 goto err;
6147 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6148 pptr = pbuf;
6149 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006150 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006151 if (pptr == NULL)
6152 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006154 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 } else if (pobj == Py_None) {
6156 pptr = (char *)NULL;
6157 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006158 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 goto err;
6160 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006161#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006162 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006163 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006164 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6165 * This workaround avoids a segfault in libsystem.
6166 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006167 pptr = "00";
6168 }
6169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 memset(&hints, 0, sizeof(hints));
6171 hints.ai_family = family;
6172 hints.ai_socktype = socktype;
6173 hints.ai_protocol = protocol;
6174 hints.ai_flags = flags;
6175 Py_BEGIN_ALLOW_THREADS
6176 ACQUIRE_GETADDRINFO_LOCK
6177 error = getaddrinfo(hptr, pptr, &hints, &res0);
6178 Py_END_ALLOW_THREADS
6179 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6180 if (error) {
6181 set_gaierror(error);
6182 goto err;
6183 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006184
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006185 all = PyList_New(0);
6186 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 goto err;
6188 for (res = res0; res; res = res->ai_next) {
6189 PyObject *single;
6190 PyObject *addr =
6191 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6192 if (addr == NULL)
6193 goto err;
6194 single = Py_BuildValue("iiisO", res->ai_family,
6195 res->ai_socktype, res->ai_protocol,
6196 res->ai_canonname ? res->ai_canonname : "",
6197 addr);
6198 Py_DECREF(addr);
6199 if (single == NULL)
6200 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 if (PyList_Append(all, single))
6203 goto err;
6204 Py_XDECREF(single);
6205 }
6206 Py_XDECREF(idna);
6207 if (res0)
6208 freeaddrinfo(res0);
6209 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006210 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 Py_XDECREF(all);
6212 Py_XDECREF(idna);
6213 if (res0)
6214 freeaddrinfo(res0);
6215 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006216}
6217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006218PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006219"getaddrinfo(host, port [, family, type, proto, flags])\n\
6220 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006221\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006222Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006223
6224/* Python interface to getnameinfo(sa, flags). */
6225
6226/*ARGSUSED*/
6227static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006228socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230 PyObject *sa = (PyObject *)NULL;
6231 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006232 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006233 int port;
6234 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6236 struct addrinfo hints, *res = NULL;
6237 int error;
6238 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006239 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 flags = flowinfo = scope_id = 0;
6242 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6243 return NULL;
6244 if (!PyTuple_Check(sa)) {
6245 PyErr_SetString(PyExc_TypeError,
6246 "getnameinfo() argument 1 must be a tuple");
6247 return NULL;
6248 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006249 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006251 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006253 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006254 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006255 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006256 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006257 return NULL;
6258 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6260 memset(&hints, 0, sizeof(hints));
6261 hints.ai_family = AF_UNSPEC;
6262 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006263 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 Py_BEGIN_ALLOW_THREADS
6265 ACQUIRE_GETADDRINFO_LOCK
6266 error = getaddrinfo(hostp, pbuf, &hints, &res);
6267 Py_END_ALLOW_THREADS
6268 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6269 if (error) {
6270 set_gaierror(error);
6271 goto fail;
6272 }
6273 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006274 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 "sockaddr resolved to multiple addresses");
6276 goto fail;
6277 }
6278 switch (res->ai_family) {
6279 case AF_INET:
6280 {
6281 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006282 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 "IPv4 sockaddr must be 2 tuple");
6284 goto fail;
6285 }
6286 break;
6287 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006288#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289 case AF_INET6:
6290 {
6291 struct sockaddr_in6 *sin6;
6292 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006293 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294 sin6->sin6_scope_id = scope_id;
6295 break;
6296 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006299 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6301 if (error) {
6302 set_gaierror(error);
6303 goto fail;
6304 }
Victor Stinner72400302016-01-28 15:41:01 +01006305
6306 name = sock_decode_hostname(hbuf);
6307 if (name == NULL)
6308 goto fail;
6309 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006310
6311fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 if (res)
6313 freeaddrinfo(res);
6314 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006315}
6316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006317PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006318"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006319\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006320Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006321
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006322
6323/* Python API to getting and setting the default timeout value. */
6324
6325static PyObject *
6326socket_getdefaulttimeout(PyObject *self)
6327{
Victor Stinner71694d52015-03-28 01:18:54 +01006328 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006329 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 }
Victor Stinner71694d52015-03-28 01:18:54 +01006331 else {
6332 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6333 return PyFloat_FromDouble(seconds);
6334 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006335}
6336
6337PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006338"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006339\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006340Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006341A value of None indicates that new socket objects have no timeout.\n\
6342When the socket module is first imported, the default is None.");
6343
6344static PyObject *
6345socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6346{
Victor Stinner71694d52015-03-28 01:18:54 +01006347 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006348
Victor Stinner71694d52015-03-28 01:18:54 +01006349 if (socket_parse_timeout(&timeout, arg) < 0)
6350 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006353
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006354 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006355}
6356
6357PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006358"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006359\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006360Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006361A value of None indicates that new socket objects have no timeout.\n\
6362When the socket module is first imported, the default is None.");
6363
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006364#ifdef HAVE_IF_NAMEINDEX
6365/* Python API for getting interface indices and names */
6366
6367static PyObject *
6368socket_if_nameindex(PyObject *self, PyObject *arg)
6369{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006370 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006371 int i;
6372 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006373
Charles-François Natali60713592011-05-20 16:55:06 +02006374 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006375 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006376 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006377 return NULL;
6378 }
6379
6380 list = PyList_New(0);
6381 if (list == NULL) {
6382 if_freenameindex(ni);
6383 return NULL;
6384 }
6385
Charles-François Natali60713592011-05-20 16:55:06 +02006386 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6387 PyObject *ni_tuple = Py_BuildValue("IO&",
6388 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006389
6390 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6391 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006392 Py_DECREF(list);
6393 if_freenameindex(ni);
6394 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006395 }
6396 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006397 }
6398
6399 if_freenameindex(ni);
6400 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006401}
6402
6403PyDoc_STRVAR(if_nameindex_doc,
6404"if_nameindex()\n\
6405\n\
6406Returns a list of network interface information (index, name) tuples.");
6407
Charles-François Natali60713592011-05-20 16:55:06 +02006408static PyObject *
6409socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006410{
Charles-François Natali60713592011-05-20 16:55:06 +02006411 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006412 unsigned long index;
6413
Charles-François Natali60713592011-05-20 16:55:06 +02006414 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6415 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006416 return NULL;
6417
Charles-François Natali60713592011-05-20 16:55:06 +02006418 index = if_nametoindex(PyBytes_AS_STRING(oname));
6419 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006420 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006421 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006422 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006423 return NULL;
6424 }
6425
6426 return PyLong_FromUnsignedLong(index);
6427}
6428
6429PyDoc_STRVAR(if_nametoindex_doc,
6430"if_nametoindex(if_name)\n\
6431\n\
6432Returns the interface index corresponding to the interface name if_name.");
6433
Charles-François Natali60713592011-05-20 16:55:06 +02006434static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006435socket_if_indextoname(PyObject *self, PyObject *arg)
6436{
Charles-François Natali60713592011-05-20 16:55:06 +02006437 unsigned long index;
6438 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006439
Charles-François Natali60713592011-05-20 16:55:06 +02006440 index = PyLong_AsUnsignedLong(arg);
6441 if (index == (unsigned long) -1)
6442 return NULL;
6443
6444 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006445 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006446 return NULL;
6447 }
6448
Charles-François Natali60713592011-05-20 16:55:06 +02006449 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006450}
6451
6452PyDoc_STRVAR(if_indextoname_doc,
6453"if_indextoname(if_index)\n\
6454\n\
6455Returns the interface name corresponding to the interface index if_index.");
6456
6457#endif /* HAVE_IF_NAMEINDEX */
6458
6459
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006460#ifdef CMSG_LEN
6461/* Python interface to CMSG_LEN(length). */
6462
6463static PyObject *
6464socket_CMSG_LEN(PyObject *self, PyObject *args)
6465{
6466 Py_ssize_t length;
6467 size_t result;
6468
6469 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6470 return NULL;
6471 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6472 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6473 return NULL;
6474 }
6475 return PyLong_FromSize_t(result);
6476}
6477
6478PyDoc_STRVAR(CMSG_LEN_doc,
6479"CMSG_LEN(length) -> control message length\n\
6480\n\
6481Return the total length, without trailing padding, of an ancillary\n\
6482data item with associated data of the given length. This value can\n\
6483often be used as the buffer size for recvmsg() to receive a single\n\
6484item of ancillary data, but RFC 3542 requires portable applications to\n\
6485use CMSG_SPACE() and thus include space for padding, even when the\n\
6486item will be the last in the buffer. Raises OverflowError if length\n\
6487is outside the permissible range of values.");
6488
6489
6490#ifdef CMSG_SPACE
6491/* Python interface to CMSG_SPACE(length). */
6492
6493static PyObject *
6494socket_CMSG_SPACE(PyObject *self, PyObject *args)
6495{
6496 Py_ssize_t length;
6497 size_t result;
6498
6499 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6500 return NULL;
6501 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6502 PyErr_SetString(PyExc_OverflowError,
6503 "CMSG_SPACE() argument out of range");
6504 return NULL;
6505 }
6506 return PyLong_FromSize_t(result);
6507}
6508
6509PyDoc_STRVAR(CMSG_SPACE_doc,
6510"CMSG_SPACE(length) -> buffer size\n\
6511\n\
6512Return the buffer size needed for recvmsg() to receive an ancillary\n\
6513data item with associated data of the given length, along with any\n\
6514trailing padding. The buffer space needed to receive multiple items\n\
6515is the sum of the CMSG_SPACE() values for their associated data\n\
6516lengths. Raises OverflowError if length is outside the permissible\n\
6517range of values.");
6518#endif /* CMSG_SPACE */
6519#endif /* CMSG_LEN */
6520
6521
Guido van Rossum30a685f1991-06-27 15:51:29 +00006522/* List of functions exported by this module. */
6523
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006524static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 {"gethostbyname", socket_gethostbyname,
6526 METH_VARARGS, gethostbyname_doc},
6527 {"gethostbyname_ex", socket_gethostbyname_ex,
6528 METH_VARARGS, ghbn_ex_doc},
6529 {"gethostbyaddr", socket_gethostbyaddr,
6530 METH_VARARGS, gethostbyaddr_doc},
6531 {"gethostname", socket_gethostname,
6532 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006533#ifdef HAVE_SETHOSTNAME
6534 {"sethostname", socket_sethostname,
6535 METH_VARARGS, sethostname_doc},
6536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 {"getservbyname", socket_getservbyname,
6538 METH_VARARGS, getservbyname_doc},
6539 {"getservbyport", socket_getservbyport,
6540 METH_VARARGS, getservbyport_doc},
6541 {"getprotobyname", socket_getprotobyname,
6542 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006543 {"close", socket_close,
6544 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006545#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 {"dup", socket_dup,
6547 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006548#endif
Dave Cole331708b2004-08-09 04:51:41 +00006549#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 {"socketpair", socket_socketpair,
6551 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 {"ntohs", socket_ntohs,
6554 METH_VARARGS, ntohs_doc},
6555 {"ntohl", socket_ntohl,
6556 METH_O, ntohl_doc},
6557 {"htons", socket_htons,
6558 METH_VARARGS, htons_doc},
6559 {"htonl", socket_htonl,
6560 METH_O, htonl_doc},
6561 {"inet_aton", socket_inet_aton,
6562 METH_VARARGS, inet_aton_doc},
6563 {"inet_ntoa", socket_inet_ntoa,
6564 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006565#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 {"inet_pton", socket_inet_pton,
6567 METH_VARARGS, inet_pton_doc},
6568 {"inet_ntop", socket_inet_ntop,
6569 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006570#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006571 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6572 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 {"getnameinfo", socket_getnameinfo,
6574 METH_VARARGS, getnameinfo_doc},
6575 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6576 METH_NOARGS, getdefaulttimeout_doc},
6577 {"setdefaulttimeout", socket_setdefaulttimeout,
6578 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006579#ifdef HAVE_IF_NAMEINDEX
6580 {"if_nameindex", socket_if_nameindex,
6581 METH_NOARGS, if_nameindex_doc},
6582 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006583 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006584 {"if_indextoname", socket_if_indextoname,
6585 METH_O, if_indextoname_doc},
6586#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006587#ifdef CMSG_LEN
6588 {"CMSG_LEN", socket_CMSG_LEN,
6589 METH_VARARGS, CMSG_LEN_doc},
6590#ifdef CMSG_SPACE
6591 {"CMSG_SPACE", socket_CMSG_SPACE,
6592 METH_VARARGS, CMSG_SPACE_doc},
6593#endif
6594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006596};
6597
Guido van Rossum30a685f1991-06-27 15:51:29 +00006598
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006599#ifdef MS_WINDOWS
6600#define OS_INIT_DEFINED
6601
6602/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006603
6604static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006605os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006608}
6609
6610static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006611os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 WSADATA WSAData;
6614 int ret;
6615 ret = WSAStartup(0x0101, &WSAData);
6616 switch (ret) {
6617 case 0: /* No error */
6618 Py_AtExit(os_cleanup);
6619 return 1; /* Success */
6620 case WSASYSNOTREADY:
6621 PyErr_SetString(PyExc_ImportError,
6622 "WSAStartup failed: network not ready");
6623 break;
6624 case WSAVERNOTSUPPORTED:
6625 case WSAEINVAL:
6626 PyErr_SetString(
6627 PyExc_ImportError,
6628 "WSAStartup failed: requested version not supported");
6629 break;
6630 default:
6631 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6632 break;
6633 }
6634 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006635}
6636
Guido van Rossum8d665e61996-06-26 18:22:49 +00006637#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006638
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006639
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006640
6641#ifndef OS_INIT_DEFINED
6642static int
6643os_init(void)
6644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006646}
6647#endif
6648
6649
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006650/* C API table - always add new things to the end for binary
6651 compatibility. */
6652static
6653PySocketModule_APIObject PySocketModuleAPI =
6654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006656 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006658};
6659
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006660
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006661/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006662
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006663 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006664 "socket.py" which implements some additional functionality.
6665 The import of "_socket" may fail with an ImportError exception if
6666 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006667 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006668 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006669*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006670
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006671PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006672"Implementation module for socket operations.\n\
6673\n\
6674See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006675
Martin v. Löwis1a214512008-06-11 05:26:20 +00006676static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 PyModuleDef_HEAD_INIT,
6678 PySocket_MODULE_NAME,
6679 socket_doc,
6680 -1,
6681 socket_methods,
6682 NULL,
6683 NULL,
6684 NULL,
6685 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006686};
6687
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006688PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006689PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 if (!os_init())
6694 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006695
Victor Stinnerdaf45552013-08-28 00:53:59 +02006696#ifdef MS_WINDOWS
6697 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006698 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006699 }
6700#endif
6701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 Py_TYPE(&sock_type) = &PyType_Type;
6703 m = PyModule_Create(&socketmodule);
6704 if (m == NULL)
6705 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006706
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006707 Py_INCREF(PyExc_OSError);
6708 PySocketModuleAPI.error = PyExc_OSError;
6709 Py_INCREF(PyExc_OSError);
6710 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006711 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006712 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006713 if (socket_herror == NULL)
6714 return NULL;
6715 Py_INCREF(socket_herror);
6716 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006717 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718 NULL);
6719 if (socket_gaierror == NULL)
6720 return NULL;
6721 Py_INCREF(socket_gaierror);
6722 PyModule_AddObject(m, "gaierror", socket_gaierror);
6723 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006724 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 if (socket_timeout == NULL)
6726 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006727 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 Py_INCREF(socket_timeout);
6729 PyModule_AddObject(m, "timeout", socket_timeout);
6730 Py_INCREF((PyObject *)&sock_type);
6731 if (PyModule_AddObject(m, "SocketType",
6732 (PyObject *)&sock_type) != 0)
6733 return NULL;
6734 Py_INCREF((PyObject *)&sock_type);
6735 if (PyModule_AddObject(m, "socket",
6736 (PyObject *)&sock_type) != 0)
6737 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006738
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006739#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006740 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006741#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744 Py_INCREF(has_ipv6);
6745 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 /* Export C API */
6748 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6749 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6750 ) != 0)
6751 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006754#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006756#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006758#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006760#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006761#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006764#endif
6765#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006767#endif
6768#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006771#endif
6772#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006775#endif
6776#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006779#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006780#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006783#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006784#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006787#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006788#ifdef HAVE_SOCKADDR_ALG
6789 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6790#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006791#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006794#endif
6795#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006797#endif
6798#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006801#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006802#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006805#endif
6806#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006809#endif
6810#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006813#endif
6814#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006817#endif
6818#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, AF_NETLINK);
6821 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006822#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006824#endif
6825#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006827#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6829 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006830#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006832#endif
6833#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006835#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006836#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006838#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006839#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006841#endif
6842#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006844#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006846#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006848#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006849#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006851#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006852#ifdef NETLINK_CRYPTO
6853 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6854#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006855#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006856
6857#ifdef AF_VSOCK
6858 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6859 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6860 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6861 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6862 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6863 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6864 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6865 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6866 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6867#endif
6868
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006869#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006872#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006873#ifdef AF_LINK
6874 PyModule_AddIntMacro(m, AF_LINK);
6875#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006876#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006879#endif
6880#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006883#endif
6884#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006887#endif
6888#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006891#endif
6892#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006895#endif
6896#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006899#endif
6900#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006903#endif
6904#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006905 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006907#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006908
Hye-Shik Chang81268602004-02-02 06:05:24 +00006909#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6911 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6912 PyModule_AddIntMacro(m, BTPROTO_HCI);
6913 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006914#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006916#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006917#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006918#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006920#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6922 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006923#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6926 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006927#endif
6928
Charles-François Natali47413c12011-10-06 19:47:44 +02006929#ifdef AF_CAN
6930 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006932#endif
6933#ifdef PF_CAN
6934 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006936#endif
6937
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006938/* Reliable Datagram Sockets */
6939#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006941#endif
6942#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006944#endif
6945
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006946/* Kernel event messages */
6947#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006948 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006949#endif
6950#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006952#endif
6953
Antoine Pitroub156a462010-10-27 20:13:57 +00006954#ifdef AF_PACKET
6955 PyModule_AddIntMacro(m, AF_PACKET);
6956#endif
6957#ifdef PF_PACKET
6958 PyModule_AddIntMacro(m, PF_PACKET);
6959#endif
6960#ifdef PACKET_HOST
6961 PyModule_AddIntMacro(m, PACKET_HOST);
6962#endif
6963#ifdef PACKET_BROADCAST
6964 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6965#endif
6966#ifdef PACKET_MULTICAST
6967 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6968#endif
6969#ifdef PACKET_OTHERHOST
6970 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6971#endif
6972#ifdef PACKET_OUTGOING
6973 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6974#endif
6975#ifdef PACKET_LOOPBACK
6976 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6977#endif
6978#ifdef PACKET_FASTROUTE
6979 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006980#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006981
Christian Heimes043d6f62008-01-07 17:19:16 +00006982#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6987 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6988 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006989
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6991 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6992 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006994 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, SOL_TIPC);
6996 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6997 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6998 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6999 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007000
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7002 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7003 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7004 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007006 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7008 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007009#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007012#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7014 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7015 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7016 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7017 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7018 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007019#endif
7020
Christian Heimesdffa3942016-09-05 23:54:41 +02007021#ifdef HAVE_SOCKADDR_ALG
7022 /* Socket options */
7023 PyModule_AddIntMacro(m, ALG_SET_KEY);
7024 PyModule_AddIntMacro(m, ALG_SET_IV);
7025 PyModule_AddIntMacro(m, ALG_SET_OP);
7026 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7027 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7028 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7029
7030 /* Operations */
7031 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7032 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7033 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7034 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7035#endif
7036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, SOCK_STREAM);
7039 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007040/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007041#ifdef SOCK_RAW
7042 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007044#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007046#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007048#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007049#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007051#endif
7052#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007054#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007064#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007065#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007067#endif
7068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007081#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007084#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007086#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007087#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007090#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007118#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007119#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007121#endif
7122#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007124#endif
7125#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007127#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007128#ifdef SO_PASSSEC
7129 PyModule_AddIntMacro(m, SO_PASSSEC);
7130#endif
7131#ifdef SO_PEERSEC
7132 PyModule_AddIntMacro(m, SO_PEERSEC);
7133#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007134#ifdef SO_BINDTODEVICE
7135 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7136#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007137#ifdef SO_PRIORITY
7138 PyModule_AddIntMacro(m, SO_PRIORITY);
7139#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007140#ifdef SO_MARK
7141 PyModule_AddIntMacro(m, SO_MARK);
7142#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007143#ifdef SO_DOMAIN
7144 PyModule_AddIntMacro(m, SO_DOMAIN);
7145#endif
7146#ifdef SO_PROTOCOL
7147 PyModule_AddIntMacro(m, SO_PROTOCOL);
7148#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 /* Maximum number of connections for "listen" */
7151#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007155#endif
7156
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007157 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007158#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007160#endif
7161#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007163#endif
7164#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007166#endif
7167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 /* Flags for send, recv */
7169#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007198#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007199#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007201#endif
7202#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007204#endif
7205#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007207#endif
7208#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007210#endif
7211#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007213#endif
7214#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007216#endif
7217#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007219#endif
7220#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007222#endif
7223#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007225#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007226#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007228#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 /* Protocol level and numbers, usable for [gs]etsockopt */
7231#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007256#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007263#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007264#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007266#endif
7267#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7269 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007270#endif
7271#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7273 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7274 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007275
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7277 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7278 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007279#ifdef CAN_ISOTP
7280 PyModule_AddIntMacro(m, CAN_ISOTP);
7281#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007282#endif
7283#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7285 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7286 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7287 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007288#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007289#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7290 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7291#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007292#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007293 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007294 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7295 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7296 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7297 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7298 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7299 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7300 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7301 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7302 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7303 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7304 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7305 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7306#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007307#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007309#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007310#ifdef HAVE_SOCKADDR_ALG
7311 PyModule_AddIntMacro(m, SOL_ALG);
7312#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007313#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007315#endif
7316#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007318#endif
7319#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007321#endif
7322#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007324#endif
7325#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007327#endif
7328#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007333#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007341#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007372#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007396#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007405#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007411#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007431#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007432#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007437#endif
7438/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
7447
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007448#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007450#endif
7451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452 /* Some port configuration */
7453#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007455#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007456 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007458#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007460#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007462#endif
7463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464 /* Some reserved IP v.4 addresses */
7465#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007467#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007472#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007477#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007480#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007482#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007483 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007485#ifdef INADDR_ALLHOSTS_GROUP
7486 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7487 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007488#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007489 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007493#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007498#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007500#endif
7501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502 /* IPv4 [gs]etsockopt options */
7503#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007550#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007551#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007553#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7556#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007559#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007574 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007575#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007579#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007581#endif
7582#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007584#endif
7585#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007587#endif
7588#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007590#endif
7591#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007593#endif
7594#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007596#endif
7597#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007599#endif
7600#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007602#endif
7603#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007605#endif
7606#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007608#endif
7609#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007611#endif
7612#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007614#endif
7615#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007617#endif
7618#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007620#endif
7621#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007623#endif
7624#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007626#endif
7627#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007629#endif
7630#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007632#endif
7633#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007635#endif
7636#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007638#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007640 /* TCP options */
7641#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007676#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007677#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007679#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007680#ifdef TCP_CONGESTION
7681 PyModule_AddIntMacro(m, TCP_CONGESTION);
7682#endif
7683#ifdef TCP_USER_TIMEOUT
7684 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7685#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007686#ifdef TCP_NOTSENT_LOWAT
7687 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7688#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690 /* IPX options */
7691#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007693#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007694
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007695/* Reliable Datagram Sockets */
7696#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007698#endif
7699#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007701#endif
7702#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007704#endif
7705#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007707#endif
7708#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007710#endif
7711#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007713#endif
7714#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007716#endif
7717#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007719#endif
7720#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007722#endif
7723#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007725#endif
7726#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007728#endif
7729#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007731#endif
7732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007734#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007736#endif
7737#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007739#endif
7740#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007742#endif
7743#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007745#endif
7746#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007748#endif
7749#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007751#endif
7752#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007754#endif
7755#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007757#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007758#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007759 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007760#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007761#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007763#endif
7764#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007765 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007766#endif
7767#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007769#endif
7770#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007771 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007772#endif
7773#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007774 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007775#endif
7776#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007777 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007778#endif
7779#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007781#endif
7782#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007783 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007784#endif
7785#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007787#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007788#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007790#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007791#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007793#endif
7794#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007796#endif
7797#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007799#endif
7800#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007802#endif
7803#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007805#endif
7806#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007808#endif
7809#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007811#endif
7812#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007813 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007814#endif
7815#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007816 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007817#endif
7818#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007819 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007820#endif
7821#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007822 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007823#endif
7824#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007825 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007826#endif
7827#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007828 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007829#endif
7830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007832#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007833 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007834#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007835 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007836#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007838#endif
7839#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007840 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007841#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007842 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007843#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007844 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007845#endif
7846#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007848#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007849 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007850#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007851 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007852#endif
7853
Christian Heimesfaf2f632008-01-06 16:59:19 +00007854#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007855 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007856 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7857#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007858 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007859#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007860 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007861 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7862#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007863 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007864#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007865 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007866 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007867 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007868 PyObject *tmp;
7869 tmp = PyLong_FromUnsignedLong(codes[i]);
7870 if (tmp == NULL)
7871 return NULL;
7872 PyModule_AddObject(m, names[i], tmp);
7873 }
7874 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007875 PyModule_AddIntMacro(m, RCVALL_OFF);
7876 PyModule_AddIntMacro(m, RCVALL_ON);
7877 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007878#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007880#endif
7881#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007883#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007884#endif /* _MSTCPIP_ */
7885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007886 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007887#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007888 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007890 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007891}