blob: ea01a286874baaf916e2c26e3ec9e96d9affc5b5 [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 */
Miss Islington (bot)bf8e9d12018-08-16 03:29:20 -0400306#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800307
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -0800308/* remove some flags on older version Windows during run-time.
309 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
310typedef struct {
311 DWORD build_number; /* available starting with this Win10 BuildNumber */
312 const char flag_name[20];
313} FlagRuntimeInfo;
314
315/* IMPORTANT: make sure the list ordered by descending build_number */
316static FlagRuntimeInfo win_runtime_flags[] = {
317 /* available starting with Windows 10 1709 */
318 {16299, "TCP_KEEPIDLE"},
319 {16299, "TCP_KEEPINTVL"},
320 /* available starting with Windows 10 1703 */
321 {15063, "TCP_KEEPCNT"},
322 /* available starting with Windows 10 1607 */
323 {14393, "TCP_FASTOPEN"}
324};
325
326static void
327remove_unusable_flags(PyObject *m)
328{
329 PyObject *dict;
330 OSVERSIONINFOEX info;
331 DWORDLONG dwlConditionMask;
332
333 dict = PyModule_GetDict(m);
334 if (dict == NULL) {
335 return;
336 }
337
338 /* set to Windows 10, except BuildNumber. */
339 memset(&info, 0, sizeof(info));
340 info.dwOSVersionInfoSize = sizeof(info);
341 info.dwMajorVersion = 10;
342 info.dwMinorVersion = 0;
343
344 /* set Condition Mask */
345 dwlConditionMask = 0;
346 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
347 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
348 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
349
350 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
351 info.dwBuildNumber = win_runtime_flags[i].build_number;
352 /* greater than or equal to the specified version?
353 Compatibility Mode will not cheat VerifyVersionInfo(...) */
354 if (VerifyVersionInfo(
355 &info,
356 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
357 dwlConditionMask)) {
358 break;
359 }
360 else {
361 if (PyDict_GetItemString(
362 dict,
363 win_runtime_flags[i].flag_name) != NULL) {
364 PyDict_DelItemString(
365 dict,
366 win_runtime_flags[i].flag_name);
367 }
368 }
369 }
370}
371
Jeremy Hylton22308652001-02-02 03:23:09 +0000372#endif
373
Skip Montanaro7befb992004-02-10 16:50:21 +0000374#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000375
Neal Norwitz39d22e52002-11-02 19:55:21 +0000376#ifndef O_NONBLOCK
377# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000378#endif
379
Trent Micka708d6e2004-09-07 17:48:26 +0000380/* include Python's addrinfo.h unless it causes trouble */
381#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
382 /* Do not include addinfo.h on some newer IRIX versions.
383 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
384 * for example, but not by 6.5.10.
385 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000386#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000387 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
388 * EAI_* constants are defined in (the already included) ws2tcpip.h.
389 */
390#else
391# include "addrinfo.h"
392#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000393
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000394#ifdef __APPLE__
395/* On OS X, getaddrinfo returns no error indication of lookup
396 failure, so we must use the emulation instead of the libinfo
397 implementation. Unfortunately, performing an autoconf test
398 for this bug would require DNS access for the machine performing
399 the configuration, which is not acceptable. Therefore, we
400 determine the bug just by checking for __APPLE__. If this bug
401 gets ever fixed, perhaps checking for sys/version.h would be
402 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000403#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600404/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000405 Find to check for Jaguar is that it has getnameinfo(), which
406 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000407#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000408#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409
410#ifdef HAVE_INET_ATON
411#define USE_INET_ATON_WEAKLINK
412#endif
413
Jack Jansen84262fb2002-07-02 14:40:42 +0000414#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000415
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000416/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000418/* avoid clashes with the C library definition of the symbol. */
419#define getaddrinfo fake_getaddrinfo
420#define gai_strerror fake_gai_strerror
421#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000422#include "getaddrinfo.c"
423#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000424#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000425#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000426#include "getnameinfo.c"
427#endif
428
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000429#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000430#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000431#endif
432
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000433#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000434#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000435#define EAFNOSUPPORT WSAEAFNOSUPPORT
436#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000438
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000439#ifndef SOCKETCLOSE
440#define SOCKETCLOSE close
441#endif
442
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000443#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000444#define USE_BLUETOOTH 1
445#if defined(__FreeBSD__)
446#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
447#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000448#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000449#define SOL_HCI SOL_HCI_RAW
450#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000451#define sockaddr_l2 sockaddr_l2cap
452#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000454#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
455#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000456#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000457#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458#define sockaddr_l2 sockaddr_bt
459#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000462#define SOL_HCI BTPROTO_HCI
463#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
465#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000466#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000468#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000469#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
470#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000471#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000472#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
473#endif
474#endif
475
Charles-François Natali8b759652011-12-23 16:44:51 +0100476/* Convert "sock_addr_t *" to "struct sockaddr *". */
477#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000478
Martin v. Löwise9416172003-05-03 10:12:45 +0000479/*
480 * Constants for getnameinfo()
481 */
482#if !defined(NI_MAXHOST)
483#define NI_MAXHOST 1025
484#endif
485#if !defined(NI_MAXSERV)
486#define NI_MAXSERV 32
487#endif
488
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000489#ifndef INVALID_SOCKET /* MS defines this */
490#define INVALID_SOCKET (-1)
491#endif
492
Charles-François Natali0cc86852013-09-13 19:53:08 +0200493#ifndef INADDR_NONE
494#define INADDR_NONE (-1)
495#endif
496
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000497/* XXX There's a problem here: *static* functions are not supposed to have
498 a Py prefix (or use CapitalizedWords). Later... */
499
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500/* Global variable holding the exception type for errors detected
501 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000502static PyObject *socket_herror;
503static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000504static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505
Tim Peters643a7fc2002-02-17 04:13:21 +0000506/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000507 The sock_type variable contains pointers to various functions,
508 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000509 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000510static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000511
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000512#if defined(HAVE_POLL_H)
513#include <poll.h>
514#elif defined(HAVE_SYS_POLL_H)
515#include <sys/poll.h>
516#endif
517
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000518/* Largest value to try to store in a socklen_t (used when handling
519 ancillary data). POSIX requires socklen_t to hold at least
520 (2**31)-1 and recommends against storing larger values, but
521 socklen_t was originally int in the BSD interface, so to be on the
522 safe side we use the smaller of (2**31)-1 and INT_MAX. */
523#if INT_MAX > 0x7fffffff
524#define SOCKLEN_T_LIMIT 0x7fffffff
525#else
526#define SOCKLEN_T_LIMIT INT_MAX
527#endif
528
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200529#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000530/* Instead of select(), we'll use poll() since poll() works on any fd. */
531#define IS_SELECTABLE(s) 1
532/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000533#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200534/* If there's no timeout left, we don't have to call select, so it's a safe,
535 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100536#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000537#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000538
539static PyObject*
540select_error(void)
541{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200542 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000544}
545
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000546#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000547#ifndef WSAEAGAIN
548#define WSAEAGAIN WSAEWOULDBLOCK
549#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000550#define CHECK_ERRNO(expected) \
551 (WSAGetLastError() == WSA ## expected)
552#else
553#define CHECK_ERRNO(expected) \
554 (errno == expected)
555#endif
556
Victor Stinnerdaf45552013-08-28 00:53:59 +0200557#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200558# define GET_SOCK_ERROR WSAGetLastError()
559# define SET_SOCK_ERROR(err) WSASetLastError(err)
560# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
561# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300562# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200563#else
564# define GET_SOCK_ERROR errno
565# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
566# define SOCK_TIMEOUT_ERR EWOULDBLOCK
567# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300568# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200569#endif
570
571
572#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200573/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
574static int support_wsa_no_inherit = -1;
575#endif
576
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577/* Convenience function to raise an error according to errno
578 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579
Guido van Rossum73624e91994-10-10 17:59:00 +0000580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000581set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000583#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 int err_no = WSAGetLastError();
585 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
586 recognizes the error codes used by both GetLastError() and
587 WSAGetLastError */
588 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200589 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000590#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000591
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200592 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593}
594
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
601#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000603#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (v != NULL) {
607 PyErr_SetObject(socket_herror, v);
608 Py_DECREF(v);
609 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612}
613
614
615static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000616set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619
Martin v. Löwis272cb402002-03-01 08:31:07 +0000620#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* EAI_SYSTEM is not available on Windows XP. */
622 if (error == EAI_SYSTEM)
623 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000624#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000626#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000628#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (v != NULL) {
632 PyErr_SetObject(socket_gaierror, v);
633 Py_DECREF(v);
634 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637}
638
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000639/* Function to perform the setting of socket blocking mode
640 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641static int
642internal_setblocking(PySocketSockObject *s, int block)
643{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400644 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200645#ifdef MS_WINDOWS
646 u_long arg;
647#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100648#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100649 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100650 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100655#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200657 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400658 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100659#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200661 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400662 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100664 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 else
Victor Stinner9a954832013-12-04 00:41:24 +0100666 new_delay_flag = delay_flag | O_NONBLOCK;
667 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200668 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400669 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100670#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200672 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200673 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400674 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400676
677 result = 0;
678
679 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000681
Yury Selivanovfa22b292016-10-18 16:03:52 -0400682 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200683#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400684 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200685#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400686 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200687#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400688 }
689
690 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691}
692
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000693static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200694internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
695 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100698#ifdef HAVE_POLL
699 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200700 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100701#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200702 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200703 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100704#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000705
Victor Stinnerb7df3142015-03-27 22:59:32 +0100706 /* must be called with the GIL held */
707 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100708
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200710 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200713 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* Prefer poll, if available, since you can poll() any fd
717 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000718#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100719 pollfd.fd = s->sock_fd;
720 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 if (connect) {
722 /* On Windows, the socket becomes writable on connection success,
723 but a connection failure is notified as an error. On POSIX, the
724 socket becomes writable on connection success or on connection
725 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200726 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200727 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728
Victor Stinner71694d52015-03-28 01:18:54 +0100729 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200730 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200731 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000732
Victor Stinner71694d52015-03-28 01:18:54 +0100733 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200734 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100735 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000736#else
Victor Stinnerced11742015-04-09 10:27:25 +0200737 if (interval >= 0) {
738 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
739 tvp = &tv;
740 }
741 else
742 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000743
Victor Stinner71694d52015-03-28 01:18:54 +0100744 FD_ZERO(&fds);
745 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200746 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 if (connect) {
748 /* On Windows, the socket becomes writable on connection success,
749 but a connection failure is notified as an error. On POSIX, the
750 socket becomes writable on connection success or on connection
751 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200752 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200753 }
Victor Stinner71694d52015-03-28 01:18:54 +0100754
755 /* See if the socket is ready */
756 Py_BEGIN_ALLOW_THREADS;
757 if (writing)
758 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200759 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100760 else
761 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200762 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100763 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000764#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 if (n < 0)
767 return -1;
768 if (n == 0)
769 return 1;
770 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000771}
772
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000774
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 On error, raise an exception and return -1 if err is set, or fill err and
776 return -1 otherwise. If a signal was received and the signal handler raised
777 an exception, return -1, and set err to -1 if err is set.
778
779 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100780
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781 If the socket has a timeout, wait until the socket is ready before calling
782 the function: wait until the socket is writable if writing is nonzero, wait
783 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100784
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786 the function, except if the signal handler raised an exception (PEP 475).
787
788 When the function is retried, recompute the timeout using a monotonic clock.
789
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 sock_call_ex() must be called with the GIL held. The socket function is
791 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200793sock_call_ex(PySocketSockObject *s,
794 int writing,
795 int (*sock_func) (PySocketSockObject *s, void *data),
796 void *data,
797 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200798 int *err,
799 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200800{
Victor Stinner8912d142015-04-06 23:16:34 +0200801 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200802 _PyTime_t deadline = 0;
803 int deadline_initialized = 0;
804 int res;
805
806 /* sock_call() must be called with the GIL held. */
807 assert(PyGILState_Check());
808
809 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200810 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 /* For connect(), poll even for blocking socket. The connection
813 runs asynchronously. */
814 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200816 _PyTime_t interval;
817
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 if (deadline_initialized) {
819 /* recompute the timeout */
820 interval = deadline - _PyTime_GetMonotonicClock();
821 }
822 else {
823 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200824 deadline = _PyTime_GetMonotonicClock() + timeout;
825 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200826 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827
Victor Stinner10550cd2015-04-03 13:22:27 +0200828 if (interval >= 0)
829 res = internal_select(s, writing, interval, connect);
830 else
831 res = 1;
832 }
833 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200834 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200835 }
836
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 if (err)
839 *err = GET_SOCK_ERROR;
840
Victor Stinner31bf2d52015-04-01 21:57:09 +0200841 if (CHECK_ERRNO(EINTR)) {
842 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 if (PyErr_CheckSignals()) {
844 if (err)
845 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200846 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200847 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848
849 /* retry select() */
850 continue;
851 }
852
853 /* select() failed */
854 s->errorhandler();
855 return -1;
856 }
857
858 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200859 if (err)
860 *err = SOCK_TIMEOUT_ERR;
861 else
862 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200863 return -1;
864 }
865
866 /* the socket is ready */
867 }
868
Victor Stinner81c41db2015-04-02 11:50:57 +0200869 /* inner loop to retry sock_func() when sock_func() is interrupted
870 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200871 while (1) {
872 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200873 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 Py_END_ALLOW_THREADS
875
876 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200877 /* sock_func() succeeded */
878 if (err)
879 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200880 return 0;
881 }
882
Victor Stinner81c41db2015-04-02 11:50:57 +0200883 if (err)
884 *err = GET_SOCK_ERROR;
885
Victor Stinner31bf2d52015-04-01 21:57:09 +0200886 if (!CHECK_ERRNO(EINTR))
887 break;
888
Victor Stinner81c41db2015-04-02 11:50:57 +0200889 /* sock_func() was interrupted by a signal */
890 if (PyErr_CheckSignals()) {
891 if (err)
892 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200893 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200894 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200897 }
898
899 if (s->sock_timeout > 0
900 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200901 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902
903 For example, select() could indicate a socket is ready for
904 reading, but the data then discarded by the OS because of a
905 wrong checksum.
906
907 Loop on select() to recheck for socket readyness. */
908 continue;
909 }
910
Victor Stinner81c41db2015-04-02 11:50:57 +0200911 /* sock_func() failed */
912 if (!err)
913 s->errorhandler();
914 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000915 return -1;
916 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200917}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000918
Victor Stinner81c41db2015-04-02 11:50:57 +0200919static int
920sock_call(PySocketSockObject *s,
921 int writing,
922 int (*func) (PySocketSockObject *s, void *data),
923 void *data)
924{
Victor Stinner8912d142015-04-06 23:16:34 +0200925 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200926}
927
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000928
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000929/* Initialize a new socket object. */
930
Victor Stinner88ed6402015-04-09 10:23:12 +0200931/* Default timeout for new sockets */
932static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000933
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200934static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000935init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 s->sock_fd = fd;
939 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500942
943 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
944 on some OSes as part of socket.type. We want to reset them here,
945 to make socket.type be set to the same value on all platforms.
946 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
947 not portable.
948 */
949#ifdef SOCK_NONBLOCK
950 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
951#endif
952#ifdef SOCK_CLOEXEC
953 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
954#endif
955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000959#ifdef SOCK_NONBLOCK
960 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100961 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000962 else
963#endif
964 {
965 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200966 if (defaulttimeout >= 0) {
967 if (internal_setblocking(s, 0) == -1) {
968 return -1;
969 }
970 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000971 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200972 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000973}
974
975
Guido van Rossum30a685f1991-06-27 15:51:29 +0000976/* Create a new socket object.
977 This just creates the object and initializes it.
978 If the creation fails, return NULL and set an exception (implicit
979 in NEWOBJ()). */
980
Guido van Rossum73624e91994-10-10 17:59:00 +0000981static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000982new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 PySocketSockObject *s;
985 s = (PySocketSockObject *)
986 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200987 if (s == NULL)
988 return NULL;
989 if (init_sockobject(s, fd, family, type, proto) == -1) {
990 Py_DECREF(s);
991 return NULL;
992 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994}
995
Guido van Rossum30a685f1991-06-27 15:51:29 +0000996
Guido van Rossum48a680c2001-03-02 06:34:14 +0000997/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000998 thread to be in gethostbyname or getaddrinfo */
999#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001000static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001001#endif
1002
1003
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004/* Convert a string specifying a host name or one of a few symbolic
1005 names to a numeric IP address. This usually calls gethostbyname()
1006 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001007 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008 an error occurred; then an exception is raised. */
1009
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001011setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 struct addrinfo hints, *res;
1014 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1017 if (name[0] == '\0') {
1018 int siz;
1019 memset(&hints, 0, sizeof(hints));
1020 hints.ai_family = af;
1021 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1022 hints.ai_flags = AI_PASSIVE;
1023 Py_BEGIN_ALLOW_THREADS
1024 ACQUIRE_GETADDRINFO_LOCK
1025 error = getaddrinfo(NULL, "0", &hints, &res);
1026 Py_END_ALLOW_THREADS
1027 /* We assume that those thread-unsafe getaddrinfo() versions
1028 *are* safe regarding their return value, ie. that a
1029 subsequent call to getaddrinfo() does not destroy the
1030 outcome of the first call. */
1031 RELEASE_GETADDRINFO_LOCK
1032 if (error) {
1033 set_gaierror(error);
1034 return -1;
1035 }
1036 switch (res->ai_family) {
1037 case AF_INET:
1038 siz = 4;
1039 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001040#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case AF_INET6:
1042 siz = 16;
1043 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 default:
1046 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001047 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 "unsupported address family");
1049 return -1;
1050 }
1051 if (res->ai_next) {
1052 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001053 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 "wildcard resolved to multiple address");
1055 return -1;
1056 }
1057 if (res->ai_addrlen < addr_ret_size)
1058 addr_ret_size = res->ai_addrlen;
1059 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1060 freeaddrinfo(res);
1061 return siz;
1062 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001063 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001064 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001065 if (strcmp(name, "255.255.255.255") == 0 ||
1066 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 struct sockaddr_in *sin;
1068 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001069 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 "address family mismatched");
1071 return -1;
1072 }
1073 sin = (struct sockaddr_in *)addr_ret;
1074 memset((void *) sin, '\0', sizeof(*sin));
1075 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001076#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 sin->sin_addr.s_addr = INADDR_BROADCAST;
1080 return sizeof(sin->sin_addr);
1081 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001082
1083 /* avoid a name resolution in case of numeric address */
1084#ifdef HAVE_INET_PTON
1085 /* check for an IPv4 address */
1086 if (af == AF_UNSPEC || af == AF_INET) {
1087 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1088 memset(sin, 0, sizeof(*sin));
1089 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1090 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001091#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001092 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001093#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001094 return 4;
1095 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001097#ifdef ENABLE_IPV6
1098 /* check for an IPv6 address - if the address contains a scope ID, we
1099 * fallback to getaddrinfo(), which can handle translation from interface
1100 * name to interface index */
1101 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1102 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1103 memset(sin, 0, sizeof(*sin));
1104 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1105 sin->sin6_family = AF_INET6;
1106#ifdef HAVE_SOCKADDR_SA_LEN
1107 sin->sin6_len = sizeof(*sin);
1108#endif
1109 return 16;
1110 }
1111 }
1112#endif /* ENABLE_IPV6 */
1113#else /* HAVE_INET_PTON */
1114 /* check for an IPv4 address */
1115 if (af == AF_INET || af == AF_UNSPEC) {
1116 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1117 memset(sin, 0, sizeof(*sin));
1118 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1119 sin->sin_family = AF_INET;
1120#ifdef HAVE_SOCKADDR_SA_LEN
1121 sin->sin_len = sizeof(*sin);
1122#endif
1123 return 4;
1124 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001125 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001126#endif /* HAVE_INET_PTON */
1127
1128 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 memset(&hints, 0, sizeof(hints));
1130 hints.ai_family = af;
1131 Py_BEGIN_ALLOW_THREADS
1132 ACQUIRE_GETADDRINFO_LOCK
1133 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001134#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 if (error == EAI_NONAME && af == AF_UNSPEC) {
1136 /* On Tru64 V5.1, numeric-to-addr conversion fails
1137 if no address family is given. Assume IPv4 for now.*/
1138 hints.ai_family = AF_INET;
1139 error = getaddrinfo(name, NULL, &hints, &res);
1140 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 Py_END_ALLOW_THREADS
1143 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1144 if (error) {
1145 set_gaierror(error);
1146 return -1;
1147 }
1148 if (res->ai_addrlen < addr_ret_size)
1149 addr_ret_size = res->ai_addrlen;
1150 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1151 freeaddrinfo(res);
1152 switch (addr_ret->sa_family) {
1153 case AF_INET:
1154 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001155#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 case AF_INET6:
1157 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001160 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 return -1;
1162 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163}
1164
Guido van Rossum30a685f1991-06-27 15:51:29 +00001165
Miss Islington (bot)04425992018-02-12 12:12:24 -08001166/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167
Guido van Rossum73624e91994-10-10 17:59:00 +00001168static PyObject *
Miss Islington (bot)04425992018-02-12 12:12:24 -08001169make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170{
Miss Islington (bot)04425992018-02-12 12:12:24 -08001171 char buf[INET_ADDRSTRLEN];
1172 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1173 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 return NULL;
1175 }
1176 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177}
1178
Miss Islington (bot)04425992018-02-12 12:12:24 -08001179#ifdef ENABLE_IPV6
1180/* Convert IPv6 sockaddr to a Python str. */
1181
1182static PyObject *
1183make_ipv6_addr(const struct sockaddr_in6 *addr)
1184{
1185 char buf[INET6_ADDRSTRLEN];
1186 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1187 PyErr_SetFromErrno(PyExc_OSError);
1188 return NULL;
1189 }
1190 return PyUnicode_FromString(buf);
1191}
1192#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001193
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001194#ifdef USE_BLUETOOTH
1195/* Convert a string representation of a Bluetooth address into a numeric
1196 address. Returns the length (6), or raises an exception and returns -1 if
1197 an error occurred. */
1198
1199static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001200setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 unsigned int b0, b1, b2, b3, b4, b5;
1203 char ch;
1204 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1207 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1208 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1209 bdaddr->b[0] = b0;
1210 bdaddr->b[1] = b1;
1211 bdaddr->b[2] = b2;
1212 bdaddr->b[3] = b3;
1213 bdaddr->b[4] = b4;
1214 bdaddr->b[5] = b5;
1215 return 6;
1216 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001217 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return -1;
1219 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001220}
1221
1222/* Create a string representation of the Bluetooth address. This is always a
1223 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1224 value (zero padded if necessary). */
1225
1226static PyObject *
1227makebdaddr(bdaddr_t *bdaddr)
1228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1232 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1233 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1234 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001235}
1236#endif
1237
1238
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239/* Create an object representing the given socket address,
1240 suitable for passing it back to bind(), connect() etc.
1241 The family field of the sockaddr structure is inspected
1242 to determine what kind of address it really is. */
1243
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001244/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001245static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001246makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 if (addrlen == 0) {
1249 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001250 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 case AF_INET:
1256 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001257 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1258 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 PyObject *ret = NULL;
1260 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1262 Py_DECREF(addrobj);
1263 }
1264 return ret;
1265 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001267#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 case AF_UNIX:
1269 {
1270 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001271#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001272 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1273 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1274 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 }
1276 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001277#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 {
1279 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001280 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 }
1282 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001283#endif /* AF_UNIX */
1284
Martin v. Löwis11017b12006-01-14 18:12:57 +00001285#if defined(AF_NETLINK)
1286 case AF_NETLINK:
1287 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1289 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001290 }
1291#endif /* AF_NETLINK */
1292
caaveryeffc12f2017-09-06 18:18:10 -04001293#if defined(AF_VSOCK)
1294 case AF_VSOCK:
1295 {
1296 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1297 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1298 }
1299#endif /* AF_VSOCK */
1300
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001301#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 case AF_INET6:
1303 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001304 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1305 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 PyObject *ret = NULL;
1307 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001308 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 addrobj,
1310 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001311 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 a->sin6_scope_id);
1313 Py_DECREF(addrobj);
1314 }
1315 return ret;
1316 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001317#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001318
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001319#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 case AF_BLUETOOTH:
1321 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 case BTPROTO_L2CAP:
1324 {
1325 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1326 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1327 PyObject *ret = NULL;
1328 if (addrobj) {
1329 ret = Py_BuildValue("Oi",
1330 addrobj,
1331 _BT_L2_MEMB(a, psm));
1332 Py_DECREF(addrobj);
1333 }
1334 return ret;
1335 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 case BTPROTO_RFCOMM:
1338 {
1339 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1340 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1341 PyObject *ret = NULL;
1342 if (addrobj) {
1343 ret = Py_BuildValue("Oi",
1344 addrobj,
1345 _BT_RC_MEMB(a, channel));
1346 Py_DECREF(addrobj);
1347 }
1348 return ret;
1349 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 case BTPROTO_HCI:
1352 {
1353 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001354#if defined(__NetBSD__) || defined(__DragonFly__)
1355 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001356#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 PyObject *ret = NULL;
1358 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1359 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001360#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001362
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001363#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 case BTPROTO_SCO:
1365 {
1366 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1367 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1368 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001369#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 default:
1372 PyErr_SetString(PyExc_ValueError,
1373 "Unknown Bluetooth protocol");
1374 return NULL;
1375 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001376#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001377
Antoine Pitroub156a462010-10-27 20:13:57 +00001378#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 case AF_PACKET:
1380 {
1381 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001382 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 struct ifreq ifr;
1384 /* need to look up interface name give index */
1385 if (a->sll_ifindex) {
1386 ifr.ifr_ifindex = a->sll_ifindex;
1387 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1388 ifname = ifr.ifr_name;
1389 }
1390 return Py_BuildValue("shbhy#",
1391 ifname,
1392 ntohs(a->sll_protocol),
1393 a->sll_pkttype,
1394 a->sll_hatype,
1395 a->sll_addr,
1396 a->sll_halen);
1397 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001398#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001399
Christian Heimes043d6f62008-01-07 17:19:16 +00001400#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 case AF_TIPC:
1402 {
1403 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1404 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1405 return Py_BuildValue("IIIII",
1406 a->addrtype,
1407 a->addr.nameseq.type,
1408 a->addr.nameseq.lower,
1409 a->addr.nameseq.upper,
1410 a->scope);
1411 } else if (a->addrtype == TIPC_ADDR_NAME) {
1412 return Py_BuildValue("IIIII",
1413 a->addrtype,
1414 a->addr.name.name.type,
1415 a->addr.name.name.instance,
1416 a->addr.name.name.instance,
1417 a->scope);
1418 } else if (a->addrtype == TIPC_ADDR_ID) {
1419 return Py_BuildValue("IIIII",
1420 a->addrtype,
1421 a->addr.id.node,
1422 a->addr.id.ref,
1423 0,
1424 a->scope);
1425 } else {
1426 PyErr_SetString(PyExc_ValueError,
1427 "Invalid address type");
1428 return NULL;
1429 }
1430 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001431#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001432
Serhiy Storchakad3187152017-11-09 18:00:38 +02001433#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001434 case AF_CAN:
1435 {
1436 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001437 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001438 struct ifreq ifr;
1439 /* need to look up interface name given index */
1440 if (a->can_ifindex) {
1441 ifr.ifr_ifindex = a->can_ifindex;
1442 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1443 ifname = ifr.ifr_name;
1444 }
1445
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001446 switch (proto) {
1447#ifdef CAN_ISOTP
1448 case CAN_ISOTP:
1449 {
1450 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1451 ifname,
1452 a->can_addr.tp.rx_id,
1453 a->can_addr.tp.tx_id);
1454 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001455#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001456 default:
1457 {
1458 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1459 ifname);
1460 }
1461 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001462 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001463#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001464
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001465#ifdef PF_SYSTEM
1466 case PF_SYSTEM:
1467 switch(proto) {
1468#ifdef SYSPROTO_CONTROL
1469 case SYSPROTO_CONTROL:
1470 {
1471 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1472 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1473 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001474#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001475 default:
1476 PyErr_SetString(PyExc_ValueError,
1477 "Invalid address type");
1478 return 0;
1479 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001480#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001481
Christian Heimesdffa3942016-09-05 23:54:41 +02001482#ifdef HAVE_SOCKADDR_ALG
1483 case AF_ALG:
1484 {
1485 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1486 return Py_BuildValue("s#s#HH",
1487 a->salg_type,
1488 strnlen((const char*)a->salg_type,
1489 sizeof(a->salg_type)),
1490 a->salg_name,
1491 strnlen((const char*)a->salg_name,
1492 sizeof(a->salg_name)),
1493 a->salg_feat,
1494 a->salg_mask);
1495 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001496#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 default:
1501 /* If we don't know the address family, don't raise an
1502 exception -- return it as an (int, bytes) tuple. */
1503 return Py_BuildValue("iy#",
1504 addr->sa_family,
1505 addr->sa_data,
1506 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509}
1510
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001511/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1512 (in particular, numeric IP addresses). */
1513struct maybe_idna {
1514 PyObject *obj;
1515 char *buf;
1516};
1517
1518static void
1519idna_cleanup(struct maybe_idna *data)
1520{
1521 Py_CLEAR(data->obj);
1522}
1523
1524static int
1525idna_converter(PyObject *obj, struct maybe_idna *data)
1526{
1527 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001528 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001529 if (obj == NULL) {
1530 idna_cleanup(data);
1531 return 1;
1532 }
1533 data->obj = NULL;
1534 len = -1;
1535 if (PyBytes_Check(obj)) {
1536 data->buf = PyBytes_AsString(obj);
1537 len = PyBytes_Size(obj);
1538 }
1539 else if (PyByteArray_Check(obj)) {
1540 data->buf = PyByteArray_AsString(obj);
1541 len = PyByteArray_Size(obj);
1542 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001543 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001544 if (PyUnicode_READY(obj) == -1) {
1545 return 0;
1546 }
1547 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001548 data->buf = PyUnicode_DATA(obj);
1549 len = PyUnicode_GET_LENGTH(obj);
1550 }
1551 else {
1552 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1553 if (!obj2) {
1554 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1555 return 0;
1556 }
1557 assert(PyBytes_Check(obj2));
1558 data->obj = obj2;
1559 data->buf = PyBytes_AS_STRING(obj2);
1560 len = PyBytes_GET_SIZE(obj2);
1561 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001562 }
1563 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001564 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1565 obj->ob_type->tp_name);
1566 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001567 }
1568 if (strlen(data->buf) != len) {
1569 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001570 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001571 return 0;
1572 }
1573 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001574}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575
1576/* Parse a socket address argument according to the socket object's
1577 address family. Return 1 if the address was in the proper format,
1578 0 of not. The address is returned through addr_ret, its length
1579 through len_ret. */
1580
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001582getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001586
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001587#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 case AF_UNIX:
1589 {
1590 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001591 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001592 int retval = 0;
1593
1594 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1595 allow embedded nulls on Linux. */
1596 if (PyUnicode_Check(args)) {
1597 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1598 return 0;
1599 }
1600 else
1601 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001602 if (!PyArg_Parse(args, "y*", &path)) {
1603 Py_DECREF(args);
1604 return retval;
1605 }
1606 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001609#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001610 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001612 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001613 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001615 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 }
1617 }
1618 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001619#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 {
1621 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001622 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001623 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001625 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001627 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 }
1629 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001630 memcpy(addr->sun_path, path.buf, path.len);
1631 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001632 retval = 1;
1633 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001634 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001635 Py_DECREF(args);
1636 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001638#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639
Martin v. Löwis11017b12006-01-14 18:12:57 +00001640#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 case AF_NETLINK:
1642 {
1643 struct sockaddr_nl* addr;
1644 int pid, groups;
1645 addr = (struct sockaddr_nl *)addr_ret;
1646 if (!PyTuple_Check(args)) {
1647 PyErr_Format(
1648 PyExc_TypeError,
1649 "getsockaddrarg: "
1650 "AF_NETLINK address must be tuple, not %.500s",
1651 Py_TYPE(args)->tp_name);
1652 return 0;
1653 }
1654 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1655 return 0;
1656 addr->nl_family = AF_NETLINK;
1657 addr->nl_pid = pid;
1658 addr->nl_groups = groups;
1659 *len_ret = sizeof(*addr);
1660 return 1;
1661 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001662#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001663
caaveryeffc12f2017-09-06 18:18:10 -04001664#if defined(AF_VSOCK)
1665 case AF_VSOCK:
1666 {
1667 struct sockaddr_vm* addr;
1668 int port, cid;
1669 addr = (struct sockaddr_vm *)addr_ret;
1670 memset(addr, 0, sizeof(struct sockaddr_vm));
1671 if (!PyTuple_Check(args)) {
1672 PyErr_Format(
1673 PyExc_TypeError,
1674 "getsockaddrarg: "
1675 "AF_VSOCK address must be tuple, not %.500s",
1676 Py_TYPE(args)->tp_name);
1677 return 0;
1678 }
1679 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1680 return 0;
1681 addr->svm_family = s->sock_family;
1682 addr->svm_port = port;
1683 addr->svm_cid = cid;
1684 *len_ret = sizeof(*addr);
1685 return 1;
1686 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001687#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001688
1689
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001690#ifdef AF_RDS
1691 case AF_RDS:
1692 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001693#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 case AF_INET:
1696 {
1697 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001698 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 int port, result;
1700 if (!PyTuple_Check(args)) {
1701 PyErr_Format(
1702 PyExc_TypeError,
1703 "getsockaddrarg: "
1704 "AF_INET address must be tuple, not %.500s",
1705 Py_TYPE(args)->tp_name);
1706 return 0;
1707 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001708 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1709 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 return 0;
1711 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001712 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001714 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 if (result < 0)
1716 return 0;
1717 if (port < 0 || port > 0xffff) {
1718 PyErr_SetString(
1719 PyExc_OverflowError,
1720 "getsockaddrarg: port must be 0-65535.");
1721 return 0;
1722 }
1723 addr->sin_family = AF_INET;
1724 addr->sin_port = htons((short)port);
1725 *len_ret = sizeof *addr;
1726 return 1;
1727 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001729#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 case AF_INET6:
1731 {
1732 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001733 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001734 int port, result;
1735 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 flowinfo = scope_id = 0;
1737 if (!PyTuple_Check(args)) {
1738 PyErr_Format(
1739 PyExc_TypeError,
1740 "getsockaddrarg: "
1741 "AF_INET6 address must be tuple, not %.500s",
1742 Py_TYPE(args)->tp_name);
1743 return 0;
1744 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001745 if (!PyArg_ParseTuple(args, "O&i|II",
1746 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 &scope_id)) {
1748 return 0;
1749 }
1750 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001751 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001753 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 if (result < 0)
1755 return 0;
1756 if (port < 0 || port > 0xffff) {
1757 PyErr_SetString(
1758 PyExc_OverflowError,
1759 "getsockaddrarg: port must be 0-65535.");
1760 return 0;
1761 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001762 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001763 PyErr_SetString(
1764 PyExc_OverflowError,
1765 "getsockaddrarg: flowinfo must be 0-1048575.");
1766 return 0;
1767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 addr->sin6_family = s->sock_family;
1769 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001770 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 addr->sin6_scope_id = scope_id;
1772 *len_ret = sizeof *addr;
1773 return 1;
1774 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001775#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001776
Hye-Shik Chang81268602004-02-02 06:05:24 +00001777#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 case AF_BLUETOOTH:
1779 {
1780 switch (s->sock_proto) {
1781 case BTPROTO_L2CAP:
1782 {
1783 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001784 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 addr = (struct sockaddr_l2 *)addr_ret;
1787 memset(addr, 0, sizeof(struct sockaddr_l2));
1788 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1789 if (!PyArg_ParseTuple(args, "si", &straddr,
1790 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001791 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 "wrong format");
1793 return 0;
1794 }
1795 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1796 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 *len_ret = sizeof *addr;
1799 return 1;
1800 }
1801 case BTPROTO_RFCOMM:
1802 {
1803 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001804 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 addr = (struct sockaddr_rc *)addr_ret;
1807 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1808 if (!PyArg_ParseTuple(args, "si", &straddr,
1809 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001810 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 "wrong format");
1812 return 0;
1813 }
1814 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1815 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 *len_ret = sizeof *addr;
1818 return 1;
1819 }
1820 case BTPROTO_HCI:
1821 {
1822 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001823#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001824 const char *straddr;
1825 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1826 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001827 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001828 "wrong format");
1829 return 0;
1830 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001831 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001832 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1833 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001834#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1836 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001837 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 "wrong format");
1839 return 0;
1840 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001841#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 *len_ret = sizeof *addr;
1843 return 1;
1844 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001845#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 case BTPROTO_SCO:
1847 {
1848 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001849 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 addr = (struct sockaddr_sco *)addr_ret;
1852 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1853 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001854 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 "wrong format");
1856 return 0;
1857 }
1858 straddr = PyBytes_AS_STRING(args);
1859 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1860 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 *len_ret = sizeof *addr;
1863 return 1;
1864 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001865#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001867 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return 0;
1869 }
1870 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001871#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001872
Antoine Pitroub156a462010-10-27 20:13:57 +00001873#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 case AF_PACKET:
1875 {
1876 struct sockaddr_ll* addr;
1877 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001878 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 int protoNumber;
1880 int hatype = 0;
1881 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001882 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 if (!PyTuple_Check(args)) {
1885 PyErr_Format(
1886 PyExc_TypeError,
1887 "getsockaddrarg: "
1888 "AF_PACKET address must be tuple, not %.500s",
1889 Py_TYPE(args)->tp_name);
1890 return 0;
1891 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001892 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001894 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return 0;
1896 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1897 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1898 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1899 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001900 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 return 0;
1902 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001903 if (haddr.buf && haddr.len > 8) {
1904 PyErr_SetString(PyExc_ValueError,
1905 "Hardware address must be 8 bytes or less");
1906 PyBuffer_Release(&haddr);
1907 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 }
1909 if (protoNumber < 0 || protoNumber > 0xffff) {
1910 PyErr_SetString(
1911 PyExc_OverflowError,
1912 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001913 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 return 0;
1915 }
1916 addr = (struct sockaddr_ll*)addr_ret;
1917 addr->sll_family = AF_PACKET;
1918 addr->sll_protocol = htons((short)protoNumber);
1919 addr->sll_ifindex = ifr.ifr_ifindex;
1920 addr->sll_pkttype = pkttype;
1921 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001922 if (haddr.buf) {
1923 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1924 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001926 else
1927 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001929 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 return 1;
1931 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001932#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001933
Christian Heimes043d6f62008-01-07 17:19:16 +00001934#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 case AF_TIPC:
1936 {
1937 unsigned int atype, v1, v2, v3;
1938 unsigned int scope = TIPC_CLUSTER_SCOPE;
1939 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 if (!PyTuple_Check(args)) {
1942 PyErr_Format(
1943 PyExc_TypeError,
1944 "getsockaddrarg: "
1945 "AF_TIPC address must be tuple, not %.500s",
1946 Py_TYPE(args)->tp_name);
1947 return 0;
1948 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 if (!PyArg_ParseTuple(args,
1951 "IIII|I;Invalid TIPC address format",
1952 &atype, &v1, &v2, &v3, &scope))
1953 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 addr = (struct sockaddr_tipc *) addr_ret;
1956 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 addr->family = AF_TIPC;
1959 addr->scope = scope;
1960 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 if (atype == TIPC_ADDR_NAMESEQ) {
1963 addr->addr.nameseq.type = v1;
1964 addr->addr.nameseq.lower = v2;
1965 addr->addr.nameseq.upper = v3;
1966 } else if (atype == TIPC_ADDR_NAME) {
1967 addr->addr.name.name.type = v1;
1968 addr->addr.name.name.instance = v2;
1969 } else if (atype == TIPC_ADDR_ID) {
1970 addr->addr.id.node = v1;
1971 addr->addr.id.ref = v2;
1972 } else {
1973 /* Shouldn't happen */
1974 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1975 return 0;
1976 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 return 1;
1981 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001982#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001983
Serhiy Storchakad3187152017-11-09 18:00:38 +02001984#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001985 case AF_CAN:
1986 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001987#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001988 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001989 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001990#endif
1991#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001992 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001993#endif
1994#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001995 {
1996 struct sockaddr_can *addr;
1997 PyObject *interfaceName;
1998 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001999 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002000 addr = (struct sockaddr_can *)addr_ret;
2001
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
2003 &interfaceName))
2004 return 0;
2005
2006 len = PyBytes_GET_SIZE(interfaceName);
2007
2008 if (len == 0) {
2009 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002010 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002011 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2012 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002013 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2014 s->errorhandler();
2015 Py_DECREF(interfaceName);
2016 return 0;
2017 }
2018 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002019 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002020 "AF_CAN interface name too long");
2021 Py_DECREF(interfaceName);
2022 return 0;
2023 }
2024
2025 addr->can_family = AF_CAN;
2026 addr->can_ifindex = ifr.ifr_ifindex;
2027
2028 *len_ret = sizeof(*addr);
2029 Py_DECREF(interfaceName);
2030 return 1;
2031 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002032#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002033
2034#ifdef CAN_ISOTP
2035 case CAN_ISOTP:
2036 {
2037 struct sockaddr_can *addr;
2038 PyObject *interfaceName;
2039 struct ifreq ifr;
2040 Py_ssize_t len;
2041 unsigned long int rx_id, tx_id;
2042
2043 addr = (struct sockaddr_can *)addr_ret;
2044
2045 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2046 &interfaceName,
2047 &rx_id,
2048 &tx_id))
2049 return 0;
2050
2051 len = PyBytes_GET_SIZE(interfaceName);
2052
2053 if (len == 0) {
2054 ifr.ifr_ifindex = 0;
2055 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2056 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2057 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2058 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2059 s->errorhandler();
2060 Py_DECREF(interfaceName);
2061 return 0;
2062 }
2063 } else {
2064 PyErr_SetString(PyExc_OSError,
2065 "AF_CAN interface name too long");
2066 Py_DECREF(interfaceName);
2067 return 0;
2068 }
2069
2070 addr->can_family = AF_CAN;
2071 addr->can_ifindex = ifr.ifr_ifindex;
2072 addr->can_addr.tp.rx_id = rx_id;
2073 addr->can_addr.tp.tx_id = tx_id;
2074
2075 *len_ret = sizeof(*addr);
2076 Py_DECREF(interfaceName);
2077 return 1;
2078 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002079#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002080 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002081 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002082 "getsockaddrarg: unsupported CAN protocol");
2083 return 0;
2084 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002085#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002086
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002087#ifdef PF_SYSTEM
2088 case PF_SYSTEM:
2089 switch (s->sock_proto) {
2090#ifdef SYSPROTO_CONTROL
2091 case SYSPROTO_CONTROL:
2092 {
2093 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002094
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002095 addr = (struct sockaddr_ctl *)addr_ret;
2096 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002097 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002098
2099 if (PyUnicode_Check(args)) {
2100 struct ctl_info info;
2101 PyObject *ctl_name;
2102
2103 if (!PyArg_Parse(args, "O&",
2104 PyUnicode_FSConverter, &ctl_name)) {
2105 return 0;
2106 }
2107
Victor Stinnerf50e1872015-03-20 11:32:24 +01002108 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002109 PyErr_SetString(PyExc_ValueError,
2110 "provided string is too long");
2111 Py_DECREF(ctl_name);
2112 return 0;
2113 }
2114 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2115 sizeof(info.ctl_name));
2116 Py_DECREF(ctl_name);
2117
2118 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2119 PyErr_SetString(PyExc_OSError,
2120 "cannot find kernel control with provided name");
2121 return 0;
2122 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002123
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002124 addr->sc_id = info.ctl_id;
2125 addr->sc_unit = 0;
2126 } else if (!PyArg_ParseTuple(args, "II",
2127 &(addr->sc_id), &(addr->sc_unit))) {
2128 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2129 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002130
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002131 return 0;
2132 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002133
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002134 *len_ret = sizeof(*addr);
2135 return 1;
2136 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002137#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002138 default:
2139 PyErr_SetString(PyExc_OSError,
2140 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2141 return 0;
2142 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002143#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002144#ifdef HAVE_SOCKADDR_ALG
2145 case AF_ALG:
2146 {
2147 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002148 const char *type;
2149 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002150 sa = (struct sockaddr_alg *)addr_ret;
2151
2152 memset(sa, 0, sizeof(*sa));
2153 sa->salg_family = AF_ALG;
2154
2155 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2156 &type, &name, &sa->salg_feat, &sa->salg_mask))
2157 return 0;
2158 /* sockaddr_alg has fixed-sized char arrays for type and name */
2159 if (strlen(type) > sizeof(sa->salg_type)) {
2160 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2161 return 0;
2162 }
2163 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2164 if (strlen(name) > sizeof(sa->salg_name)) {
2165 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2166 return 0;
2167 }
2168 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2169
2170 *len_ret = sizeof(*sa);
2171 return 1;
2172 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002173#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002178 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002182}
2183
Guido van Rossum30a685f1991-06-27 15:51:29 +00002184
Guido van Rossum48a680c2001-03-02 06:34:14 +00002185/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002186 Return 1 if the family is known, 0 otherwise. The length is returned
2187 through len_ret. */
2188
2189static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002190getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002193
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002194#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 case AF_UNIX:
2196 {
2197 *len_ret = sizeof (struct sockaddr_un);
2198 return 1;
2199 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002200#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002201
Martin v. Löwis11017b12006-01-14 18:12:57 +00002202#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002203 case AF_NETLINK:
2204 {
2205 *len_ret = sizeof (struct sockaddr_nl);
2206 return 1;
2207 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002208#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002209
caaveryeffc12f2017-09-06 18:18:10 -04002210#if defined(AF_VSOCK)
2211 case AF_VSOCK:
2212 {
2213 *len_ret = sizeof (struct sockaddr_vm);
2214 return 1;
2215 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002216#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002217
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002218#ifdef AF_RDS
2219 case AF_RDS:
2220 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002221#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 case AF_INET:
2224 {
2225 *len_ret = sizeof (struct sockaddr_in);
2226 return 1;
2227 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002228
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002229#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 case AF_INET6:
2231 {
2232 *len_ret = sizeof (struct sockaddr_in6);
2233 return 1;
2234 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002235#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002236
Hye-Shik Chang81268602004-02-02 06:05:24 +00002237#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 case AF_BLUETOOTH:
2239 {
2240 switch(s->sock_proto)
2241 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 case BTPROTO_L2CAP:
2244 *len_ret = sizeof (struct sockaddr_l2);
2245 return 1;
2246 case BTPROTO_RFCOMM:
2247 *len_ret = sizeof (struct sockaddr_rc);
2248 return 1;
2249 case BTPROTO_HCI:
2250 *len_ret = sizeof (struct sockaddr_hci);
2251 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002252#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 case BTPROTO_SCO:
2254 *len_ret = sizeof (struct sockaddr_sco);
2255 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002256#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002258 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 "unknown BT protocol");
2260 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 }
2263 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002264#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002265
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002266#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 case AF_PACKET:
2268 {
2269 *len_ret = sizeof (struct sockaddr_ll);
2270 return 1;
2271 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002272#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002273
Christian Heimes043d6f62008-01-07 17:19:16 +00002274#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 case AF_TIPC:
2276 {
2277 *len_ret = sizeof (struct sockaddr_tipc);
2278 return 1;
2279 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002280#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002281
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002282#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002283 case AF_CAN:
2284 {
2285 *len_ret = sizeof (struct sockaddr_can);
2286 return 1;
2287 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002288#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002289
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002290#ifdef PF_SYSTEM
2291 case PF_SYSTEM:
2292 switch(s->sock_proto) {
2293#ifdef SYSPROTO_CONTROL
2294 case SYSPROTO_CONTROL:
2295 *len_ret = sizeof (struct sockaddr_ctl);
2296 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002297#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002298 default:
2299 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2300 "unknown PF_SYSTEM protocol");
2301 return 0;
2302 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002303#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002304#ifdef HAVE_SOCKADDR_ALG
2305 case AF_ALG:
2306 {
2307 *len_ret = sizeof (struct sockaddr_alg);
2308 return 1;
2309 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002310#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002315 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002319}
2320
2321
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002322/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2323 Currently, these methods are only compiled if the RFC 2292/3542
2324 CMSG_LEN() macro is available. Older systems seem to have used
2325 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2326 it may be possible to define CMSG_LEN() that way if it's not
2327 provided. Some architectures might need extra padding after the
2328 cmsghdr, however, and CMSG_LEN() would have to take account of
2329 this. */
2330#ifdef CMSG_LEN
2331/* If length is in range, set *result to CMSG_LEN(length) and return
2332 true; otherwise, return false. */
2333static int
2334get_CMSG_LEN(size_t length, size_t *result)
2335{
2336 size_t tmp;
2337
2338 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2339 return 0;
2340 tmp = CMSG_LEN(length);
2341 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2342 return 0;
2343 *result = tmp;
2344 return 1;
2345}
2346
2347#ifdef CMSG_SPACE
2348/* If length is in range, set *result to CMSG_SPACE(length) and return
2349 true; otherwise, return false. */
2350static int
2351get_CMSG_SPACE(size_t length, size_t *result)
2352{
2353 size_t tmp;
2354
2355 /* Use CMSG_SPACE(1) here in order to take account of the padding
2356 necessary before *and* after the data. */
2357 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2358 return 0;
2359 tmp = CMSG_SPACE(length);
2360 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2361 return 0;
2362 *result = tmp;
2363 return 1;
2364}
2365#endif
2366
2367/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2368 pointer in msg->msg_control with at least "space" bytes after it,
2369 and its cmsg_len member inside the buffer. */
2370static int
2371cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2372{
2373 size_t cmsg_offset;
2374 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2375 sizeof(cmsgh->cmsg_len));
2376
Charles-François Natali466517d2011-08-28 18:23:43 +02002377 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002378 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002379 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002380 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2381 annoying under OS X as it's unsigned there and so it triggers a
2382 tautological comparison warning under Clang when compared against 0.
2383 Since the check is valid on other platforms, silence the warning under
2384 Clang. */
2385 #ifdef __clang__
2386 #pragma clang diagnostic push
2387 #pragma clang diagnostic ignored "-Wtautological-compare"
2388 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002389 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002390 #pragma GCC diagnostic push
2391 #pragma GCC diagnostic ignored "-Wtype-limits"
2392 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002393 if (msg->msg_controllen < 0)
2394 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002395 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002396 #pragma GCC diagnostic pop
2397 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002398 #ifdef __clang__
2399 #pragma clang diagnostic pop
2400 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002401 if (space < cmsg_len_end)
2402 space = cmsg_len_end;
2403 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2404 return (cmsg_offset <= (size_t)-1 - space &&
2405 cmsg_offset + space <= msg->msg_controllen);
2406}
2407
2408/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2409 *space to number of bytes following it in the buffer and return
2410 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2411 msg->msg_controllen are valid. */
2412static int
2413get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2414{
2415 size_t data_offset;
2416 char *data_ptr;
2417
2418 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2419 return 0;
2420 data_offset = data_ptr - (char *)msg->msg_control;
2421 if (data_offset > msg->msg_controllen)
2422 return 0;
2423 *space = msg->msg_controllen - data_offset;
2424 return 1;
2425}
2426
2427/* If cmsgh is invalid or not contained in the buffer pointed to by
2428 msg->msg_control, return -1. If cmsgh is valid and its associated
2429 data is entirely contained in the buffer, set *data_len to the
2430 length of the associated data and return 0. If only part of the
2431 associated data is contained in the buffer but cmsgh is otherwise
2432 valid, set *data_len to the length contained in the buffer and
2433 return 1. */
2434static int
2435get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2436{
2437 size_t space, cmsg_data_len;
2438
2439 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2440 cmsgh->cmsg_len < CMSG_LEN(0))
2441 return -1;
2442 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2443 if (!get_cmsg_data_space(msg, cmsgh, &space))
2444 return -1;
2445 if (space >= cmsg_data_len) {
2446 *data_len = cmsg_data_len;
2447 return 0;
2448 }
2449 *data_len = space;
2450 return 1;
2451}
2452#endif /* CMSG_LEN */
2453
2454
Victor Stinner31bf2d52015-04-01 21:57:09 +02002455struct sock_accept {
2456 socklen_t *addrlen;
2457 sock_addr_t *addrbuf;
2458 SOCKET_T result;
2459};
2460
2461#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2462/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2463static int accept4_works = -1;
2464#endif
2465
2466static int
2467sock_accept_impl(PySocketSockObject *s, void *data)
2468{
2469 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002470 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2471 socklen_t *paddrlen = ctx->addrlen;
2472#ifdef HAVE_SOCKADDR_ALG
2473 /* AF_ALG does not support accept() with addr and raises
2474 * ECONNABORTED instead. */
2475 if (s->sock_family == AF_ALG) {
2476 addr = NULL;
2477 paddrlen = NULL;
2478 *ctx->addrlen = 0;
2479 }
2480#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002481
2482#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2483 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002484 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002485 SOCK_CLOEXEC);
2486 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2487 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2488 accept4_works = (errno != ENOSYS);
2489 }
2490 }
2491 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002492 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002493#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002494 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002495#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002496
2497#ifdef MS_WINDOWS
2498 return (ctx->result != INVALID_SOCKET);
2499#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002500 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002501#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002502}
2503
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002504/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505
Guido van Rossum73624e91994-10-10 17:59:00 +00002506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002510 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 socklen_t addrlen;
2512 PyObject *sock = NULL;
2513 PyObject *addr = NULL;
2514 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002515 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (!getsockaddrlen(s, &addrlen))
2518 return NULL;
2519 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 if (!IS_SELECTABLE(s))
2522 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002523
Victor Stinner31bf2d52015-04-01 21:57:09 +02002524 ctx.addrlen = &addrlen;
2525 ctx.addrbuf = &addrbuf;
2526 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002528 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002529
Victor Stinnerdaf45552013-08-28 00:53:59 +02002530#ifdef MS_WINDOWS
2531 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2532 PyErr_SetFromWindowsErr(0);
2533 SOCKETCLOSE(newfd);
2534 goto finally;
2535 }
2536#else
2537
2538#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2539 if (!accept4_works)
2540#endif
2541 {
2542 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2543 SOCKETCLOSE(newfd);
2544 goto finally;
2545 }
2546 }
2547#endif
2548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 sock = PyLong_FromSocket_t(newfd);
2550 if (sock == NULL) {
2551 SOCKETCLOSE(newfd);
2552 goto finally;
2553 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2556 addrlen, s->sock_proto);
2557 if (addr == NULL)
2558 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002561
Guido van Rossum67f7a382002-06-06 21:08:16 +00002562finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 Py_XDECREF(sock);
2564 Py_XDECREF(addr);
2565 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002566}
2567
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002568PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002569"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002570\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002571Wait for an incoming connection. Return a new socket file descriptor\n\
2572representing the connection, and the address of the client.\n\
2573For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002574
Guido van Rossum11ba0942002-06-13 15:07:44 +00002575/* s.setblocking(flag) method. Argument:
2576 False -- non-blocking mode; same as settimeout(0)
2577 True -- blocking mode; same as settimeout(None)
2578*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002579
Guido van Rossum73624e91994-10-10 17:59:00 +00002580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002581sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002582{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002583 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 block = PyLong_AsLong(arg);
2586 if (block == -1 && PyErr_Occurred())
2587 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002588
Victor Stinner9001d802015-04-06 23:06:01 +02002589 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002590 if (internal_setblocking(s, block) == -1) {
2591 return NULL;
2592 }
2593 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002594}
Guido van Rossume4485b01994-09-07 14:32:49 +00002595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002596PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002597"setblocking(flag)\n\
2598\n\
2599Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002600setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002601setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002602
Yury Selivanovf11b4602018-01-28 17:27:38 -05002603/* s.getblocking() method.
2604 Returns True if socket is in blocking mode,
2605 False if it is in non-blocking mode.
2606*/
2607static PyObject *
2608sock_getblocking(PySocketSockObject *s)
2609{
2610 if (s->sock_timeout) {
2611 Py_RETURN_TRUE;
2612 }
2613 else {
2614 Py_RETURN_FALSE;
2615 }
2616}
2617
2618PyDoc_STRVAR(getblocking_doc,
2619"getblocking()\n\
2620\n\
2621Returns True if socket is in blocking mode, or False if it\n\
2622is in non-blocking mode.");
2623
Victor Stinner71694d52015-03-28 01:18:54 +01002624static int
2625socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2626{
2627#ifdef MS_WINDOWS
2628 struct timeval tv;
2629#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002630#ifndef HAVE_POLL
2631 _PyTime_t ms;
2632#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002633 int overflow = 0;
2634
2635 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002636 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002637 return 0;
2638 }
2639
Victor Stinner869e1772015-03-30 03:49:14 +02002640 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002641 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002642 return -1;
2643
2644 if (*timeout < 0) {
2645 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2646 return -1;
2647 }
2648
2649#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002650 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002651#endif
2652#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002653 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002654 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002655#endif
2656 if (overflow) {
2657 PyErr_SetString(PyExc_OverflowError,
2658 "timeout doesn't fit into C timeval");
2659 return -1;
2660 }
2661
2662 return 0;
2663}
2664
Guido van Rossum11ba0942002-06-13 15:07:44 +00002665/* s.settimeout(timeout) method. Argument:
2666 None -- no timeout, blocking mode; same as setblocking(True)
2667 0.0 -- non-blocking mode; same as setblocking(False)
2668 > 0 -- timeout mode; operations time out after timeout seconds
2669 < 0 -- illegal; raises an exception
2670*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002671static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002672sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002673{
Victor Stinner71694d52015-03-28 01:18:54 +01002674 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002675
Victor Stinner71694d52015-03-28 01:18:54 +01002676 if (socket_parse_timeout(&timeout, arg) < 0)
2677 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002680
2681 int block = timeout < 0;
2682 /* Blocking mode for a Python socket object means that operations
2683 like :meth:`recv` or :meth:`sendall` will block the execution of
2684 the current thread until they are complete or aborted with a
2685 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2686 the underlying FD is in a blocking mode. When timeout is a positive
2687 number, the FD is in a non-blocking mode, and socket ops are
2688 implemented with a `select()` call.
2689
2690 When timeout is 0.0, the FD is in a non-blocking mode.
2691
2692 This table summarizes all states in which the socket object and
2693 its underlying FD can be:
2694
2695 ==================== ===================== ==============
2696 `gettimeout()` `getblocking()` FD
2697 ==================== ===================== ==============
2698 ``None`` ``True`` blocking
2699 ``0.0`` ``False`` non-blocking
2700 ``> 0`` ``True`` non-blocking
2701 */
2702
2703 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002704 return NULL;
2705 }
2706 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707}
2708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002709PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002710"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002711\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002712Set a timeout on socket operations. 'timeout' can be a float,\n\
2713giving in seconds, or None. Setting a timeout of None disables\n\
2714the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002715Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002716
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002717/* s.gettimeout() method.
2718 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002720sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002721{
Victor Stinner71694d52015-03-28 01:18:54 +01002722 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002723 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 }
Victor Stinner71694d52015-03-28 01:18:54 +01002725 else {
2726 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2727 return PyFloat_FromDouble(seconds);
2728 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729}
2730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002732"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002733\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002734Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002735operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002736operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002737
Guido van Rossumaee08791992-09-08 09:05:33 +00002738/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002739 With an integer third argument, sets an integer optval with optlen=4.
2740 With None as third argument and an integer fourth argument, set
2741 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002742 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002743 use optional built-in module 'struct' to encode the string.
2744*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002745
Guido van Rossum73624e91994-10-10 17:59:00 +00002746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 int level;
2750 int optname;
2751 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002752 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002754 unsigned int optlen;
2755 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002756
caaveryeffc12f2017-09-06 18:18:10 -04002757#ifdef AF_VSOCK
2758 if (s->sock_family == AF_VSOCK) {
2759 uint64_t vflag; // Must be set width of 64 bits
2760 /* setsockopt(level, opt, flag) */
2761 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2762 &level, &optname, &vflag)) {
2763 // level should always be set to AF_VSOCK
2764 res = setsockopt(s->sock_fd, level, optname,
2765 (void*)&vflag, sizeof vflag);
2766 goto done;
2767 }
2768 return NULL;
2769 }
2770#endif
2771
Christian Heimesdffa3942016-09-05 23:54:41 +02002772 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 if (PyArg_ParseTuple(args, "iii:setsockopt",
2774 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002775 res = setsockopt(s->sock_fd, level, optname,
2776 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002777 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002779
2780 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002781 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002782 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2783 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2784 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002785 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002786 NULL, (socklen_t)optlen);
2787 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002789
2790 PyErr_Clear();
2791 /* setsockopt(level, opt, buffer) */
2792 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2793 &level, &optname, &optval))
2794 return NULL;
2795
2796#ifdef MS_WINDOWS
2797 if (optval.len > INT_MAX) {
2798 PyBuffer_Release(&optval);
2799 PyErr_Format(PyExc_OverflowError,
2800 "socket option is larger than %i bytes",
2801 INT_MAX);
2802 return NULL;
2803 }
2804 res = setsockopt(s->sock_fd, level, optname,
2805 optval.buf, (int)optval.len);
2806#else
2807 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2808#endif
2809 PyBuffer_Release(&optval);
2810
2811done:
Victor Stinnercc739322016-03-23 21:35:29 +01002812 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002814 }
2815
2816 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002817}
2818
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002819PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002820"setsockopt(level, option, value: int)\n\
2821setsockopt(level, option, value: buffer)\n\
2822setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002823\n\
2824Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002825The value argument can either be an integer, a string buffer, or \n\
2826None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002827
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002828
Guido van Rossumaee08791992-09-08 09:05:33 +00002829/* s.getsockopt() method.
2830 With two arguments, retrieves an integer option.
2831 With a third integer argument, retrieves a string buffer of that size;
2832 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002833
Guido van Rossum73624e91994-10-10 17:59:00 +00002834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002835sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 int level;
2838 int optname;
2839 int res;
2840 PyObject *buf;
2841 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002842 int flag = 0;
2843 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2846 &level, &optname, &buflen))
2847 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002850#ifdef AF_VSOCK
2851 if (s->sock_family == AF_VSOCK) {
2852 uint64_t vflag = 0; // Must be set width of 64 bits
2853 flagsize = sizeof vflag;
2854 res = getsockopt(s->sock_fd, level, optname,
2855 (void *)&vflag, &flagsize);
2856 if (res < 0)
2857 return s->errorhandler();
2858 return PyLong_FromUnsignedLong(vflag);
2859 }
2860#endif
2861 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 res = getsockopt(s->sock_fd, level, optname,
2863 (void *)&flag, &flagsize);
2864 if (res < 0)
2865 return s->errorhandler();
2866 return PyLong_FromLong(flag);
2867 }
caaveryeffc12f2017-09-06 18:18:10 -04002868#ifdef AF_VSOCK
2869 if (s->sock_family == AF_VSOCK) {
2870 PyErr_SetString(PyExc_OSError,
2871 "getsockopt string buffer not allowed");
2872 return NULL;
2873 }
2874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002876 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 "getsockopt buflen out of range");
2878 return NULL;
2879 }
2880 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2881 if (buf == NULL)
2882 return NULL;
2883 res = getsockopt(s->sock_fd, level, optname,
2884 (void *)PyBytes_AS_STRING(buf), &buflen);
2885 if (res < 0) {
2886 Py_DECREF(buf);
2887 return s->errorhandler();
2888 }
2889 _PyBytes_Resize(&buf, buflen);
2890 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002891}
2892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002893PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002894"getsockopt(level, option[, buffersize]) -> value\n\
2895\n\
2896Get a socket option. See the Unix manual for level and option.\n\
2897If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002898string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002899
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002900
Fred Drake728819a2000-07-01 03:40:12 +00002901/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002902
Guido van Rossum73624e91994-10-10 17:59:00 +00002903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002904sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002906 sock_addr_t addrbuf;
2907 int addrlen;
2908 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2911 return NULL;
2912 Py_BEGIN_ALLOW_THREADS
2913 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2914 Py_END_ALLOW_THREADS
2915 if (res < 0)
2916 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002917 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002918}
2919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002920PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002921"bind(address)\n\
2922\n\
2923Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002924pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002925sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002926
Guido van Rossum30a685f1991-06-27 15:51:29 +00002927
2928/* s.close() method.
2929 Set the file descriptor to -1 so operations tried subsequently
2930 will surely fail. */
2931
Guido van Rossum73624e91994-10-10 17:59:00 +00002932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002933sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002936 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002937
Victor Stinner19a8e842016-03-21 16:36:48 +01002938 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002939 if (fd != INVALID_SOCKET) {
2940 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002941
2942 /* We do not want to retry upon EINTR: see
2943 http://lwn.net/Articles/576478/ and
2944 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2945 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002947 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002949 /* bpo-30319: The peer can already have closed the connection.
2950 Python ignores ECONNRESET on close(). */
2951 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002952 return s->errorhandler();
2953 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002955 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002956}
2957
Christian Heimesd0e31b92018-01-27 09:54:13 +01002958PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002959"close()\n\
2960\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002961Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002962
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002963static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002964sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002965{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002966 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002967 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002968 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002969}
2970
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002971PyDoc_STRVAR(detach_doc,
2972"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002973\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002974Close the socket object without closing the underlying file descriptor.\n\
2975The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002976can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002977
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002978static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002979sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002980{
Victor Stinner81c41db2015-04-02 11:50:57 +02002981 int err;
2982 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002983
Victor Stinner81c41db2015-04-02 11:50:57 +02002984 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2985 /* getsockopt() failed */
2986 return 0;
2987 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002988
Victor Stinner81c41db2015-04-02 11:50:57 +02002989 if (err == EISCONN)
2990 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002991 if (err != 0) {
2992 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2993 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002994 return 0;
2995 }
2996 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002997}
2998
2999static int
3000internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3001 int raise)
3002{
3003 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003004
3005 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003007 Py_END_ALLOW_THREADS
3008
Victor Stinner70a46f62015-03-31 22:03:59 +02003009 if (!res) {
3010 /* connect() succeeded, the socket is connected */
3011 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003013
Victor Stinner81c41db2015-04-02 11:50:57 +02003014 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003015
Victor Stinner81c41db2015-04-02 11:50:57 +02003016 /* save error, PyErr_CheckSignals() can replace it */
3017 err = GET_SOCK_ERROR;
3018 if (CHECK_ERRNO(EINTR)) {
3019 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003020 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003021
3022 /* Issue #23618: when connect() fails with EINTR, the connection is
3023 running asynchronously.
3024
3025 If the socket is blocking or has a timeout, wait until the
3026 connection completes, fails or timed out using select(), and then
3027 get the connection status using getsockopt(SO_ERROR).
3028
3029 If the socket is non-blocking, raise InterruptedError. The caller is
3030 responsible to wait until the connection completes, fails or timed
3031 out (it's the case in asyncio for example). */
3032 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3033 }
3034 else {
3035 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3036 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003037 }
3038
Victor Stinner81c41db2015-04-02 11:50:57 +02003039 if (!wait_connect) {
3040 if (raise) {
3041 /* restore error, maybe replaced by PyErr_CheckSignals() */
3042 SET_SOCK_ERROR(err);
3043 s->errorhandler();
3044 return -1;
3045 }
3046 else
3047 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003048 }
3049
Victor Stinner81c41db2015-04-02 11:50:57 +02003050 if (raise) {
3051 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003052 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3053 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003054 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003055 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003056 else {
3057 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003058 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3059 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003060 return err;
3061 }
3062 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003063}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003064
Fred Drake728819a2000-07-01 03:40:12 +00003065/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003066
Guido van Rossum73624e91994-10-10 17:59:00 +00003067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003068sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 sock_addr_t addrbuf;
3071 int addrlen;
3072 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3075 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003076
Victor Stinner81c41db2015-04-02 11:50:57 +02003077 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003078 if (res < 0)
3079 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003080
Victor Stinneree699e92015-03-31 21:28:42 +02003081 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003082}
3083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003084PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003085"connect(address)\n\
3086\n\
3087Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003088is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003089
Guido van Rossum30a685f1991-06-27 15:51:29 +00003090
Fred Drake728819a2000-07-01 03:40:12 +00003091/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003092
3093static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003094sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 sock_addr_t addrbuf;
3097 int addrlen;
3098 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3101 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003102
Victor Stinner81c41db2015-04-02 11:50:57 +02003103 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003104 if (res < 0)
3105 return NULL;
3106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003108}
3109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003110PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003111"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003112\n\
3113This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003114instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003115
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003116
Guido van Rossumed233a51992-06-23 09:07:03 +00003117/* s.fileno() method */
3118
Guido van Rossum73624e91994-10-10 17:59:00 +00003119static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003120sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003123}
3124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126"fileno() -> integer\n\
3127\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003128Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003129
Guido van Rossumed233a51992-06-23 09:07:03 +00003130
Guido van Rossumc89705d1992-11-26 08:54:07 +00003131/* s.getsockname() method */
3132
Guido van Rossum73624e91994-10-10 17:59:00 +00003133static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003134sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 sock_addr_t addrbuf;
3137 int res;
3138 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 if (!getsockaddrlen(s, &addrlen))
3141 return NULL;
3142 memset(&addrbuf, 0, addrlen);
3143 Py_BEGIN_ALLOW_THREADS
3144 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3145 Py_END_ALLOW_THREADS
3146 if (res < 0)
3147 return s->errorhandler();
3148 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3149 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003150}
3151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003152PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003153"getsockname() -> address info\n\
3154\n\
3155Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003156info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003157
Guido van Rossumc89705d1992-11-26 08:54:07 +00003158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003160/* s.getpeername() method */
3161
Guido van Rossum73624e91994-10-10 17:59:00 +00003162static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003163sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 sock_addr_t addrbuf;
3166 int res;
3167 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 if (!getsockaddrlen(s, &addrlen))
3170 return NULL;
3171 memset(&addrbuf, 0, addrlen);
3172 Py_BEGIN_ALLOW_THREADS
3173 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3174 Py_END_ALLOW_THREADS
3175 if (res < 0)
3176 return s->errorhandler();
3177 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3178 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003179}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003181PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003182"getpeername() -> address info\n\
3183\n\
3184Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003185info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003186
Guido van Rossumb6775db1994-08-01 11:34:53 +00003187#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003188
3189
Guido van Rossum30a685f1991-06-27 15:51:29 +00003190/* s.listen(n) method */
3191
Guido van Rossum73624e91994-10-10 17:59:00 +00003192static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003193sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003194{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003195 /* We try to choose a default backlog high enough to avoid connection drops
3196 * for common workloads, yet not too high to limit resource usage. */
3197 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003199
Charles-François Natali644b8f52014-05-22 19:45:39 +01003200 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003204 /* To avoid problems on systems that don't allow a negative backlog
3205 * (which doesn't make sense anyway) we force a minimum value of 0. */
3206 if (backlog < 0)
3207 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 res = listen(s->sock_fd, backlog);
3209 Py_END_ALLOW_THREADS
3210 if (res < 0)
3211 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003212 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003213}
3214
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003215PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003216"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003217\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003218Enable a server to accept connections. If backlog is specified, it must be\n\
3219at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003220unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003221connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003222
Victor Stinner31bf2d52015-04-01 21:57:09 +02003223struct sock_recv {
3224 char *cbuf;
3225 Py_ssize_t len;
3226 int flags;
3227 Py_ssize_t result;
3228};
3229
3230static int
3231sock_recv_impl(PySocketSockObject *s, void *data)
3232{
3233 struct sock_recv *ctx = data;
3234
3235#ifdef MS_WINDOWS
3236 if (ctx->len > INT_MAX)
3237 ctx->len = INT_MAX;
3238 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3239#else
3240 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3241#endif
3242 return (ctx->result >= 0);
3243}
3244
Guido van Rossum82a5c661998-07-07 20:45:43 +00003245
Thomas Wouters477c8d52006-05-27 19:21:47 +00003246/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003247 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003248 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003249 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003250 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003251 * also possible that we return a number of bytes smaller than the request
3252 * bytes.
3253 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003254
Antoine Pitrou19467d22010-08-17 19:33:30 +00003255static Py_ssize_t
3256sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003257{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003258 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 if (!IS_SELECTABLE(s)) {
3261 select_error();
3262 return -1;
3263 }
3264 if (len == 0) {
3265 /* If 0 bytes were requested, do nothing. */
3266 return 0;
3267 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003268
Victor Stinner31bf2d52015-04-01 21:57:09 +02003269 ctx.cbuf = cbuf;
3270 ctx.len = len;
3271 ctx.flags = flags;
3272 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003274
3275 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003276}
3277
Guido van Rossum48a680c2001-03-02 06:34:14 +00003278
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003279/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003280
Guido van Rossum73624e91994-10-10 17:59:00 +00003281static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003282sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003283{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003284 Py_ssize_t recvlen, outlen;
3285 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003287
Antoine Pitrou19467d22010-08-17 19:33:30 +00003288 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 if (recvlen < 0) {
3292 PyErr_SetString(PyExc_ValueError,
3293 "negative buffersize in recv");
3294 return NULL;
3295 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 /* Allocate a new string. */
3298 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3299 if (buf == NULL)
3300 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 /* Call the guts */
3303 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3304 if (outlen < 0) {
3305 /* An error occurred, release the string and return an
3306 error. */
3307 Py_DECREF(buf);
3308 return NULL;
3309 }
3310 if (outlen != recvlen) {
3311 /* We did not read as many bytes as we anticipated, resize the
3312 string if possible and be successful. */
3313 _PyBytes_Resize(&buf, outlen);
3314 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003317}
3318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003319PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003320"recv(buffersize[, flags]) -> data\n\
3321\n\
3322Receive up to buffersize bytes from the socket. For the optional flags\n\
3323argument, see the Unix manual. When no data is available, block until\n\
3324at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003325the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003326
Guido van Rossum30a685f1991-06-27 15:51:29 +00003327
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003328/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003329
Thomas Wouters477c8d52006-05-27 19:21:47 +00003330static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003331sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003334
Antoine Pitrou19467d22010-08-17 19:33:30 +00003335 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 Py_buffer pbuf;
3337 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003338 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 &pbuf, &recvlen, &flags))
3343 return NULL;
3344 buf = pbuf.buf;
3345 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 if (recvlen < 0) {
3348 PyBuffer_Release(&pbuf);
3349 PyErr_SetString(PyExc_ValueError,
3350 "negative buffersize in recv_into");
3351 return NULL;
3352 }
3353 if (recvlen == 0) {
3354 /* If nbytes was not specified, use the buffer's length */
3355 recvlen = buflen;
3356 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 /* Check if the buffer is large enough */
3359 if (buflen < recvlen) {
3360 PyBuffer_Release(&pbuf);
3361 PyErr_SetString(PyExc_ValueError,
3362 "buffer too small for requested bytes");
3363 return NULL;
3364 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 /* Call the guts */
3367 readlen = sock_recv_guts(s, buf, recvlen, flags);
3368 if (readlen < 0) {
3369 /* Return an error. */
3370 PyBuffer_Release(&pbuf);
3371 return NULL;
3372 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 PyBuffer_Release(&pbuf);
3375 /* Return the number of bytes read. Note that we do not do anything
3376 special here in the case that readlen < recvlen. */
3377 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003378}
3379
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003380PyDoc_STRVAR(recv_into_doc,
3381"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003382\n\
3383A version of recv() that stores its data into a buffer rather than creating \n\
3384a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3385is not specified (or 0), receive up to the size available in the given buffer.\n\
3386\n\
3387See recv() for documentation about the flags.");
3388
Victor Stinner31bf2d52015-04-01 21:57:09 +02003389struct sock_recvfrom {
3390 char* cbuf;
3391 Py_ssize_t len;
3392 int flags;
3393 socklen_t *addrlen;
3394 sock_addr_t *addrbuf;
3395 Py_ssize_t result;
3396};
3397
3398static int
3399sock_recvfrom_impl(PySocketSockObject *s, void *data)
3400{
3401 struct sock_recvfrom *ctx = data;
3402
3403 memset(ctx->addrbuf, 0, *ctx->addrlen);
3404
3405#ifdef MS_WINDOWS
3406 if (ctx->len > INT_MAX)
3407 ctx->len = INT_MAX;
3408 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3409 SAS2SA(ctx->addrbuf), ctx->addrlen);
3410#else
3411 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3412 SAS2SA(ctx->addrbuf), ctx->addrlen);
3413#endif
3414 return (ctx->result >= 0);
3415}
3416
Thomas Wouters477c8d52006-05-27 19:21:47 +00003417
3418/*
Christian Heimes99170a52007-12-19 02:07:34 +00003419 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3420 * into a char buffer. If you have any inc/def ref to do to the objects that
3421 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003422 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003423 * that it is also possible that we return a number of bytes smaller than the
3424 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003425 *
3426 * 'addr' is a return value for the address object. Note that you must decref
3427 * it yourself.
3428 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003429static Py_ssize_t
3430sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003435 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 if (!getsockaddrlen(s, &addrlen))
3440 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 if (!IS_SELECTABLE(s)) {
3443 select_error();
3444 return -1;
3445 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003446
Victor Stinner31bf2d52015-04-01 21:57:09 +02003447 ctx.cbuf = cbuf;
3448 ctx.len = len;
3449 ctx.flags = flags;
3450 ctx.addrbuf = &addrbuf;
3451 ctx.addrlen = &addrlen;
3452 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003454
Victor Stinner31bf2d52015-04-01 21:57:09 +02003455 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3456 s->sock_proto);
3457 if (*addr == NULL)
3458 return -1;
3459
3460 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003461}
3462
3463/* s.recvfrom(nbytes [,flags]) method */
3464
3465static PyObject *
3466sock_recvfrom(PySocketSockObject *s, PyObject *args)
3467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 PyObject *buf = NULL;
3469 PyObject *addr = NULL;
3470 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003471 int flags = 0;
3472 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003473
Antoine Pitrou19467d22010-08-17 19:33:30 +00003474 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 if (recvlen < 0) {
3478 PyErr_SetString(PyExc_ValueError,
3479 "negative buffersize in recvfrom");
3480 return NULL;
3481 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3484 if (buf == NULL)
3485 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3488 recvlen, flags, &addr);
3489 if (outlen < 0) {
3490 goto finally;
3491 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 if (outlen != recvlen) {
3494 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003495 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003497 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 goto finally;
3499 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003502
3503finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 Py_XDECREF(buf);
3505 Py_XDECREF(addr);
3506 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003507}
3508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003509PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003510"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3511\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003512Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003513
Thomas Wouters477c8d52006-05-27 19:21:47 +00003514
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003515/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003516
3517static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003518sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003521
Antoine Pitrou19467d22010-08-17 19:33:30 +00003522 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 Py_buffer pbuf;
3524 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003525 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003528
Antoine Pitrou19467d22010-08-17 19:33:30 +00003529 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 kwlist, &pbuf,
3531 &recvlen, &flags))
3532 return NULL;
3533 buf = pbuf.buf;
3534 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 if (recvlen < 0) {
3537 PyBuffer_Release(&pbuf);
3538 PyErr_SetString(PyExc_ValueError,
3539 "negative buffersize in recvfrom_into");
3540 return NULL;
3541 }
3542 if (recvlen == 0) {
3543 /* If nbytes was not specified, use the buffer's length */
3544 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003545 } else if (recvlen > buflen) {
3546 PyBuffer_Release(&pbuf);
3547 PyErr_SetString(PyExc_ValueError,
3548 "nbytes is greater than the length of the buffer");
3549 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3553 if (readlen < 0) {
3554 PyBuffer_Release(&pbuf);
3555 /* Return an error */
3556 Py_XDECREF(addr);
3557 return NULL;
3558 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 PyBuffer_Release(&pbuf);
3561 /* Return the number of bytes read and the address. Note that we do
3562 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003563 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003564}
3565
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003566PyDoc_STRVAR(recvfrom_into_doc,
3567"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003568\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003569Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003570
Victor Stinner35bee932015-04-02 12:28:07 +02003571/* The sendmsg() and recvmsg[_into]() methods require a working
3572 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3573#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003574struct sock_recvmsg {
3575 struct msghdr *msg;
3576 int flags;
3577 ssize_t result;
3578};
3579
3580static int
3581sock_recvmsg_impl(PySocketSockObject *s, void *data)
3582{
3583 struct sock_recvmsg *ctx = data;
3584
3585 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3586 return (ctx->result >= 0);
3587}
3588
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003589/*
3590 * Call recvmsg() with the supplied iovec structures, flags, and
3591 * ancillary data buffer size (controllen). Returns the tuple return
3592 * value for recvmsg() or recvmsg_into(), with the first item provided
3593 * by the supplied makeval() function. makeval() will be called with
3594 * the length read and makeval_data as arguments, and must return a
3595 * new reference (which will be decrefed if there is a subsequent
3596 * error). On error, closes any file descriptors received via
3597 * SCM_RIGHTS.
3598 */
3599static PyObject *
3600sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3601 int flags, Py_ssize_t controllen,
3602 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3603{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604 sock_addr_t addrbuf;
3605 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003606 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003607 PyObject *cmsg_list = NULL, *retval = NULL;
3608 void *controlbuf = NULL;
3609 struct cmsghdr *cmsgh;
3610 size_t cmsgdatalen = 0;
3611 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003612 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003613
3614 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3615 ignored" when the socket is connected (Linux fills them in
3616 anyway for AF_UNIX sockets at least). Normally msg_namelen
3617 seems to be set to 0 if there's no address, but try to
3618 initialize msg_name to something that won't be mistaken for a
3619 real address if that doesn't happen. */
3620 if (!getsockaddrlen(s, &addrbuflen))
3621 return NULL;
3622 memset(&addrbuf, 0, addrbuflen);
3623 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3624
3625 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3626 PyErr_SetString(PyExc_ValueError,
3627 "invalid ancillary data buffer length");
3628 return NULL;
3629 }
3630 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3631 return PyErr_NoMemory();
3632
3633 /* Make the system call. */
3634 if (!IS_SELECTABLE(s)) {
3635 select_error();
3636 goto finally;
3637 }
3638
Victor Stinner31bf2d52015-04-01 21:57:09 +02003639 msg.msg_name = SAS2SA(&addrbuf);
3640 msg.msg_namelen = addrbuflen;
3641 msg.msg_iov = iov;
3642 msg.msg_iovlen = iovlen;
3643 msg.msg_control = controlbuf;
3644 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003645
Victor Stinner31bf2d52015-04-01 21:57:09 +02003646 ctx.msg = &msg;
3647 ctx.flags = flags;
3648 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003649 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003650
3651 /* Make list of (level, type, data) tuples from control messages. */
3652 if ((cmsg_list = PyList_New(0)) == NULL)
3653 goto err_closefds;
3654 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3655 implementations didn't do so. */
3656 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3657 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3658 PyObject *bytes, *tuple;
3659 int tmp;
3660
3661 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3662 if (cmsg_status != 0) {
3663 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3664 "received malformed or improperly-truncated "
3665 "ancillary data", 1) == -1)
3666 goto err_closefds;
3667 }
3668 if (cmsg_status < 0)
3669 break;
3670 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003671 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003672 goto err_closefds;
3673 }
3674
3675 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3676 cmsgdatalen);
3677 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3678 (int)cmsgh->cmsg_type, bytes);
3679 if (tuple == NULL)
3680 goto err_closefds;
3681 tmp = PyList_Append(cmsg_list, tuple);
3682 Py_DECREF(tuple);
3683 if (tmp != 0)
3684 goto err_closefds;
3685
3686 if (cmsg_status != 0)
3687 break;
3688 }
3689
3690 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003691 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003692 cmsg_list,
3693 (int)msg.msg_flags,
3694 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3695 ((msg.msg_namelen > addrbuflen) ?
3696 addrbuflen : msg.msg_namelen),
3697 s->sock_proto));
3698 if (retval == NULL)
3699 goto err_closefds;
3700
3701finally:
3702 Py_XDECREF(cmsg_list);
3703 PyMem_Free(controlbuf);
3704 return retval;
3705
3706err_closefds:
3707#ifdef SCM_RIGHTS
3708 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3709 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3710 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3711 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3712 if (cmsg_status < 0)
3713 break;
3714 if (cmsgh->cmsg_level == SOL_SOCKET &&
3715 cmsgh->cmsg_type == SCM_RIGHTS) {
3716 size_t numfds;
3717 int *fdp;
3718
3719 numfds = cmsgdatalen / sizeof(int);
3720 fdp = (int *)CMSG_DATA(cmsgh);
3721 while (numfds-- > 0)
3722 close(*fdp++);
3723 }
3724 if (cmsg_status != 0)
3725 break;
3726 }
3727#endif /* SCM_RIGHTS */
3728 goto finally;
3729}
3730
3731
3732static PyObject *
3733makeval_recvmsg(ssize_t received, void *data)
3734{
3735 PyObject **buf = data;
3736
3737 if (received < PyBytes_GET_SIZE(*buf))
3738 _PyBytes_Resize(buf, received);
3739 Py_XINCREF(*buf);
3740 return *buf;
3741}
3742
3743/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3744
3745static PyObject *
3746sock_recvmsg(PySocketSockObject *s, PyObject *args)
3747{
3748 Py_ssize_t bufsize, ancbufsize = 0;
3749 int flags = 0;
3750 struct iovec iov;
3751 PyObject *buf = NULL, *retval = NULL;
3752
3753 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3754 return NULL;
3755
3756 if (bufsize < 0) {
3757 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3758 return NULL;
3759 }
3760 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3761 return NULL;
3762 iov.iov_base = PyBytes_AS_STRING(buf);
3763 iov.iov_len = bufsize;
3764
3765 /* Note that we're passing a pointer to *our pointer* to the bytes
3766 object here (&buf); makeval_recvmsg() may incref the object, or
3767 deallocate it and set our pointer to NULL. */
3768 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3769 &makeval_recvmsg, &buf);
3770 Py_XDECREF(buf);
3771 return retval;
3772}
3773
3774PyDoc_STRVAR(recvmsg_doc,
3775"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3776\n\
3777Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3778socket. The ancbufsize argument sets the size in bytes of the\n\
3779internal buffer used to receive the ancillary data; it defaults to 0,\n\
3780meaning that no ancillary data will be received. Appropriate buffer\n\
3781sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3782CMSG_LEN(), and items which do not fit into the buffer might be\n\
3783truncated or discarded. The flags argument defaults to 0 and has the\n\
3784same meaning as for recv().\n\
3785\n\
3786The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3787The data item is a bytes object holding the non-ancillary data\n\
3788received. The ancdata item is a list of zero or more tuples\n\
3789(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3790(control messages) received: cmsg_level and cmsg_type are integers\n\
3791specifying the protocol level and protocol-specific type respectively,\n\
3792and cmsg_data is a bytes object holding the associated data. The\n\
3793msg_flags item is the bitwise OR of various flags indicating\n\
3794conditions on the received message; see your system documentation for\n\
3795details. If the receiving socket is unconnected, address is the\n\
3796address of the sending socket, if available; otherwise, its value is\n\
3797unspecified.\n\
3798\n\
3799If recvmsg() raises an exception after the system call returns, it\n\
3800will first attempt to close any file descriptors received via the\n\
3801SCM_RIGHTS mechanism.");
3802
3803
3804static PyObject *
3805makeval_recvmsg_into(ssize_t received, void *data)
3806{
3807 return PyLong_FromSsize_t(received);
3808}
3809
3810/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3811
3812static PyObject *
3813sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3814{
3815 Py_ssize_t ancbufsize = 0;
3816 int flags = 0;
3817 struct iovec *iovs = NULL;
3818 Py_ssize_t i, nitems, nbufs = 0;
3819 Py_buffer *bufs = NULL;
3820 PyObject *buffers_arg, *fast, *retval = NULL;
3821
3822 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3823 &buffers_arg, &ancbufsize, &flags))
3824 return NULL;
3825
3826 if ((fast = PySequence_Fast(buffers_arg,
3827 "recvmsg_into() argument 1 must be an "
3828 "iterable")) == NULL)
3829 return NULL;
3830 nitems = PySequence_Fast_GET_SIZE(fast);
3831 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003832 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833 goto finally;
3834 }
3835
3836 /* Fill in an iovec for each item, and save the Py_buffer
3837 structs to release afterwards. */
3838 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3839 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3840 PyErr_NoMemory();
3841 goto finally;
3842 }
3843 for (; nbufs < nitems; nbufs++) {
3844 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3845 "w*;recvmsg_into() argument 1 must be an iterable "
3846 "of single-segment read-write buffers",
3847 &bufs[nbufs]))
3848 goto finally;
3849 iovs[nbufs].iov_base = bufs[nbufs].buf;
3850 iovs[nbufs].iov_len = bufs[nbufs].len;
3851 }
3852
3853 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3854 &makeval_recvmsg_into, NULL);
3855finally:
3856 for (i = 0; i < nbufs; i++)
3857 PyBuffer_Release(&bufs[i]);
3858 PyMem_Free(bufs);
3859 PyMem_Free(iovs);
3860 Py_DECREF(fast);
3861 return retval;
3862}
3863
3864PyDoc_STRVAR(recvmsg_into_doc,
3865"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3866\n\
3867Receive normal data and ancillary data from the socket, scattering the\n\
3868non-ancillary data into a series of buffers. The buffers argument\n\
3869must be an iterable of objects that export writable buffers\n\
3870(e.g. bytearray objects); these will be filled with successive chunks\n\
3871of the non-ancillary data until it has all been written or there are\n\
3872no more buffers. The ancbufsize argument sets the size in bytes of\n\
3873the internal buffer used to receive the ancillary data; it defaults to\n\
38740, meaning that no ancillary data will be received. Appropriate\n\
3875buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3876or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3877truncated or discarded. The flags argument defaults to 0 and has the\n\
3878same meaning as for recv().\n\
3879\n\
3880The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3881The nbytes item is the total number of bytes of non-ancillary data\n\
3882written into the buffers. The ancdata item is a list of zero or more\n\
3883tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3884data (control messages) received: cmsg_level and cmsg_type are\n\
3885integers specifying the protocol level and protocol-specific type\n\
3886respectively, and cmsg_data is a bytes object holding the associated\n\
3887data. The msg_flags item is the bitwise OR of various flags\n\
3888indicating conditions on the received message; see your system\n\
3889documentation for details. If the receiving socket is unconnected,\n\
3890address is the address of the sending socket, if available; otherwise,\n\
3891its value is unspecified.\n\
3892\n\
3893If recvmsg_into() raises an exception after the system call returns,\n\
3894it will first attempt to close any file descriptors received via the\n\
3895SCM_RIGHTS mechanism.");
3896#endif /* CMSG_LEN */
3897
3898
Victor Stinner31bf2d52015-04-01 21:57:09 +02003899struct sock_send {
3900 char *buf;
3901 Py_ssize_t len;
3902 int flags;
3903 Py_ssize_t result;
3904};
3905
3906static int
3907sock_send_impl(PySocketSockObject *s, void *data)
3908{
3909 struct sock_send *ctx = data;
3910
3911#ifdef MS_WINDOWS
3912 if (ctx->len > INT_MAX)
3913 ctx->len = INT_MAX;
3914 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3915#else
3916 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3917#endif
3918 return (ctx->result >= 0);
3919}
3920
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003921/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003922
Guido van Rossum73624e91994-10-10 17:59:00 +00003923static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003924sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003925{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003926 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003928 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3931 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 if (!IS_SELECTABLE(s)) {
3934 PyBuffer_Release(&pbuf);
3935 return select_error();
3936 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003937 ctx.buf = pbuf.buf;
3938 ctx.len = pbuf.len;
3939 ctx.flags = flags;
3940 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003941 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 return NULL;
3943 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003944 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003945
3946 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003947}
3948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003949PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003950"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003951\n\
3952Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003953argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003954sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003955
3956
3957/* s.sendall(data [,flags]) method */
3958
3959static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003960sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003963 Py_ssize_t len, n;
3964 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003966 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003967 int has_timeout = (s->sock_timeout > 0);
3968 _PyTime_t interval = s->sock_timeout;
3969 _PyTime_t deadline = 0;
3970 int deadline_initialized = 0;
3971 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3974 return NULL;
3975 buf = pbuf.buf;
3976 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 if (!IS_SELECTABLE(s)) {
3979 PyBuffer_Release(&pbuf);
3980 return select_error();
3981 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003984 if (has_timeout) {
3985 if (deadline_initialized) {
3986 /* recompute the timeout */
3987 interval = deadline - _PyTime_GetMonotonicClock();
3988 }
3989 else {
3990 deadline_initialized = 1;
3991 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3992 }
3993
3994 if (interval <= 0) {
3995 PyErr_SetString(socket_timeout, "timed out");
3996 goto done;
3997 }
3998 }
3999
Victor Stinner02f32ab2015-04-01 22:53:26 +02004000 ctx.buf = buf;
4001 ctx.len = len;
4002 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004003 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4004 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004005 n = ctx.result;
4006 assert(n >= 0);
4007
4008 buf += n;
4009 len -= n;
4010
4011 /* We must run our signal handlers before looping again.
4012 send() can return a successful partial write when it is
4013 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004014 if (PyErr_CheckSignals())
4015 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004016 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004018
Victor Stinner8912d142015-04-06 23:16:34 +02004019 Py_INCREF(Py_None);
4020 res = Py_None;
4021
4022done:
4023 PyBuffer_Release(&pbuf);
4024 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004025}
4026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004027PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004028"sendall(data[, flags])\n\
4029\n\
4030Send a data string to the socket. For the optional flags\n\
4031argument, see the Unix manual. This calls send() repeatedly\n\
4032until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004033to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004034
Guido van Rossum30a685f1991-06-27 15:51:29 +00004035
Victor Stinner31bf2d52015-04-01 21:57:09 +02004036struct sock_sendto {
4037 char *buf;
4038 Py_ssize_t len;
4039 int flags;
4040 int addrlen;
4041 sock_addr_t *addrbuf;
4042 Py_ssize_t result;
4043};
4044
4045static int
4046sock_sendto_impl(PySocketSockObject *s, void *data)
4047{
4048 struct sock_sendto *ctx = data;
4049
4050#ifdef MS_WINDOWS
4051 if (ctx->len > INT_MAX)
4052 ctx->len = INT_MAX;
4053 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4054 SAS2SA(ctx->addrbuf), ctx->addrlen);
4055#else
4056 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4057 SAS2SA(ctx->addrbuf), ctx->addrlen);
4058#endif
4059 return (ctx->result >= 0);
4060}
4061
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004062/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004063
Guido van Rossum73624e91994-10-10 17:59:00 +00004064static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004065sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 Py_buffer pbuf;
4068 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004069 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004071 int addrlen, flags;
4072 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004075 arglen = PyTuple_Size(args);
4076 switch (arglen) {
4077 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004078 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4079 return NULL;
4080 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004081 break;
4082 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004083 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4084 &pbuf, &flags, &addro)) {
4085 return NULL;
4086 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004087 break;
4088 default:
4089 PyErr_Format(PyExc_TypeError,
4090 "sendto() takes 2 or 3 arguments (%d given)",
4091 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004092 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004093 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004095 if (!IS_SELECTABLE(s)) {
4096 PyBuffer_Release(&pbuf);
4097 return select_error();
4098 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004100 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4101 PyBuffer_Release(&pbuf);
4102 return NULL;
4103 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004104
Victor Stinner31bf2d52015-04-01 21:57:09 +02004105 ctx.buf = pbuf.buf;
4106 ctx.len = pbuf.len;
4107 ctx.flags = flags;
4108 ctx.addrlen = addrlen;
4109 ctx.addrbuf = &addrbuf;
4110 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004111 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 return NULL;
4113 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004114 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004115
4116 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004117}
4118
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004119PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004120"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004121\n\
4122Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004123For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004124
Guido van Rossum30a685f1991-06-27 15:51:29 +00004125
Victor Stinner35bee932015-04-02 12:28:07 +02004126/* The sendmsg() and recvmsg[_into]() methods require a working
4127 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4128#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004129struct sock_sendmsg {
4130 struct msghdr *msg;
4131 int flags;
4132 ssize_t result;
4133};
4134
4135static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004136sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4137 struct msghdr *msg,
4138 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4139 Py_ssize_t ndataparts, ndatabufs = 0;
4140 int result = -1;
4141 struct iovec *iovs = NULL;
4142 PyObject *data_fast = NULL;
4143 Py_buffer *databufs = NULL;
4144
4145 /* Fill in an iovec for each message part, and save the Py_buffer
4146 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004147 data_fast = PySequence_Fast(data_arg,
4148 "sendmsg() argument 1 must be an "
4149 "iterable");
4150 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004151 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004152 }
4153
Christian Heimesdffa3942016-09-05 23:54:41 +02004154 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4155 if (ndataparts > INT_MAX) {
4156 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4157 goto finally;
4158 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004159
Christian Heimesdffa3942016-09-05 23:54:41 +02004160 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004161 if (ndataparts > 0) {
4162 iovs = PyMem_New(struct iovec, ndataparts);
4163 if (iovs == NULL) {
4164 PyErr_NoMemory();
4165 goto finally;
4166 }
4167 msg->msg_iov = iovs;
4168
4169 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004170 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004171 PyErr_NoMemory();
4172 goto finally;
4173 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004174 }
4175 for (; ndatabufs < ndataparts; ndatabufs++) {
4176 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4177 "y*;sendmsg() argument 1 must be an iterable of "
4178 "bytes-like objects",
4179 &databufs[ndatabufs]))
4180 goto finally;
4181 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4182 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4183 }
4184 result = 0;
4185 finally:
4186 *databufsout = databufs;
4187 *ndatabufsout = ndatabufs;
4188 Py_XDECREF(data_fast);
4189 return result;
4190}
4191
4192static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004193sock_sendmsg_impl(PySocketSockObject *s, void *data)
4194{
4195 struct sock_sendmsg *ctx = data;
4196
4197 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4198 return (ctx->result >= 0);
4199}
4200
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004201/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4202
4203static PyObject *
4204sock_sendmsg(PySocketSockObject *s, PyObject *args)
4205{
Christian Heimesdffa3942016-09-05 23:54:41 +02004206 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004207 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004208 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004209 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004210 struct cmsginfo {
4211 int level;
4212 int type;
4213 Py_buffer data;
4214 } *cmsgs = NULL;
4215 void *controlbuf = NULL;
4216 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004217 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004218 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004219 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004220 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004221
4222 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004223 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004224 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004225 }
4226
4227 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004228
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004229 /* Parse destination address. */
4230 if (addr_arg != NULL && addr_arg != Py_None) {
4231 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4232 goto finally;
4233 msg.msg_name = &addrbuf;
4234 msg.msg_namelen = addrlen;
4235 }
4236
4237 /* Fill in an iovec for each message part, and save the Py_buffer
4238 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004239 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004240 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241 }
4242
4243 if (cmsg_arg == NULL)
4244 ncmsgs = 0;
4245 else {
4246 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4247 "sendmsg() argument 2 must be an "
4248 "iterable")) == NULL)
4249 goto finally;
4250 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4251 }
4252
4253#ifndef CMSG_SPACE
4254 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004255 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004256 "sending multiple control messages is not supported "
4257 "on this system");
4258 goto finally;
4259 }
4260#endif
4261 /* Save level, type and Py_buffer for each control message,
4262 and calculate total size. */
4263 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4264 PyErr_NoMemory();
4265 goto finally;
4266 }
4267 controllen = controllen_last = 0;
4268 while (ncmsgbufs < ncmsgs) {
4269 size_t bufsize, space;
4270
4271 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4272 "(iiy*):[sendmsg() ancillary data items]",
4273 &cmsgs[ncmsgbufs].level,
4274 &cmsgs[ncmsgbufs].type,
4275 &cmsgs[ncmsgbufs].data))
4276 goto finally;
4277 bufsize = cmsgs[ncmsgbufs++].data.len;
4278
4279#ifdef CMSG_SPACE
4280 if (!get_CMSG_SPACE(bufsize, &space)) {
4281#else
4282 if (!get_CMSG_LEN(bufsize, &space)) {
4283#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004284 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004285 goto finally;
4286 }
4287 controllen += space;
4288 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004289 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004290 goto finally;
4291 }
4292 controllen_last = controllen;
4293 }
4294
4295 /* Construct ancillary data block from control message info. */
4296 if (ncmsgbufs > 0) {
4297 struct cmsghdr *cmsgh = NULL;
4298
Victor Stinner52d61e42016-09-12 11:41:58 +02004299 controlbuf = PyMem_Malloc(controllen);
4300 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004301 PyErr_NoMemory();
4302 goto finally;
4303 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004304 msg.msg_control = controlbuf;
4305
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004306 msg.msg_controllen = controllen;
4307
4308 /* Need to zero out the buffer as a workaround for glibc's
4309 CMSG_NXTHDR() implementation. After getting the pointer to
4310 the next header, it checks its (uninitialized) cmsg_len
4311 member to see if the "message" fits in the buffer, and
4312 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004313 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004314 memset(controlbuf, 0, controllen);
4315
4316 for (i = 0; i < ncmsgbufs; i++) {
4317 size_t msg_len, data_len = cmsgs[i].data.len;
4318 int enough_space = 0;
4319
4320 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4321 if (cmsgh == NULL) {
4322 PyErr_Format(PyExc_RuntimeError,
4323 "unexpected NULL result from %s()",
4324 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4325 goto finally;
4326 }
4327 if (!get_CMSG_LEN(data_len, &msg_len)) {
4328 PyErr_SetString(PyExc_RuntimeError,
4329 "item size out of range for CMSG_LEN()");
4330 goto finally;
4331 }
4332 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4333 size_t space;
4334
4335 cmsgh->cmsg_len = msg_len;
4336 if (get_cmsg_data_space(&msg, cmsgh, &space))
4337 enough_space = (space >= data_len);
4338 }
4339 if (!enough_space) {
4340 PyErr_SetString(PyExc_RuntimeError,
4341 "ancillary data does not fit in calculated "
4342 "space");
4343 goto finally;
4344 }
4345 cmsgh->cmsg_level = cmsgs[i].level;
4346 cmsgh->cmsg_type = cmsgs[i].type;
4347 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4348 }
4349 }
4350
4351 /* Make the system call. */
4352 if (!IS_SELECTABLE(s)) {
4353 select_error();
4354 goto finally;
4355 }
4356
Victor Stinner31bf2d52015-04-01 21:57:09 +02004357 ctx.msg = &msg;
4358 ctx.flags = flags;
4359 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004360 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004361
4362 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363
4364finally:
4365 PyMem_Free(controlbuf);
4366 for (i = 0; i < ncmsgbufs; i++)
4367 PyBuffer_Release(&cmsgs[i].data);
4368 PyMem_Free(cmsgs);
4369 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004370 PyMem_Free(msg.msg_iov);
4371 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004372 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004373 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004374 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004375 return retval;
4376}
4377
4378PyDoc_STRVAR(sendmsg_doc,
4379"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4380\n\
4381Send normal and ancillary data to the socket, gathering the\n\
4382non-ancillary data from a series of buffers and concatenating it into\n\
4383a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004384data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004385The ancdata argument specifies the ancillary data (control messages)\n\
4386as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4387cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4388protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004389is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390argument defaults to 0 and has the same meaning as for send(). If\n\
4391address is supplied and not None, it sets a destination address for\n\
4392the message. The return value is the number of bytes of non-ancillary\n\
4393data sent.");
4394#endif /* CMSG_LEN */
4395
Christian Heimesdffa3942016-09-05 23:54:41 +02004396#ifdef HAVE_SOCKADDR_ALG
4397static PyObject*
4398sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4399{
4400 PyObject *retval = NULL;
4401
4402 Py_ssize_t i, ndatabufs = 0;
4403 Py_buffer *databufs = NULL;
4404 PyObject *data_arg = NULL;
4405
4406 Py_buffer iv = {NULL, NULL};
4407
4408 PyObject *opobj = NULL;
4409 int op = -1;
4410
4411 PyObject *assoclenobj = NULL;
4412 int assoclen = -1;
4413
4414 unsigned int *uiptr;
4415 int flags = 0;
4416
4417 struct msghdr msg;
4418 struct cmsghdr *header = NULL;
4419 struct af_alg_iv *alg_iv = NULL;
4420 struct sock_sendmsg ctx;
4421 Py_ssize_t controllen;
4422 void *controlbuf = NULL;
4423 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4424
4425 if (self->sock_family != AF_ALG) {
4426 PyErr_SetString(PyExc_OSError,
4427 "algset is only supported for AF_ALG");
4428 return NULL;
4429 }
4430
4431 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4432 "|O$O!y*O!i:sendmsg_afalg", keywords,
4433 &data_arg,
4434 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004435 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004436 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004437 }
4438
4439 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004440
4441 /* op is a required, keyword-only argument >= 0 */
4442 if (opobj != NULL) {
4443 op = _PyLong_AsInt(opobj);
4444 }
4445 if (op < 0) {
4446 /* override exception from _PyLong_AsInt() */
4447 PyErr_SetString(PyExc_TypeError,
4448 "Invalid or missing argument 'op'");
4449 goto finally;
4450 }
4451 /* assoclen is optional but must be >= 0 */
4452 if (assoclenobj != NULL) {
4453 assoclen = _PyLong_AsInt(assoclenobj);
4454 if (assoclen == -1 && PyErr_Occurred()) {
4455 goto finally;
4456 }
4457 if (assoclen < 0) {
4458 PyErr_SetString(PyExc_TypeError,
4459 "assoclen must be positive");
4460 goto finally;
4461 }
4462 }
4463
4464 controllen = CMSG_SPACE(4);
4465 if (iv.buf != NULL) {
4466 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4467 }
4468 if (assoclen >= 0) {
4469 controllen += CMSG_SPACE(4);
4470 }
4471
4472 controlbuf = PyMem_Malloc(controllen);
4473 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004474 PyErr_NoMemory();
4475 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004476 }
4477 memset(controlbuf, 0, controllen);
4478
Christian Heimesdffa3942016-09-05 23:54:41 +02004479 msg.msg_controllen = controllen;
4480 msg.msg_control = controlbuf;
4481
4482 /* Fill in an iovec for each message part, and save the Py_buffer
4483 structs to release afterwards. */
4484 if (data_arg != NULL) {
4485 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4486 goto finally;
4487 }
4488 }
4489
4490 /* set operation to encrypt or decrypt */
4491 header = CMSG_FIRSTHDR(&msg);
4492 if (header == NULL) {
4493 PyErr_SetString(PyExc_RuntimeError,
4494 "unexpected NULL result from CMSG_FIRSTHDR");
4495 goto finally;
4496 }
4497 header->cmsg_level = SOL_ALG;
4498 header->cmsg_type = ALG_SET_OP;
4499 header->cmsg_len = CMSG_LEN(4);
4500 uiptr = (void*)CMSG_DATA(header);
4501 *uiptr = (unsigned int)op;
4502
4503 /* set initialization vector */
4504 if (iv.buf != NULL) {
4505 header = CMSG_NXTHDR(&msg, header);
4506 if (header == NULL) {
4507 PyErr_SetString(PyExc_RuntimeError,
4508 "unexpected NULL result from CMSG_NXTHDR(iv)");
4509 goto finally;
4510 }
4511 header->cmsg_level = SOL_ALG;
4512 header->cmsg_type = ALG_SET_IV;
4513 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4514 alg_iv = (void*)CMSG_DATA(header);
4515 alg_iv->ivlen = iv.len;
4516 memcpy(alg_iv->iv, iv.buf, iv.len);
4517 }
4518
4519 /* set length of associated data for AEAD */
4520 if (assoclen >= 0) {
4521 header = CMSG_NXTHDR(&msg, header);
4522 if (header == NULL) {
4523 PyErr_SetString(PyExc_RuntimeError,
4524 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4525 goto finally;
4526 }
4527 header->cmsg_level = SOL_ALG;
4528 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4529 header->cmsg_len = CMSG_LEN(4);
4530 uiptr = (void*)CMSG_DATA(header);
4531 *uiptr = (unsigned int)assoclen;
4532 }
4533
4534 ctx.msg = &msg;
4535 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004536 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004537 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004538 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004539
4540 retval = PyLong_FromSsize_t(ctx.result);
4541
4542 finally:
4543 PyMem_Free(controlbuf);
4544 if (iv.buf != NULL) {
4545 PyBuffer_Release(&iv);
4546 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004547 PyMem_Free(msg.msg_iov);
4548 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004549 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004550 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004551 PyMem_Free(databufs);
4552 return retval;
4553}
4554
4555PyDoc_STRVAR(sendmsg_afalg_doc,
4556"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4557\n\
4558Set operation mode, IV and length of associated data for an AF_ALG\n\
4559operation socket.");
4560#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004561
Guido van Rossum30a685f1991-06-27 15:51:29 +00004562/* s.shutdown(how) method */
4563
Guido van Rossum73624e91994-10-10 17:59:00 +00004564static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004565sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 int how;
4568 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004569
Serhiy Storchaka78980432013-01-15 01:12:17 +02004570 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 if (how == -1 && PyErr_Occurred())
4572 return NULL;
4573 Py_BEGIN_ALLOW_THREADS
4574 res = shutdown(s->sock_fd, how);
4575 Py_END_ALLOW_THREADS
4576 if (res < 0)
4577 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004578 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004579}
4580
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004581PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004582"shutdown(flag)\n\
4583\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004584Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4585of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004586
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004587#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004588static PyObject*
4589sock_ioctl(PySocketSockObject *s, PyObject *arg)
4590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 unsigned long cmd = SIO_RCVALL;
4592 PyObject *argO;
4593 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4596 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 switch (cmd) {
4599 case SIO_RCVALL: {
4600 unsigned int option = RCVALL_ON;
4601 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4602 return NULL;
4603 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4604 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4605 return set_error();
4606 }
4607 return PyLong_FromUnsignedLong(recv); }
4608 case SIO_KEEPALIVE_VALS: {
4609 struct tcp_keepalive ka;
4610 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4611 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4612 return NULL;
4613 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4614 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4615 return set_error();
4616 }
4617 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004618#if defined(SIO_LOOPBACK_FAST_PATH)
4619 case SIO_LOOPBACK_FAST_PATH: {
4620 unsigned int option;
4621 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4622 return NULL;
4623 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4624 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4625 return set_error();
4626 }
4627 return PyLong_FromUnsignedLong(recv); }
4628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 default:
4630 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4631 return NULL;
4632 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004633}
4634PyDoc_STRVAR(sock_ioctl_doc,
4635"ioctl(cmd, option) -> long\n\
4636\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004637Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4638SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004639SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4640SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004641#endif
4642
4643#if defined(MS_WINDOWS)
4644static PyObject*
4645sock_share(PySocketSockObject *s, PyObject *arg)
4646{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004647 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004648 DWORD processId;
4649 int result;
4650
4651 if (!PyArg_ParseTuple(arg, "I", &processId))
4652 return NULL;
4653
4654 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004655 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004656 Py_END_ALLOW_THREADS
4657 if (result == SOCKET_ERROR)
4658 return set_error();
4659 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4660}
4661PyDoc_STRVAR(sock_share_doc,
4662"share(process_id) -> bytes\n\
4663\n\
4664Share the socket with another process. The target process id\n\
4665must be provided and the resulting bytes object passed to the target\n\
4666process. There the shared socket can be instantiated by calling\n\
4667socket.fromshare().");
4668
Christian Heimesfaf2f632008-01-06 16:59:19 +00004669
4670#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004671
4672/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004673
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004674static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4676 accept_doc},
4677 {"bind", (PyCFunction)sock_bind, METH_O,
4678 bind_doc},
4679 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004680 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 {"connect", (PyCFunction)sock_connect, METH_O,
4682 connect_doc},
4683 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4684 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004685 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4686 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4688 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004689#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 {"getpeername", (PyCFunction)sock_getpeername,
4691 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 {"getsockname", (PyCFunction)sock_getsockname,
4694 METH_NOARGS, getsockname_doc},
4695 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4696 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004697#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4699 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004700#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004701#if defined(MS_WINDOWS)
4702 {"share", (PyCFunction)sock_share, METH_VARARGS,
4703 sock_share_doc},
4704#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004705 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 listen_doc},
4707 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4708 recv_doc},
4709 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4710 recv_into_doc},
4711 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4712 recvfrom_doc},
4713 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4714 recvfrom_into_doc},
4715 {"send", (PyCFunction)sock_send, METH_VARARGS,
4716 send_doc},
4717 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4718 sendall_doc},
4719 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4720 sendto_doc},
4721 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4722 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004723 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4724 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4726 settimeout_doc},
4727 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4728 gettimeout_doc},
4729 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4730 setsockopt_doc},
4731 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4732 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004733#ifdef CMSG_LEN
4734 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4735 recvmsg_doc},
4736 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4737 recvmsg_into_doc,},
4738 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4739 sendmsg_doc},
4740#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004741#ifdef HAVE_SOCKADDR_ALG
4742 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4743 sendmsg_afalg_doc},
4744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004746};
4747
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004748/* SockObject members */
4749static PyMemberDef sock_memberlist[] = {
4750 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4751 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4752 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004753 {0},
4754};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004755
Victor Stinner71694d52015-03-28 01:18:54 +01004756static PyGetSetDef sock_getsetlist[] = {
4757 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4758 {NULL} /* sentinel */
4759};
4760
Guido van Rossum73624e91994-10-10 17:59:00 +00004761/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004762 First close the file description. */
4763
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004764static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004765sock_finalize(PySocketSockObject *s)
4766{
4767 SOCKET_T fd;
4768 PyObject *error_type, *error_value, *error_traceback;
4769
4770 /* Save the current exception, if any. */
4771 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4772
Victor Stinnerd3afb622016-07-22 17:47:09 +02004773 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004774 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4775 /* Spurious errors can appear at shutdown */
4776 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4777 PyErr_WriteUnraisable((PyObject *)s);
4778 }
4779 }
4780
4781 /* Only close the socket *after* logging the ResourceWarning warning
4782 to allow the logger to call socket methods like
4783 socket.getsockname(). If the socket is closed before, socket
4784 methods fails with the EBADF error. */
4785 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004786 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004787
4788 /* We do not want to retry upon EINTR: see sock_close() */
4789 Py_BEGIN_ALLOW_THREADS
4790 (void) SOCKETCLOSE(fd);
4791 Py_END_ALLOW_THREADS
4792 }
4793
4794 /* Restore the saved exception. */
4795 PyErr_Restore(error_type, error_value, error_traceback);
4796}
4797
4798static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004799sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004800{
Victor Stinner19a8e842016-03-21 16:36:48 +01004801 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4802 return;
4803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004805}
4806
Guido van Rossum30a685f1991-06-27 15:51:29 +00004807
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004808static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004809sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004810{
Victor Stinnere254e532014-07-26 14:36:55 +02004811 long sock_fd;
4812 /* On Windows, this test is needed because SOCKET_T is unsigned */
4813 if (s->sock_fd == INVALID_SOCKET) {
4814 sock_fd = -1;
4815 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004816#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004817 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 /* this can occur on Win64, and actually there is a special
4819 ugly printf formatter for decimal pointer length integer
4820 printing, only bother if necessary*/
4821 PyErr_SetString(PyExc_OverflowError,
4822 "no printf formatter to display "
4823 "the socket descriptor in decimal");
4824 return NULL;
4825 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004826#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004827 else
4828 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 return PyUnicode_FromFormat(
4830 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004831 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004832 s->sock_type,
4833 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004834}
4835
4836
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004837/* Create a new, uninitialized socket object. */
4838
4839static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004840sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 new = type->tp_alloc(type, 0);
4845 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004846 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004847 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 ((PySocketSockObject *)new)->errorhandler = &set_error;
4849 }
4850 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004851}
4852
4853
4854/* Initialize a new socket object. */
4855
Victor Stinnerdaf45552013-08-28 00:53:59 +02004856#ifdef SOCK_CLOEXEC
4857/* socket() and socketpair() fail with EINVAL on Linux kernel older
4858 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4859static int sock_cloexec_works = -1;
4860#endif
4861
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004862/*ARGSUSED*/
4863static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004864sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 PySocketSockObject *s = (PySocketSockObject *)self;
4867 PyObject *fdobj = NULL;
4868 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004869 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004871#ifndef MS_WINDOWS
4872#ifdef SOCK_CLOEXEC
4873 int *atomic_flag_works = &sock_cloexec_works;
4874#else
4875 int *atomic_flag_works = NULL;
4876#endif
4877#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4880 "|iiiO:socket", keywords,
4881 &family, &type, &proto, &fdobj))
4882 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004885#ifdef MS_WINDOWS
4886 /* recreate a socket that was duplicated */
4887 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004888 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004889 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4890 PyErr_Format(PyExc_ValueError,
4891 "socket descriptor string has wrong size, "
4892 "should be %zu bytes.", sizeof(info));
4893 return -1;
4894 }
4895 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4896 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004897 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004898 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4899 Py_END_ALLOW_THREADS
4900 if (fd == INVALID_SOCKET) {
4901 set_error();
4902 return -1;
4903 }
4904 family = info.iAddressFamily;
4905 type = info.iSocketType;
4906 proto = info.iProtocol;
4907 }
4908 else
4909#endif
4910 {
4911 fd = PyLong_AsSocket_t(fdobj);
4912 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4913 return -1;
4914 if (fd == INVALID_SOCKET) {
4915 PyErr_SetString(PyExc_ValueError,
4916 "can't use invalid socket value");
4917 return -1;
4918 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004919
4920 if (family == -1) {
4921 sock_addr_t addrbuf;
4922 socklen_t addrlen = sizeof(sock_addr_t);
4923
4924 memset(&addrbuf, 0, addrlen);
4925 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4926 family = SAS2SA(&addrbuf)->sa_family;
4927 } else {
4928#ifdef MS_WINDOWS
4929 PyErr_SetFromWindowsErrWithFilename(0, "family");
4930#else
4931 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4932#endif
4933 return -1;
4934 }
4935 }
4936#ifdef SO_TYPE
4937 if (type == -1) {
4938 int tmp;
4939 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004940 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4941 (void *)&tmp, &slen) == 0)
4942 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004943 type = tmp;
4944 } else {
4945#ifdef MS_WINDOWS
4946 PyErr_SetFromWindowsErrWithFilename(0, "type");
4947#else
4948 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4949#endif
4950 return -1;
4951 }
4952 }
4953#else
4954 type = SOCK_STREAM;
4955#endif
4956#ifdef SO_PROTOCOL
4957 if (proto == -1) {
4958 int tmp;
4959 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004960 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4961 (void *)&tmp, &slen) == 0)
4962 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004963 proto = tmp;
4964 } else {
4965#ifdef MS_WINDOWS
4966 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4967#else
4968 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4969#endif
4970 return -1;
4971 }
4972 }
4973#else
4974 proto = 0;
4975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 }
4977 }
4978 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004979 /* No fd, default to AF_INET and SOCK_STREAM */
4980 if (family == -1) {
4981 family = AF_INET;
4982 }
4983 if (type == -1) {
4984 type = SOCK_STREAM;
4985 }
4986 if (proto == -1) {
4987 proto = 0;
4988 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004989#ifdef MS_WINDOWS
4990 /* Windows implementation */
4991#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4992#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4993#endif
4994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004996 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004997 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004998 NULL, 0,
4999 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5000 if (fd == INVALID_SOCKET) {
5001 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5002 support_wsa_no_inherit = 0;
5003 fd = socket(family, type, proto);
5004 }
5005 }
5006 else {
5007 fd = socket(family, type, proto);
5008 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 if (fd == INVALID_SOCKET) {
5012 set_error();
5013 return -1;
5014 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005015
5016 if (!support_wsa_no_inherit) {
5017 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5018 closesocket(fd);
5019 PyErr_SetFromWindowsErr(0);
5020 return -1;
5021 }
5022 }
5023#else
5024 /* UNIX */
5025 Py_BEGIN_ALLOW_THREADS
5026#ifdef SOCK_CLOEXEC
5027 if (sock_cloexec_works != 0) {
5028 fd = socket(family, type | SOCK_CLOEXEC, proto);
5029 if (sock_cloexec_works == -1) {
5030 if (fd >= 0) {
5031 sock_cloexec_works = 1;
5032 }
5033 else if (errno == EINVAL) {
5034 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5035 sock_cloexec_works = 0;
5036 fd = socket(family, type, proto);
5037 }
5038 }
5039 }
5040 else
5041#endif
5042 {
5043 fd = socket(family, type, proto);
5044 }
5045 Py_END_ALLOW_THREADS
5046
5047 if (fd == INVALID_SOCKET) {
5048 set_error();
5049 return -1;
5050 }
5051
5052 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5053 SOCKETCLOSE(fd);
5054 return -1;
5055 }
5056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005058 if (init_sockobject(s, fd, family, type, proto) == -1) {
5059 SOCKETCLOSE(fd);
5060 return -1;
5061 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005064
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005065}
5066
5067
Guido van Rossumb6775db1994-08-01 11:34:53 +00005068/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005069
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005070static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5072 "_socket.socket", /* tp_name */
5073 sizeof(PySocketSockObject), /* tp_basicsize */
5074 0, /* tp_itemsize */
5075 (destructor)sock_dealloc, /* tp_dealloc */
5076 0, /* tp_print */
5077 0, /* tp_getattr */
5078 0, /* tp_setattr */
5079 0, /* tp_reserved */
5080 (reprfunc)sock_repr, /* tp_repr */
5081 0, /* tp_as_number */
5082 0, /* tp_as_sequence */
5083 0, /* tp_as_mapping */
5084 0, /* tp_hash */
5085 0, /* tp_call */
5086 0, /* tp_str */
5087 PyObject_GenericGetAttr, /* tp_getattro */
5088 0, /* tp_setattro */
5089 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005090 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5091 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 sock_doc, /* tp_doc */
5093 0, /* tp_traverse */
5094 0, /* tp_clear */
5095 0, /* tp_richcompare */
5096 0, /* tp_weaklistoffset */
5097 0, /* tp_iter */
5098 0, /* tp_iternext */
5099 sock_methods, /* tp_methods */
5100 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005101 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 0, /* tp_base */
5103 0, /* tp_dict */
5104 0, /* tp_descr_get */
5105 0, /* tp_descr_set */
5106 0, /* tp_dictoffset */
5107 sock_initobj, /* tp_init */
5108 PyType_GenericAlloc, /* tp_alloc */
5109 sock_new, /* tp_new */
5110 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005111 0, /* tp_is_gc */
5112 0, /* tp_bases */
5113 0, /* tp_mro */
5114 0, /* tp_cache */
5115 0, /* tp_subclasses */
5116 0, /* tp_weaklist */
5117 0, /* tp_del */
5118 0, /* tp_version_tag */
5119 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005120};
5121
Guido van Rossum30a685f1991-06-27 15:51:29 +00005122
Guido van Rossum81194471991-07-27 21:42:02 +00005123/* Python interface to gethostname(). */
5124
5125/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005126static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005127socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005128{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005129#ifdef MS_WINDOWS
5130 /* Don't use winsock's gethostname, as this returns the ANSI
5131 version of the hostname, whereas we need a Unicode string.
5132 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005133 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005134 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005135 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005136 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005137
5138 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005139 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005140
5141 if (GetLastError() != ERROR_MORE_DATA)
5142 return PyErr_SetFromWindowsErr(0);
5143
5144 if (size == 0)
5145 return PyUnicode_New(0, 0);
5146
5147 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5148 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005149 name = PyMem_New(wchar_t, size);
5150 if (!name) {
5151 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005152 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005153 }
Victor Stinner74168972011-11-17 01:11:36 +01005154 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5155 name,
5156 &size))
5157 {
5158 PyMem_Free(name);
5159 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005160 }
Victor Stinner74168972011-11-17 01:11:36 +01005161
5162 result = PyUnicode_FromWideChar(name, size);
5163 PyMem_Free(name);
5164 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005165#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 char buf[1024];
5167 int res;
5168 Py_BEGIN_ALLOW_THREADS
5169 res = gethostname(buf, (int) sizeof buf - 1);
5170 Py_END_ALLOW_THREADS
5171 if (res < 0)
5172 return set_error();
5173 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005174 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005175#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005176}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005178PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005179"gethostname() -> string\n\
5180\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005181Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005182
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005183#ifdef HAVE_SETHOSTNAME
5184PyDoc_STRVAR(sethostname_doc,
5185"sethostname(name)\n\n\
5186Sets the hostname to name.");
5187
5188static PyObject *
5189socket_sethostname(PyObject *self, PyObject *args)
5190{
5191 PyObject *hnobj;
5192 Py_buffer buf;
5193 int res, flag = 0;
5194
Christian Heimesd2774c72013-06-19 02:06:29 +02005195#ifdef _AIX
5196/* issue #18259, not declared in any useful header file */
5197extern int sethostname(const char *, size_t);
5198#endif
5199
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005200 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5201 PyErr_Clear();
5202 if (!PyArg_ParseTuple(args, "O&:sethostname",
5203 PyUnicode_FSConverter, &hnobj))
5204 return NULL;
5205 flag = 1;
5206 }
5207 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5208 if (!res) {
5209 res = sethostname(buf.buf, buf.len);
5210 PyBuffer_Release(&buf);
5211 }
5212 if (flag)
5213 Py_DECREF(hnobj);
5214 if (res)
5215 return set_error();
5216 Py_RETURN_NONE;
5217}
5218#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005219
Guido van Rossum30a685f1991-06-27 15:51:29 +00005220/* Python interface to gethostbyname(name). */
5221
5222/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005224socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 char *name;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005227 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005228 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005229
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005230 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 return NULL;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005232 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005233 goto finally;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005234 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005235finally:
5236 PyMem_Free(name);
5237 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005238}
5239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005240PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005241"gethostbyname(host) -> address\n\
5242\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005243Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005244
5245
Victor Stinner72400302016-01-28 15:41:01 +01005246static PyObject*
5247sock_decode_hostname(const char *name)
5248{
5249#ifdef MS_WINDOWS
5250 /* Issue #26227: gethostbyaddr() returns a string encoded
5251 * to the ANSI code page */
5252 return PyUnicode_DecodeFSDefault(name);
5253#else
5254 /* Decode from UTF-8 */
5255 return PyUnicode_FromString(name);
5256#endif
5257}
5258
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005259/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5260
5261static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005262gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 char **pch;
5265 PyObject *rtn_tuple = (PyObject *)NULL;
5266 PyObject *name_list = (PyObject *)NULL;
5267 PyObject *addr_list = (PyObject *)NULL;
5268 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005269 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 if (h == NULL) {
5272 /* Let's get real error message to return */
5273 set_herror(h_errno);
5274 return NULL;
5275 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 if (h->h_addrtype != af) {
5278 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005279 errno = EAFNOSUPPORT;
5280 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 return NULL;
5282 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 case AF_INET:
5287 if (alen < sizeof(struct sockaddr_in))
5288 return NULL;
5289 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005290
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005291#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 case AF_INET6:
5293 if (alen < sizeof(struct sockaddr_in6))
5294 return NULL;
5295 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005296#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 if ((name_list = PyList_New(0)) == NULL)
5301 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 if ((addr_list = PyList_New(0)) == NULL)
5304 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 /* SF #1511317: h_aliases can be NULL */
5307 if (h->h_aliases) {
5308 for (pch = h->h_aliases; *pch != NULL; pch++) {
5309 int status;
5310 tmp = PyUnicode_FromString(*pch);
5311 if (tmp == NULL)
5312 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 status = PyList_Append(name_list, tmp);
5315 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 if (status)
5318 goto err;
5319 }
5320 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5323 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 case AF_INET:
5328 {
5329 struct sockaddr_in sin;
5330 memset(&sin, 0, sizeof(sin));
5331 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005332#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005336 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 if (pch == h->h_addr_list && alen >= sizeof(sin))
5339 memcpy((char *) addr, &sin, sizeof(sin));
5340 break;
5341 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005342
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005343#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 case AF_INET6:
5345 {
5346 struct sockaddr_in6 sin6;
5347 memset(&sin6, 0, sizeof(sin6));
5348 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005353 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5356 memcpy((char *) addr, &sin6, sizeof(sin6));
5357 break;
5358 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005359#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005362 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 "unsupported address family");
5364 return NULL;
5365 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 if (tmp == NULL)
5368 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 status = PyList_Append(addr_list, tmp);
5371 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 if (status)
5374 goto err;
5375 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005376
Victor Stinner72400302016-01-28 15:41:01 +01005377 name = sock_decode_hostname(h->h_name);
5378 if (name == NULL)
5379 goto err;
5380 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005381
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005382 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 Py_XDECREF(name_list);
5384 Py_XDECREF(addr_list);
5385 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005386}
5387
5388
5389/* Python interface to gethostbyname_ex(name). */
5390
5391/*ARGSUSED*/
5392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005393socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 char *name;
5396 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005397 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005399 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005400#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005402#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005404#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 char buf[16384];
5406 int buf_len = (sizeof buf) - 1;
5407 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005408#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005409#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005411#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005412#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005414 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005416 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005417 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005419#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005420#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005421 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005423#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005425#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 memset((void *) &data, '\0', sizeof(data));
5427 result = gethostbyname_r(name, &hp_allocated, &data);
5428 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005429#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005430#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005431#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005433#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005434 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005436#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 Py_END_ALLOW_THREADS
5438 /* Some C libraries would require addr.__ss_family instead of
5439 addr.ss_family.
5440 Therefore, we cast the sockaddr_storage into sockaddr to
5441 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005442 sa = SAS2SA(&addr);
5443 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005445#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005447#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005448finally:
5449 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005451}
5452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005453PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005454"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5455\n\
5456Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005457for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005458
5459
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005460/* Python interface to gethostbyaddr(IP). */
5461
5462/*ARGSUSED*/
5463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005464socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005465{
Charles-François Natali8b759652011-12-23 16:44:51 +01005466 sock_addr_t addr;
5467 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 char *ip_num;
5469 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005470 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005471#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005473#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 /* glibcs up to 2.10 assume that the buf argument to
5477 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5478 does not ensure. The attribute below instructs the compiler
5479 to maintain this alignment. */
5480 char buf[16384] Py_ALIGNED(8);
5481 int buf_len = (sizeof buf) - 1;
5482 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005483#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005484#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005486#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005487#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005488 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 int al;
5490 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005491
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005492 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 return NULL;
5494 af = AF_UNSPEC;
5495 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005496 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 af = sa->sa_family;
5498 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005499 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 switch (af) {
5501 case AF_INET:
5502 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5503 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5504 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005505#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 case AF_INET6:
5507 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5508 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5509 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005512 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005513 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 }
5515 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005516#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005517#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005518 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 &hp_allocated, buf, buf_len,
5520 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005521#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 h = gethostbyaddr_r(ap, al, af,
5523 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005524#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 memset((void *) &data, '\0', sizeof(data));
5526 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5527 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005528#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005529#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005530#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005532#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005533 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005535#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005537 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005538#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005540#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005541finally:
5542 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005544}
5545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005546PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005547"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5548\n\
5549Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005550for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005551
Guido van Rossum30a685f1991-06-27 15:51:29 +00005552
5553/* Python interface to getservbyname(name).
5554 This only returns the port number, since the other info is already
5555 known or not useful (like the list of aliases). */
5556
5557/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005558static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005559socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005560{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005561 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 struct servent *sp;
5563 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5564 return NULL;
5565 Py_BEGIN_ALLOW_THREADS
5566 sp = getservbyname(name, proto);
5567 Py_END_ALLOW_THREADS
5568 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005569 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 return NULL;
5571 }
5572 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005573}
5574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005575PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005576"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005577\n\
5578Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005579The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5580otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005581
Guido van Rossum30a685f1991-06-27 15:51:29 +00005582
Barry Warsaw11b91a02004-06-28 00:50:43 +00005583/* Python interface to getservbyport(port).
5584 This only returns the service name, since the other info is already
5585 known or not useful (like the list of aliases). */
5586
5587/*ARGSUSED*/
5588static PyObject *
5589socket_getservbyport(PyObject *self, PyObject *args)
5590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005592 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 struct servent *sp;
5594 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5595 return NULL;
5596 if (port < 0 || port > 0xffff) {
5597 PyErr_SetString(
5598 PyExc_OverflowError,
5599 "getservbyport: port must be 0-65535.");
5600 return NULL;
5601 }
5602 Py_BEGIN_ALLOW_THREADS
5603 sp = getservbyport(htons((short)port), proto);
5604 Py_END_ALLOW_THREADS
5605 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005606 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 return NULL;
5608 }
5609 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005610}
5611
5612PyDoc_STRVAR(getservbyport_doc,
5613"getservbyport(port[, protocolname]) -> string\n\
5614\n\
5615Return the service name from a port number and protocol name.\n\
5616The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5617otherwise any protocol will match.");
5618
Guido van Rossum3901d851996-12-19 16:35:04 +00005619/* Python interface to getprotobyname(name).
5620 This only returns the protocol number, since the other info is
5621 already known or not useful (like the list of aliases). */
5622
5623/*ARGSUSED*/
5624static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005625socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005626{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005627 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 struct protoent *sp;
5629 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5630 return NULL;
5631 Py_BEGIN_ALLOW_THREADS
5632 sp = getprotobyname(name);
5633 Py_END_ALLOW_THREADS
5634 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005635 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 return NULL;
5637 }
5638 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005639}
5640
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005641PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005642"getprotobyname(name) -> integer\n\
5643\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005644Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005645
Christian Heimesd0e31b92018-01-27 09:54:13 +01005646static PyObject *
5647socket_close(PyObject *self, PyObject *fdobj)
5648{
5649 SOCKET_T fd;
5650 int res;
5651
5652 fd = PyLong_AsSocket_t(fdobj);
5653 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5654 return NULL;
5655 Py_BEGIN_ALLOW_THREADS
5656 res = SOCKETCLOSE(fd);
5657 Py_END_ALLOW_THREADS
5658 /* bpo-30319: The peer can already have closed the connection.
5659 Python ignores ECONNRESET on close(). */
5660 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5661 return set_error();
5662 }
5663 Py_RETURN_NONE;
5664}
5665
5666PyDoc_STRVAR(close_doc,
5667"close(integer) -> None\n\
5668\n\
5669Close an integer socket file descriptor. This is like os.close(), but for\n\
5670sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005671
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005672#ifndef NO_DUP
5673/* dup() function for socket fds */
5674
5675static PyObject *
5676socket_dup(PyObject *self, PyObject *fdobj)
5677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 SOCKET_T fd, newfd;
5679 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005680#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005681 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005682#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 fd = PyLong_AsSocket_t(fdobj);
5685 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5686 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005687
Victor Stinnerdaf45552013-08-28 00:53:59 +02005688#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005689 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005690 return set_error();
5691
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005692 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005693 FROM_PROTOCOL_INFO,
5694 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 if (newfd == INVALID_SOCKET)
5696 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005697
Victor Stinnerdaf45552013-08-28 00:53:59 +02005698 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5699 closesocket(newfd);
5700 PyErr_SetFromWindowsErr(0);
5701 return NULL;
5702 }
5703#else
5704 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5705 newfd = _Py_dup(fd);
5706 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005707 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005708#endif
5709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 newfdobj = PyLong_FromSocket_t(newfd);
5711 if (newfdobj == NULL)
5712 SOCKETCLOSE(newfd);
5713 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005714}
5715
5716PyDoc_STRVAR(dup_doc,
5717"dup(integer) -> integer\n\
5718\n\
5719Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5720sockets; on some platforms os.dup() won't work for socket file descriptors.");
5721#endif
5722
5723
Dave Cole331708b2004-08-09 04:51:41 +00005724#ifdef HAVE_SOCKETPAIR
5725/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005726 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005727 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005728
5729/*ARGSUSED*/
5730static PyObject *
5731socket_socketpair(PyObject *self, PyObject *args)
5732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 PySocketSockObject *s0 = NULL, *s1 = NULL;
5734 SOCKET_T sv[2];
5735 int family, type = SOCK_STREAM, proto = 0;
5736 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005737#ifdef SOCK_CLOEXEC
5738 int *atomic_flag_works = &sock_cloexec_works;
5739#else
5740 int *atomic_flag_works = NULL;
5741#endif
5742 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005743
5744#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005746#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5750 &family, &type, &proto))
5751 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005754 Py_BEGIN_ALLOW_THREADS
5755#ifdef SOCK_CLOEXEC
5756 if (sock_cloexec_works != 0) {
5757 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5758 if (sock_cloexec_works == -1) {
5759 if (ret >= 0) {
5760 sock_cloexec_works = 1;
5761 }
5762 else if (errno == EINVAL) {
5763 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5764 sock_cloexec_works = 0;
5765 ret = socketpair(family, type, proto, sv);
5766 }
5767 }
5768 }
5769 else
5770#endif
5771 {
5772 ret = socketpair(family, type, proto, sv);
5773 }
5774 Py_END_ALLOW_THREADS
5775
5776 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005778
5779 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5780 goto finally;
5781 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5782 goto finally;
5783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 s0 = new_sockobject(sv[0], family, type, proto);
5785 if (s0 == NULL)
5786 goto finally;
5787 s1 = new_sockobject(sv[1], family, type, proto);
5788 if (s1 == NULL)
5789 goto finally;
5790 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005791
5792finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 if (res == NULL) {
5794 if (s0 == NULL)
5795 SOCKETCLOSE(sv[0]);
5796 if (s1 == NULL)
5797 SOCKETCLOSE(sv[1]);
5798 }
5799 Py_XDECREF(s0);
5800 Py_XDECREF(s1);
5801 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005802}
5803
5804PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005805"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005806\n\
5807Create a pair of socket objects from the sockets returned by the platform\n\
5808socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005809The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005810AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005811
5812#endif /* HAVE_SOCKETPAIR */
5813
5814
Guido van Rossum006bf911996-06-12 04:04:55 +00005815static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005816socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005817{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005818 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005819
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005820 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 return NULL;
5822 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005823 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005825 "ntohs: can't convert negative Python int to C "
5826 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 return NULL;
5828 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005829 if (x > 0xffff) {
5830 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5831 "ntohs: Python int too large to convert to C "
5832 "16-bit unsigned integer (The silent truncation "
5833 "is deprecated)",
5834 1)) {
5835 return NULL;
5836 }
5837 }
5838 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005839}
5840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005841PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005842"ntohs(integer) -> integer\n\
5843\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005844Convert a 16-bit unsigned integer from network to host byte order.\n\
5845Note that in case the received integer does not fit in 16-bit unsigned\n\
5846integer, but does fit in a positive C int, it is silently truncated to\n\
584716-bit unsigned integer.\n\
5848However, this silent truncation feature is deprecated, and will raise an \n\
5849exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005850
5851
Guido van Rossum006bf911996-06-12 04:04:55 +00005852static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005853socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 if (PyLong_Check(arg)) {
5858 x = PyLong_AsUnsignedLong(arg);
5859 if (x == (unsigned long) -1 && PyErr_Occurred())
5860 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005861#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 {
5863 unsigned long y;
5864 /* only want the trailing 32 bits */
5865 y = x & 0xFFFFFFFFUL;
5866 if (y ^ x)
5867 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005868 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 x = y;
5870 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 }
5873 else
5874 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005875 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005878}
5879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005880PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005881"ntohl(integer) -> integer\n\
5882\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005883Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005884
5885
Guido van Rossum006bf911996-06-12 04:04:55 +00005886static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005887socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005888{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005889 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005890
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005891 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 return NULL;
5893 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005894 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005896 "htons: can't convert negative Python int to C "
5897 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 return NULL;
5899 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005900 if (x > 0xffff) {
5901 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5902 "htons: Python int too large to convert to C "
5903 "16-bit unsigned integer (The silent truncation "
5904 "is deprecated)",
5905 1)) {
5906 return NULL;
5907 }
5908 }
5909 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005910}
5911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005912PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005913"htons(integer) -> integer\n\
5914\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005915Convert a 16-bit unsigned integer from host to network byte order.\n\
5916Note that in case the received integer does not fit in 16-bit unsigned\n\
5917integer, but does fit in a positive C int, it is silently truncated to\n\
591816-bit unsigned integer.\n\
5919However, this silent truncation feature is deprecated, and will raise an \n\
5920exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005921
5922
Guido van Rossum006bf911996-06-12 04:04:55 +00005923static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005924socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 if (PyLong_Check(arg)) {
5929 x = PyLong_AsUnsignedLong(arg);
5930 if (x == (unsigned long) -1 && PyErr_Occurred())
5931 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005932#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 {
5934 unsigned long y;
5935 /* only want the trailing 32 bits */
5936 y = x & 0xFFFFFFFFUL;
5937 if (y ^ x)
5938 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005939 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 x = y;
5941 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 }
5944 else
5945 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005946 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 Py_TYPE(arg)->tp_name);
5948 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005949}
5950
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005951PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005952"htonl(integer) -> integer\n\
5953\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005954Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005955
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005956/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005958PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005959"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005960\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005961Convert 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 +00005962binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005963
5964static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005965socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005966{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005967#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005969#endif
5970
5971#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005972#if (SIZEOF_INT != 4)
5973#error "Not sure if in_addr_t exists and int is not 32-bits."
5974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 /* Have to use inet_addr() instead */
5976 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005977#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005978 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5981 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005982
Tim Peters1df9fdd2003-02-13 03:13:40 +00005983
5984#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005985
5986#ifdef USE_INET_ATON_WEAKLINK
5987 if (inet_aton != NULL) {
5988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 if (inet_aton(ip_addr, &buf))
5990 return PyBytes_FromStringAndSize((char *)(&buf),
5991 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005992
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005993 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 "illegal IP address string passed to inet_aton");
5995 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005996
Thomas Wouters477c8d52006-05-27 19:21:47 +00005997#ifdef USE_INET_ATON_WEAKLINK
5998 } else {
5999#endif
6000
6001#endif
6002
6003#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 /* special-case this address as inet_addr might return INADDR_NONE
6006 * for this */
6007 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006008 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006010
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006011 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006015 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 "illegal IP address string passed to inet_aton");
6017 return NULL;
6018 }
6019 }
6020 return PyBytes_FromStringAndSize((char *) &packed_addr,
6021 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006022
6023#ifdef USE_INET_ATON_WEAKLINK
6024 }
6025#endif
6026
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006027#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006028}
6029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006030PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006031"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006033Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006034
6035static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006036socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006037{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006038 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006040
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006041 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 return NULL;
6043 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006044
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006045 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006046 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006048 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 return NULL;
6050 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006051
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006052 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6053 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006054
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006055 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006057}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006058
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006059#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006060
6061PyDoc_STRVAR(inet_pton_doc,
6062"inet_pton(af, ip) -> packed IP address string\n\
6063\n\
6064Convert an IP address from string format to a packed string suitable\n\
6065for use with low-level network functions.");
6066
6067static PyObject *
6068socket_inet_pton(PyObject *self, PyObject *args)
6069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006071 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006073#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006074 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006075#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6079 return NULL;
6080 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006081
Martin v. Löwis04697e82004-06-02 12:35:29 +00006082#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006084 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 "can't use AF_INET6, IPv6 is disabled");
6086 return NULL;
6087 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006088#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 retval = inet_pton(af, ip, packed);
6091 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006092 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 return NULL;
6094 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006095 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 "illegal IP address string passed to inet_pton");
6097 return NULL;
6098 } else if (af == AF_INET) {
6099 return PyBytes_FromStringAndSize(packed,
6100 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006101#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 } else if (af == AF_INET6) {
6103 return PyBytes_FromStringAndSize(packed,
6104 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006107 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 return NULL;
6109 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006110}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006111
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006112PyDoc_STRVAR(inet_ntop_doc,
6113"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6114\n\
6115Convert a packed IP address of the given family to string format.");
6116
6117static PyObject *
6118socket_inet_ntop(PyObject *self, PyObject *args)
6119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006121 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006123#ifdef ENABLE_IPV6
Miss Islington (bot)04425992018-02-12 12:12:24 -08006124 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006125#else
Miss Islington (bot)04425992018-02-12 12:12:24 -08006126 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006127#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006128
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006129 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 return NULL;
6131 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006134 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 PyErr_SetString(PyExc_ValueError,
6136 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006137 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 return NULL;
6139 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006140#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006142 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 PyErr_SetString(PyExc_ValueError,
6144 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006145 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 return NULL;
6147 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 } else {
6150 PyErr_Format(PyExc_ValueError,
6151 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006152 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 return NULL;
6154 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006155
Miss Islington (bot)04425992018-02-12 12:12:24 -08006156 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006157 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6158 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006160 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 return NULL;
6162 } else {
6163 return PyUnicode_FromString(retval);
6164 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006165}
6166
6167#endif /* HAVE_INET_PTON */
6168
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169/* Python interface to getaddrinfo(host, port). */
6170
6171/*ARGSUSED*/
6172static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006173socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006174{
Victor Stinner77af1722011-05-26 14:05:59 +02006175 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006176 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 struct addrinfo hints, *res;
6178 struct addrinfo *res0 = NULL;
6179 PyObject *hobj = NULL;
6180 PyObject *pobj = (PyObject *)NULL;
6181 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006182 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183 int family, socktype, protocol, flags;
6184 int error;
6185 PyObject *all = (PyObject *)NULL;
6186 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006187
Georg Brandl6083a4b2013-10-14 06:51:46 +02006188 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006190 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006191 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 &protocol, &flags)) {
6193 return NULL;
6194 }
6195 if (hobj == Py_None) {
6196 hptr = NULL;
6197 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006198 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 if (!idna)
6200 return NULL;
6201 assert(PyBytes_Check(idna));
6202 hptr = PyBytes_AS_STRING(idna);
6203 } else if (PyBytes_Check(hobj)) {
6204 hptr = PyBytes_AsString(hobj);
6205 } else {
6206 PyErr_SetString(PyExc_TypeError,
6207 "getaddrinfo() argument 1 must be string or None");
6208 return NULL;
6209 }
6210 if (PyLong_CheckExact(pobj)) {
6211 long value = PyLong_AsLong(pobj);
6212 if (value == -1 && PyErr_Occurred())
6213 goto err;
6214 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6215 pptr = pbuf;
6216 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006217 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006218 if (pptr == NULL)
6219 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006221 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 } else if (pobj == Py_None) {
6223 pptr = (char *)NULL;
6224 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006225 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 goto err;
6227 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006228#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006229 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006230 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006231 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6232 * This workaround avoids a segfault in libsystem.
6233 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006234 pptr = "00";
6235 }
6236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 memset(&hints, 0, sizeof(hints));
6238 hints.ai_family = family;
6239 hints.ai_socktype = socktype;
6240 hints.ai_protocol = protocol;
6241 hints.ai_flags = flags;
6242 Py_BEGIN_ALLOW_THREADS
6243 ACQUIRE_GETADDRINFO_LOCK
6244 error = getaddrinfo(hptr, pptr, &hints, &res0);
6245 Py_END_ALLOW_THREADS
6246 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6247 if (error) {
6248 set_gaierror(error);
6249 goto err;
6250 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006251
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006252 all = PyList_New(0);
6253 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 goto err;
6255 for (res = res0; res; res = res->ai_next) {
6256 PyObject *single;
6257 PyObject *addr =
6258 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6259 if (addr == NULL)
6260 goto err;
6261 single = Py_BuildValue("iiisO", res->ai_family,
6262 res->ai_socktype, res->ai_protocol,
6263 res->ai_canonname ? res->ai_canonname : "",
6264 addr);
6265 Py_DECREF(addr);
6266 if (single == NULL)
6267 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 if (PyList_Append(all, single))
6270 goto err;
6271 Py_XDECREF(single);
6272 }
6273 Py_XDECREF(idna);
6274 if (res0)
6275 freeaddrinfo(res0);
6276 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006277 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 Py_XDECREF(all);
6279 Py_XDECREF(idna);
6280 if (res0)
6281 freeaddrinfo(res0);
6282 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006283}
6284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006285PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006286"getaddrinfo(host, port [, family, type, proto, flags])\n\
6287 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006288\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006289Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006290
6291/* Python interface to getnameinfo(sa, flags). */
6292
6293/*ARGSUSED*/
6294static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006295socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 PyObject *sa = (PyObject *)NULL;
6298 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006299 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006300 int port;
6301 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6303 struct addrinfo hints, *res = NULL;
6304 int error;
6305 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006306 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308 flags = flowinfo = scope_id = 0;
6309 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6310 return NULL;
6311 if (!PyTuple_Check(sa)) {
6312 PyErr_SetString(PyExc_TypeError,
6313 "getnameinfo() argument 1 must be a tuple");
6314 return NULL;
6315 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006316 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006318 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006320 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006321 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006322 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006323 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006324 return NULL;
6325 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6327 memset(&hints, 0, sizeof(hints));
6328 hints.ai_family = AF_UNSPEC;
6329 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006330 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 Py_BEGIN_ALLOW_THREADS
6332 ACQUIRE_GETADDRINFO_LOCK
6333 error = getaddrinfo(hostp, pbuf, &hints, &res);
6334 Py_END_ALLOW_THREADS
6335 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6336 if (error) {
6337 set_gaierror(error);
6338 goto fail;
6339 }
6340 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006341 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 "sockaddr resolved to multiple addresses");
6343 goto fail;
6344 }
6345 switch (res->ai_family) {
6346 case AF_INET:
6347 {
6348 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006349 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 "IPv4 sockaddr must be 2 tuple");
6351 goto fail;
6352 }
6353 break;
6354 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006355#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356 case AF_INET6:
6357 {
6358 struct sockaddr_in6 *sin6;
6359 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006360 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 sin6->sin6_scope_id = scope_id;
6362 break;
6363 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006366 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6368 if (error) {
6369 set_gaierror(error);
6370 goto fail;
6371 }
Victor Stinner72400302016-01-28 15:41:01 +01006372
6373 name = sock_decode_hostname(hbuf);
6374 if (name == NULL)
6375 goto fail;
6376 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006377
6378fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 if (res)
6380 freeaddrinfo(res);
6381 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006382}
6383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006384PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006385"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006386\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006387Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006388
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006389
6390/* Python API to getting and setting the default timeout value. */
6391
6392static PyObject *
6393socket_getdefaulttimeout(PyObject *self)
6394{
Victor Stinner71694d52015-03-28 01:18:54 +01006395 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006396 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 }
Victor Stinner71694d52015-03-28 01:18:54 +01006398 else {
6399 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6400 return PyFloat_FromDouble(seconds);
6401 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006402}
6403
6404PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006405"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006406\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006407Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006408A value of None indicates that new socket objects have no timeout.\n\
6409When the socket module is first imported, the default is None.");
6410
6411static PyObject *
6412socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6413{
Victor Stinner71694d52015-03-28 01:18:54 +01006414 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006415
Victor Stinner71694d52015-03-28 01:18:54 +01006416 if (socket_parse_timeout(&timeout, arg) < 0)
6417 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006420
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006421 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006422}
6423
6424PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006425"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006426\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006427Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006428A value of None indicates that new socket objects have no timeout.\n\
6429When the socket module is first imported, the default is None.");
6430
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006431#ifdef HAVE_IF_NAMEINDEX
6432/* Python API for getting interface indices and names */
6433
6434static PyObject *
6435socket_if_nameindex(PyObject *self, PyObject *arg)
6436{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006437 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006438 int i;
6439 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006440
Charles-François Natali60713592011-05-20 16:55:06 +02006441 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006442 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006443 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006444 return NULL;
6445 }
6446
6447 list = PyList_New(0);
6448 if (list == NULL) {
6449 if_freenameindex(ni);
6450 return NULL;
6451 }
6452
Charles-François Natali60713592011-05-20 16:55:06 +02006453 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6454 PyObject *ni_tuple = Py_BuildValue("IO&",
6455 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006456
6457 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6458 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006459 Py_DECREF(list);
6460 if_freenameindex(ni);
6461 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006462 }
6463 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006464 }
6465
6466 if_freenameindex(ni);
6467 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006468}
6469
6470PyDoc_STRVAR(if_nameindex_doc,
6471"if_nameindex()\n\
6472\n\
6473Returns a list of network interface information (index, name) tuples.");
6474
Charles-François Natali60713592011-05-20 16:55:06 +02006475static PyObject *
6476socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006477{
Charles-François Natali60713592011-05-20 16:55:06 +02006478 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006479 unsigned long index;
6480
Charles-François Natali60713592011-05-20 16:55:06 +02006481 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6482 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006483 return NULL;
6484
Charles-François Natali60713592011-05-20 16:55:06 +02006485 index = if_nametoindex(PyBytes_AS_STRING(oname));
6486 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006487 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006488 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006489 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006490 return NULL;
6491 }
6492
6493 return PyLong_FromUnsignedLong(index);
6494}
6495
6496PyDoc_STRVAR(if_nametoindex_doc,
6497"if_nametoindex(if_name)\n\
6498\n\
6499Returns the interface index corresponding to the interface name if_name.");
6500
Charles-François Natali60713592011-05-20 16:55:06 +02006501static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006502socket_if_indextoname(PyObject *self, PyObject *arg)
6503{
Charles-François Natali60713592011-05-20 16:55:06 +02006504 unsigned long index;
6505 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006506
Charles-François Natali60713592011-05-20 16:55:06 +02006507 index = PyLong_AsUnsignedLong(arg);
6508 if (index == (unsigned long) -1)
6509 return NULL;
6510
6511 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006512 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006513 return NULL;
6514 }
6515
Charles-François Natali60713592011-05-20 16:55:06 +02006516 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006517}
6518
6519PyDoc_STRVAR(if_indextoname_doc,
6520"if_indextoname(if_index)\n\
6521\n\
6522Returns the interface name corresponding to the interface index if_index.");
6523
6524#endif /* HAVE_IF_NAMEINDEX */
6525
6526
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006527#ifdef CMSG_LEN
6528/* Python interface to CMSG_LEN(length). */
6529
6530static PyObject *
6531socket_CMSG_LEN(PyObject *self, PyObject *args)
6532{
6533 Py_ssize_t length;
6534 size_t result;
6535
6536 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6537 return NULL;
6538 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6539 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6540 return NULL;
6541 }
6542 return PyLong_FromSize_t(result);
6543}
6544
6545PyDoc_STRVAR(CMSG_LEN_doc,
6546"CMSG_LEN(length) -> control message length\n\
6547\n\
6548Return the total length, without trailing padding, of an ancillary\n\
6549data item with associated data of the given length. This value can\n\
6550often be used as the buffer size for recvmsg() to receive a single\n\
6551item of ancillary data, but RFC 3542 requires portable applications to\n\
6552use CMSG_SPACE() and thus include space for padding, even when the\n\
6553item will be the last in the buffer. Raises OverflowError if length\n\
6554is outside the permissible range of values.");
6555
6556
6557#ifdef CMSG_SPACE
6558/* Python interface to CMSG_SPACE(length). */
6559
6560static PyObject *
6561socket_CMSG_SPACE(PyObject *self, PyObject *args)
6562{
6563 Py_ssize_t length;
6564 size_t result;
6565
6566 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6567 return NULL;
6568 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6569 PyErr_SetString(PyExc_OverflowError,
6570 "CMSG_SPACE() argument out of range");
6571 return NULL;
6572 }
6573 return PyLong_FromSize_t(result);
6574}
6575
6576PyDoc_STRVAR(CMSG_SPACE_doc,
6577"CMSG_SPACE(length) -> buffer size\n\
6578\n\
6579Return the buffer size needed for recvmsg() to receive an ancillary\n\
6580data item with associated data of the given length, along with any\n\
6581trailing padding. The buffer space needed to receive multiple items\n\
6582is the sum of the CMSG_SPACE() values for their associated data\n\
6583lengths. Raises OverflowError if length is outside the permissible\n\
6584range of values.");
6585#endif /* CMSG_SPACE */
6586#endif /* CMSG_LEN */
6587
6588
Guido van Rossum30a685f1991-06-27 15:51:29 +00006589/* List of functions exported by this module. */
6590
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006591static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 {"gethostbyname", socket_gethostbyname,
6593 METH_VARARGS, gethostbyname_doc},
6594 {"gethostbyname_ex", socket_gethostbyname_ex,
6595 METH_VARARGS, ghbn_ex_doc},
6596 {"gethostbyaddr", socket_gethostbyaddr,
6597 METH_VARARGS, gethostbyaddr_doc},
6598 {"gethostname", socket_gethostname,
6599 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006600#ifdef HAVE_SETHOSTNAME
6601 {"sethostname", socket_sethostname,
6602 METH_VARARGS, sethostname_doc},
6603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 {"getservbyname", socket_getservbyname,
6605 METH_VARARGS, getservbyname_doc},
6606 {"getservbyport", socket_getservbyport,
6607 METH_VARARGS, getservbyport_doc},
6608 {"getprotobyname", socket_getprotobyname,
6609 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006610 {"close", socket_close,
6611 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006612#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 {"dup", socket_dup,
6614 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006615#endif
Dave Cole331708b2004-08-09 04:51:41 +00006616#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 {"socketpair", socket_socketpair,
6618 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 {"ntohs", socket_ntohs,
6621 METH_VARARGS, ntohs_doc},
6622 {"ntohl", socket_ntohl,
6623 METH_O, ntohl_doc},
6624 {"htons", socket_htons,
6625 METH_VARARGS, htons_doc},
6626 {"htonl", socket_htonl,
6627 METH_O, htonl_doc},
6628 {"inet_aton", socket_inet_aton,
6629 METH_VARARGS, inet_aton_doc},
6630 {"inet_ntoa", socket_inet_ntoa,
6631 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006632#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 {"inet_pton", socket_inet_pton,
6634 METH_VARARGS, inet_pton_doc},
6635 {"inet_ntop", socket_inet_ntop,
6636 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006637#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006638 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6639 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 {"getnameinfo", socket_getnameinfo,
6641 METH_VARARGS, getnameinfo_doc},
6642 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6643 METH_NOARGS, getdefaulttimeout_doc},
6644 {"setdefaulttimeout", socket_setdefaulttimeout,
6645 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006646#ifdef HAVE_IF_NAMEINDEX
6647 {"if_nameindex", socket_if_nameindex,
6648 METH_NOARGS, if_nameindex_doc},
6649 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006650 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006651 {"if_indextoname", socket_if_indextoname,
6652 METH_O, if_indextoname_doc},
6653#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006654#ifdef CMSG_LEN
6655 {"CMSG_LEN", socket_CMSG_LEN,
6656 METH_VARARGS, CMSG_LEN_doc},
6657#ifdef CMSG_SPACE
6658 {"CMSG_SPACE", socket_CMSG_SPACE,
6659 METH_VARARGS, CMSG_SPACE_doc},
6660#endif
6661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006663};
6664
Guido van Rossum30a685f1991-06-27 15:51:29 +00006665
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006666#ifdef MS_WINDOWS
6667#define OS_INIT_DEFINED
6668
6669/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006670
6671static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006672os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006675}
6676
6677static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006678os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 WSADATA WSAData;
6681 int ret;
6682 ret = WSAStartup(0x0101, &WSAData);
6683 switch (ret) {
6684 case 0: /* No error */
6685 Py_AtExit(os_cleanup);
6686 return 1; /* Success */
6687 case WSASYSNOTREADY:
6688 PyErr_SetString(PyExc_ImportError,
6689 "WSAStartup failed: network not ready");
6690 break;
6691 case WSAVERNOTSUPPORTED:
6692 case WSAEINVAL:
6693 PyErr_SetString(
6694 PyExc_ImportError,
6695 "WSAStartup failed: requested version not supported");
6696 break;
6697 default:
6698 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6699 break;
6700 }
6701 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006702}
6703
Guido van Rossum8d665e61996-06-26 18:22:49 +00006704#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006705
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006706
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006707
6708#ifndef OS_INIT_DEFINED
6709static int
6710os_init(void)
6711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006713}
6714#endif
6715
6716
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006717/* C API table - always add new things to the end for binary
6718 compatibility. */
6719static
6720PySocketModule_APIObject PySocketModuleAPI =
6721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006722 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006723 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006725};
6726
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006727
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006728/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006729
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006730 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006731 "socket.py" which implements some additional functionality.
6732 The import of "_socket" may fail with an ImportError exception if
6733 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006734 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006735 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006736*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006738PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006739"Implementation module for socket operations.\n\
6740\n\
6741See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006742
Martin v. Löwis1a214512008-06-11 05:26:20 +00006743static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744 PyModuleDef_HEAD_INIT,
6745 PySocket_MODULE_NAME,
6746 socket_doc,
6747 -1,
6748 socket_methods,
6749 NULL,
6750 NULL,
6751 NULL,
6752 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006753};
6754
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006755PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006756PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760 if (!os_init())
6761 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006762
Victor Stinnerdaf45552013-08-28 00:53:59 +02006763#ifdef MS_WINDOWS
6764 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006765 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006766 }
6767#endif
6768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769 Py_TYPE(&sock_type) = &PyType_Type;
6770 m = PyModule_Create(&socketmodule);
6771 if (m == NULL)
6772 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006773
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006774 Py_INCREF(PyExc_OSError);
6775 PySocketModuleAPI.error = PyExc_OSError;
6776 Py_INCREF(PyExc_OSError);
6777 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006779 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 if (socket_herror == NULL)
6781 return NULL;
6782 Py_INCREF(socket_herror);
6783 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006784 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 NULL);
6786 if (socket_gaierror == NULL)
6787 return NULL;
6788 Py_INCREF(socket_gaierror);
6789 PyModule_AddObject(m, "gaierror", socket_gaierror);
6790 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006791 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792 if (socket_timeout == NULL)
6793 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006794 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 Py_INCREF(socket_timeout);
6796 PyModule_AddObject(m, "timeout", socket_timeout);
6797 Py_INCREF((PyObject *)&sock_type);
6798 if (PyModule_AddObject(m, "SocketType",
6799 (PyObject *)&sock_type) != 0)
6800 return NULL;
6801 Py_INCREF((PyObject *)&sock_type);
6802 if (PyModule_AddObject(m, "socket",
6803 (PyObject *)&sock_type) != 0)
6804 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006805
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006806#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006808#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006809 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 Py_INCREF(has_ipv6);
6812 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 /* Export C API */
6815 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6816 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6817 ) != 0)
6818 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006821#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006823#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006825#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006827#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006828#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006829 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006831#endif
6832#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006834#endif
6835#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006838#endif
6839#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006842#endif
6843#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006846#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006847#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006850#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006851#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006854#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006855#ifdef HAVE_SOCKADDR_ALG
6856 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6857#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006858#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006861#endif
6862#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#endif
6865#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006868#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006869#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006872#endif
6873#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006876#endif
6877#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006878 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006880#endif
6881#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006884#endif
6885#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, AF_NETLINK);
6888 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006889#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006891#endif
6892#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006894#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6896 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006897#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006899#endif
6900#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006902#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006903#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006905#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006906#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006908#endif
6909#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006911#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006913#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006915#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006916#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006918#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006919#ifdef NETLINK_CRYPTO
6920 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6921#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006922#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006923
6924#ifdef AF_VSOCK
6925 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6926 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6927 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6928 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6929 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6930 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6931 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6932 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6933 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6934#endif
6935
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006936#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006939#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006940#ifdef AF_LINK
6941 PyModule_AddIntMacro(m, AF_LINK);
6942#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006943#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006946#endif
6947#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006950#endif
6951#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006954#endif
6955#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006958#endif
6959#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006962#endif
6963#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006966#endif
6967#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006970#endif
6971#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006974#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006975
Hye-Shik Chang81268602004-02-02 06:05:24 +00006976#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6978 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6979 PyModule_AddIntMacro(m, BTPROTO_HCI);
6980 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006981#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006983#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006984#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006985#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006987#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6989 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006990#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6993 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006994#endif
6995
Charles-François Natali47413c12011-10-06 19:47:44 +02006996#ifdef AF_CAN
6997 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006999#endif
7000#ifdef PF_CAN
7001 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007003#endif
7004
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007005/* Reliable Datagram Sockets */
7006#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007008#endif
7009#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007011#endif
7012
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007013/* Kernel event messages */
7014#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007016#endif
7017#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007019#endif
7020
Antoine Pitroub156a462010-10-27 20:13:57 +00007021#ifdef AF_PACKET
7022 PyModule_AddIntMacro(m, AF_PACKET);
7023#endif
7024#ifdef PF_PACKET
7025 PyModule_AddIntMacro(m, PF_PACKET);
7026#endif
7027#ifdef PACKET_HOST
7028 PyModule_AddIntMacro(m, PACKET_HOST);
7029#endif
7030#ifdef PACKET_BROADCAST
7031 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7032#endif
7033#ifdef PACKET_MULTICAST
7034 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7035#endif
7036#ifdef PACKET_OTHERHOST
7037 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7038#endif
7039#ifdef PACKET_OUTGOING
7040 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7041#endif
7042#ifdef PACKET_LOOPBACK
7043 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7044#endif
7045#ifdef PACKET_FASTROUTE
7046 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007047#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007048
Christian Heimes043d6f62008-01-07 17:19:16 +00007049#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7054 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7055 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007056
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7058 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7059 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, SOL_TIPC);
7063 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7064 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7065 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7066 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007067
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7069 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7070 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7071 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007073 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7075 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007076#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007077 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007079#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7081 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7082 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7083 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7084 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7085 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007086#endif
7087
Christian Heimesdffa3942016-09-05 23:54:41 +02007088#ifdef HAVE_SOCKADDR_ALG
7089 /* Socket options */
7090 PyModule_AddIntMacro(m, ALG_SET_KEY);
7091 PyModule_AddIntMacro(m, ALG_SET_IV);
7092 PyModule_AddIntMacro(m, ALG_SET_OP);
7093 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7094 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7095 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7096
7097 /* Operations */
7098 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7099 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7100 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7101 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7102#endif
7103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOCK_STREAM);
7106 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007107/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007108#ifdef SOCK_RAW
7109 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007111#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007113#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007115#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007116#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007118#endif
7119#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007121#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007131#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007132#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007134#endif
7135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007154#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007157#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007185#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007186#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007188#endif
7189#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007191#endif
7192#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007194#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007195#ifdef SO_PASSSEC
7196 PyModule_AddIntMacro(m, SO_PASSSEC);
7197#endif
7198#ifdef SO_PEERSEC
7199 PyModule_AddIntMacro(m, SO_PEERSEC);
7200#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007201#ifdef SO_BINDTODEVICE
7202 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7203#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007204#ifdef SO_PRIORITY
7205 PyModule_AddIntMacro(m, SO_PRIORITY);
7206#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007207#ifdef SO_MARK
7208 PyModule_AddIntMacro(m, SO_MARK);
7209#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007210#ifdef SO_DOMAIN
7211 PyModule_AddIntMacro(m, SO_DOMAIN);
7212#endif
7213#ifdef SO_PROTOCOL
7214 PyModule_AddIntMacro(m, SO_PROTOCOL);
7215#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 /* Maximum number of connections for "listen" */
7218#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007220#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
7223
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007224 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007225#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007227#endif
7228#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007230#endif
7231#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007233#endif
7234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 /* Flags for send, recv */
7236#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007265#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007266#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007268#endif
7269#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007271#endif
7272#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007274#endif
7275#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007277#endif
7278#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007280#endif
7281#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007283#endif
7284#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007286#endif
7287#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007289#endif
7290#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007293#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007295#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 /* Protocol level and numbers, usable for [gs]etsockopt */
7298#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007330#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007331#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007333#endif
7334#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7336 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007337#endif
7338#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7340 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7341 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007342
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7344 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7345 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007346#ifdef CAN_ISOTP
7347 PyModule_AddIntMacro(m, CAN_ISOTP);
7348#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007349#endif
7350#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7352 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7353 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7354 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007355#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007356#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7357 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7358#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007359#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007361 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7362 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7363 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7364 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7365 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7366 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7367 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7368 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7369 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7370 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7371 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7372 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7373#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007374#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007376#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007377#ifdef HAVE_SOCKADDR_ALG
7378 PyModule_AddIntMacro(m, SOL_ALG);
7379#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007380#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007382#endif
7383#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007385#endif
7386#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007388#endif
7389#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007391#endif
7392#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007394#endif
7395#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007400#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007408#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007411#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007428#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007435 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007439#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007448#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007451#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007454#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007457#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007463#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007498#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007499#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007504#endif
7505/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007508#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007513#endif
7514
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007515#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007517#endif
7518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519 /* Some port configuration */
7520#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007529#endif
7530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531 /* Some reserved IP v.4 addresses */
7532#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007534#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007537#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552#ifdef INADDR_ALLHOSTS_GROUP
7553 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7554 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007555#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007560#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007563#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007565#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007566 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007567#endif
7568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569 /* IPv4 [gs]etsockopt options */
7570#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007617#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007618#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007620#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7623#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007626#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007629#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007632#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007641 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007642#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007646#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007648#endif
7649#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007651#endif
7652#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007654#endif
7655#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007657#endif
7658#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007660#endif
7661#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007663#endif
7664#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007666#endif
7667#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007669#endif
7670#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007672#endif
7673#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007675#endif
7676#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007678#endif
7679#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007681#endif
7682#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007684#endif
7685#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007687#endif
7688#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007690#endif
7691#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007693#endif
7694#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007696#endif
7697#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007699#endif
7700#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007702#endif
7703#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007705#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 /* TCP options */
7708#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007732#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007738#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007741#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007743#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007744#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007746#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007747#ifdef TCP_CONGESTION
7748 PyModule_AddIntMacro(m, TCP_CONGESTION);
7749#endif
7750#ifdef TCP_USER_TIMEOUT
7751 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7752#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007753#ifdef TCP_NOTSENT_LOWAT
7754 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7755#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007757 /* IPX options */
7758#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007759 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007760#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007761
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007762/* Reliable Datagram Sockets */
7763#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007765#endif
7766#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007768#endif
7769#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007771#endif
7772#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007774#endif
7775#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007777#endif
7778#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007780#endif
7781#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007783#endif
7784#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007786#endif
7787#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007789#endif
7790#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007792#endif
7793#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007795#endif
7796#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007798#endif
7799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007800 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007801#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007803#endif
7804#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007806#endif
7807#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007809#endif
7810#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007812#endif
7813#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007815#endif
7816#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007818#endif
7819#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007821#endif
7822#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007824#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007825#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007827#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007828#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007830#endif
7831#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007833#endif
7834#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007836#endif
7837#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007839#endif
7840#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007842#endif
7843#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007845#endif
7846#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007848#endif
7849#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007851#endif
7852#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007854#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007855#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007857#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007858#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007860#endif
7861#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007863#endif
7864#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007866#endif
7867#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007869#endif
7870#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007872#endif
7873#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007875#endif
7876#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007878#endif
7879#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007881#endif
7882#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007884#endif
7885#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007887#endif
7888#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007890#endif
7891#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007893#endif
7894#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007896#endif
7897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007898 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007899#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007900 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007901#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007902 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007904 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007905#endif
7906#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007908#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007910#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007912#endif
7913#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007914 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007915#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007916 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007917#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007918 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007919#endif
7920
Christian Heimesfaf2f632008-01-06 16:59:19 +00007921#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007922 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007923 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7924#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007925 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007926#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007927 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007928 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7929#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007930 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007931#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007932 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007933 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007934 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935 PyObject *tmp;
7936 tmp = PyLong_FromUnsignedLong(codes[i]);
7937 if (tmp == NULL)
7938 return NULL;
7939 PyModule_AddObject(m, names[i], tmp);
7940 }
7941 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007942 PyModule_AddIntMacro(m, RCVALL_OFF);
7943 PyModule_AddIntMacro(m, RCVALL_ON);
7944 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007945#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007947#endif
7948#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007950#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007951#endif /* _MSTCPIP_ */
7952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007953 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007954#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007956#endif
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08007957
7958#ifdef MS_WINDOWS
7959 /* remove some flags on older version Windows during run-time */
7960 remove_unusable_flags(m);
7961#endif
7962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007963 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007964}