blob: beadecfad50ec9e22f8e9ad1eb9beea2a6f140f4 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if !defined(WITH_THREAD)
167# undef HAVE_GETHOSTBYNAME_R
168#endif
169
170#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000172#endif
173
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000175# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# define HAVE_GETHOSTBYNAME_R_3_ARG
177# elif defined(__sun) || defined(__sgi)
178# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700179# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000180/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000181# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
182# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# else
184# undef HAVE_GETHOSTBYNAME_R
185# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000186#endif
187
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000188#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
189 !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 */
213#if defined(WITH_THREAD) && ( \
214 (defined(__APPLE__) && \
215 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000216 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100217 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
218 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100219 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000220#define USE_GETADDRINFO_LOCK
221#endif
222
223#ifdef USE_GETADDRINFO_LOCK
224#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
225#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
226#else
227#define ACQUIRE_GETADDRINFO_LOCK
228#define RELEASE_GETADDRINFO_LOCK
229#endif
230
231#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000232# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000233#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000234
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236# include <types.h>
237# include <io.h>
238# include <sys/ioctl.h>
239# include <utils.h>
240# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241#endif
242
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243#ifdef __APPLE__
244# include <sys/ioctl.h>
245#endif
246
247
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249/* make sure that the reentrant (gethostbyaddr_r etc)
250 functions are declared correctly if compiling with
251 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252
Thomas Wouters477c8d52006-05-27 19:21:47 +0000253/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000254 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000255#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000256#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000257
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000258#undef _XOPEN_SOURCE
259#include <sys/socket.h>
260#include <sys/types.h>
261#include <netinet/in.h>
262#ifdef _SS_ALIGNSIZE
263#define HAVE_GETADDRINFO 1
264#define HAVE_GETNAMEINFO 1
265#endif
266
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000267#define HAVE_INET_PTON
268#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000269#endif
270
Thomas Wouters477c8d52006-05-27 19:21:47 +0000271/* Irix 6.5 fails to define this variable at all. This is needed
272 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000273 are just busted. Same thing for Solaris. */
274#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000275#define INET_ADDRSTRLEN 16
276#endif
277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000280#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000281#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700283#ifdef HAVE_SYS_SOCKET_H
284#include <sys/socket.h>
285#endif
286
287#ifdef HAVE_NET_IF_H
288#include <net/if.h>
289#endif
290
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000291/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000293#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294
295/* Addressing includes */
296
Guido van Rossum6f489d91996-06-28 20:15:15 +0000297#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298
299/* Non-MS WINDOWS includes */
300# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000301# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Guido van Rossum9376b741999-09-15 22:01:40 +0000303/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000305
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000306# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000308#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000309
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000310/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000311# ifdef HAVE_FCNTL_H
312# include <fcntl.h>
313# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000314
Steve Dower65e4cb12014-11-22 12:54:57 -0800315#if defined(_MSC_VER) && _MSC_VER >= 1800
316/* Provides the IsWindows7SP1OrGreater() function */
317#include <VersionHelpers.h>
318#endif
319
Jeremy Hylton22308652001-02-02 03:23:09 +0000320#endif
321
Skip Montanaro7befb992004-02-10 16:50:21 +0000322#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000323
Neal Norwitz39d22e52002-11-02 19:55:21 +0000324#ifndef O_NONBLOCK
325# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000326#endif
327
Trent Micka708d6e2004-09-07 17:48:26 +0000328/* include Python's addrinfo.h unless it causes trouble */
329#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
330 /* Do not include addinfo.h on some newer IRIX versions.
331 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
332 * for example, but not by 6.5.10.
333 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000334#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000335 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
336 * EAI_* constants are defined in (the already included) ws2tcpip.h.
337 */
338#else
339# include "addrinfo.h"
340#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000341
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342#ifdef __APPLE__
343/* On OS X, getaddrinfo returns no error indication of lookup
344 failure, so we must use the emulation instead of the libinfo
345 implementation. Unfortunately, performing an autoconf test
346 for this bug would require DNS access for the machine performing
347 the configuration, which is not acceptable. Therefore, we
348 determine the bug just by checking for __APPLE__. If this bug
349 gets ever fixed, perhaps checking for sys/version.h would be
350 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000351#ifndef HAVE_GETNAMEINFO
352/* This bug seems to be fixed in Jaguar. Ths easiest way I could
353 Find to check for Jaguar is that it has getnameinfo(), which
354 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357
358#ifdef HAVE_INET_ATON
359#define USE_INET_ATON_WEAKLINK
360#endif
361
Jack Jansen84262fb2002-07-02 14:40:42 +0000362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000364/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000365#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000366/* avoid clashes with the C library definition of the symbol. */
367#define getaddrinfo fake_getaddrinfo
368#define gai_strerror fake_gai_strerror
369#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000370#include "getaddrinfo.c"
371#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000372#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000373#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000374#include "getnameinfo.c"
375#endif
376
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000377#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000378#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000379#endif
380
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000381#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000382#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000383#define EAFNOSUPPORT WSAEAFNOSUPPORT
384#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000385#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000386
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000387#ifndef SOCKETCLOSE
388#define SOCKETCLOSE close
389#endif
390
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000391#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000392#define USE_BLUETOOTH 1
393#if defined(__FreeBSD__)
394#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
395#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000397#define SOL_HCI SOL_HCI_RAW
398#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define sockaddr_l2 sockaddr_l2cap
400#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000401#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
403#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000405#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000406#define sockaddr_l2 sockaddr_bt
407#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000408#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000409#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000410#define SOL_HCI BTPROTO_HCI
411#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000415#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000416#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000417#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
418#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000419#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000420#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
421#endif
422#endif
423
Charles-François Natali8b759652011-12-23 16:44:51 +0100424/* Convert "sock_addr_t *" to "struct sockaddr *". */
425#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426
Martin v. Löwise9416172003-05-03 10:12:45 +0000427/*
428 * Constants for getnameinfo()
429 */
430#if !defined(NI_MAXHOST)
431#define NI_MAXHOST 1025
432#endif
433#if !defined(NI_MAXSERV)
434#define NI_MAXSERV 32
435#endif
436
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000437#ifndef INVALID_SOCKET /* MS defines this */
438#define INVALID_SOCKET (-1)
439#endif
440
Charles-François Natali0cc86852013-09-13 19:53:08 +0200441#ifndef INADDR_NONE
442#define INADDR_NONE (-1)
443#endif
444
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000445/* XXX There's a problem here: *static* functions are not supposed to have
446 a Py prefix (or use CapitalizedWords). Later... */
447
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448/* Global variable holding the exception type for errors detected
449 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000450static PyObject *socket_herror;
451static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000452static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453
Tim Peters643a7fc2002-02-17 04:13:21 +0000454/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455 The sock_type variable contains pointers to various functions,
456 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000457 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000458static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000459
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460#if defined(HAVE_POLL_H)
461#include <poll.h>
462#elif defined(HAVE_SYS_POLL_H)
463#include <sys/poll.h>
464#endif
465
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000466/* Largest value to try to store in a socklen_t (used when handling
467 ancillary data). POSIX requires socklen_t to hold at least
468 (2**31)-1 and recommends against storing larger values, but
469 socklen_t was originally int in the BSD interface, so to be on the
470 safe side we use the smaller of (2**31)-1 and INT_MAX. */
471#if INT_MAX > 0x7fffffff
472#define SOCKLEN_T_LIMIT 0x7fffffff
473#else
474#define SOCKLEN_T_LIMIT INT_MAX
475#endif
476
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200477#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478/* Instead of select(), we'll use poll() since poll() works on any fd. */
479#define IS_SELECTABLE(s) 1
480/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000481#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200482/* If there's no timeout left, we don't have to call select, so it's a safe,
483 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100484#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000485#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000486
487static PyObject*
488select_error(void)
489{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200490 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000492}
493
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000494#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000495#ifndef WSAEAGAIN
496#define WSAEAGAIN WSAEWOULDBLOCK
497#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000498#define CHECK_ERRNO(expected) \
499 (WSAGetLastError() == WSA ## expected)
500#else
501#define CHECK_ERRNO(expected) \
502 (errno == expected)
503#endif
504
Victor Stinnerdaf45552013-08-28 00:53:59 +0200505#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200506# define GET_SOCK_ERROR WSAGetLastError()
507# define SET_SOCK_ERROR(err) WSASetLastError(err)
508# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
509# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300510# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200511#else
512# define GET_SOCK_ERROR errno
513# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
514# define SOCK_TIMEOUT_ERR EWOULDBLOCK
515# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300516# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200517#endif
518
519
520#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200521/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
522static int support_wsa_no_inherit = -1;
523#endif
524
Guido van Rossum30a685f1991-06-27 15:51:29 +0000525/* Convenience function to raise an error according to errno
526 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527
Guido van Rossum73624e91994-10-10 17:59:00 +0000528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000529set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000530{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000531#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 int err_no = WSAGetLastError();
533 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
534 recognizes the error codes used by both GetLastError() and
535 WSAGetLastError */
536 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200537 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000538#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000539
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200540 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541}
542
Guido van Rossum30a685f1991-06-27 15:51:29 +0000543
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000545set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548
549#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (v != NULL) {
555 PyErr_SetObject(socket_herror, v);
556 Py_DECREF(v);
557 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560}
561
562
563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567
Martin v. Löwis272cb402002-03-01 08:31:07 +0000568#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* EAI_SYSTEM is not available on Windows XP. */
570 if (error == EAI_SYSTEM)
571 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000572#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000574#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000576#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (v != NULL) {
580 PyErr_SetObject(socket_gaierror, v);
581 Py_DECREF(v);
582 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585}
586
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000587/* Function to perform the setting of socket blocking mode
588 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589static int
590internal_setblocking(PySocketSockObject *s, int block)
591{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400592 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200593#ifdef MS_WINDOWS
594 u_long arg;
595#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100596#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100597 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100598 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000600#ifdef SOCK_NONBLOCK
601 if (block)
602 s->sock_type &= (~SOCK_NONBLOCK);
603 else
604 s->sock_type |= SOCK_NONBLOCK;
605#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100609#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200611 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400612 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100613#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200615 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400616 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100618 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 else
Victor Stinner9a954832013-12-04 00:41:24 +0100620 new_delay_flag = delay_flag | O_NONBLOCK;
621 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200622 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400623 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100624#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000625#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200626 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200627 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400628 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400630
631 result = 0;
632
633 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000634 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636
Yury Selivanovfa22b292016-10-18 16:03:52 -0400637 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200638#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400639 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200640#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400641 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200642#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400643 }
644
645 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646}
647
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000648static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200649internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
650 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100653#ifdef HAVE_POLL
654 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200655 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100656#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200657 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200658 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100659#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000660
Victor Stinnerb7df3142015-03-27 22:59:32 +0100661#ifdef WITH_THREAD
662 /* must be called with the GIL held */
663 assert(PyGILState_Check());
664#endif
665
Victor Stinner416f2e62015-03-31 13:56:29 +0200666 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200667 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200670 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 /* Prefer poll, if available, since you can poll() any fd
674 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100676 pollfd.fd = s->sock_fd;
677 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200678 if (connect) {
679 /* On Windows, the socket becomes writable on connection success,
680 but a connection failure is notified as an error. On POSIX, the
681 socket becomes writable on connection success or on connection
682 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200684 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685
Victor Stinner71694d52015-03-28 01:18:54 +0100686 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200687 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200688 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689
Victor Stinner71694d52015-03-28 01:18:54 +0100690 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200691 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100692 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000693#else
Victor Stinnerced11742015-04-09 10:27:25 +0200694 if (interval >= 0) {
695 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
696 tvp = &tv;
697 }
698 else
699 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700
Victor Stinner71694d52015-03-28 01:18:54 +0100701 FD_ZERO(&fds);
702 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200703 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200704 if (connect) {
705 /* On Windows, the socket becomes writable on connection success,
706 but a connection failure is notified as an error. On POSIX, the
707 socket becomes writable on connection success or on connection
708 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200710 }
Victor Stinner71694d52015-03-28 01:18:54 +0100711
712 /* See if the socket is ready */
713 Py_BEGIN_ALLOW_THREADS;
714 if (writing)
715 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200716 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100717 else
718 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200719 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100720 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (n < 0)
724 return -1;
725 if (n == 0)
726 return 1;
727 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728}
729
Victor Stinner31bf2d52015-04-01 21:57:09 +0200730/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000731
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 On error, raise an exception and return -1 if err is set, or fill err and
733 return -1 otherwise. If a signal was received and the signal handler raised
734 an exception, return -1, and set err to -1 if err is set.
735
736 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100737
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738 If the socket has a timeout, wait until the socket is ready before calling
739 the function: wait until the socket is writable if writing is nonzero, wait
740 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100741
Victor Stinner81c41db2015-04-02 11:50:57 +0200742 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200743 the function, except if the signal handler raised an exception (PEP 475).
744
745 When the function is retried, recompute the timeout using a monotonic clock.
746
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 sock_call_ex() must be called with the GIL held. The socket function is
748 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200749static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200750sock_call_ex(PySocketSockObject *s,
751 int writing,
752 int (*sock_func) (PySocketSockObject *s, void *data),
753 void *data,
754 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200755 int *err,
756 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757{
Victor Stinner8912d142015-04-06 23:16:34 +0200758 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759 _PyTime_t deadline = 0;
760 int deadline_initialized = 0;
761 int res;
762
Victor Stinner92f01132015-10-11 09:54:42 +0200763#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 /* sock_call() must be called with the GIL held. */
765 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200766#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200767
768 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200770 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 /* For connect(), poll even for blocking socket. The connection
772 runs asynchronously. */
773 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200775 _PyTime_t interval;
776
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 if (deadline_initialized) {
778 /* recompute the timeout */
779 interval = deadline - _PyTime_GetMonotonicClock();
780 }
781 else {
782 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200783 deadline = _PyTime_GetMonotonicClock() + timeout;
784 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786
Victor Stinner10550cd2015-04-03 13:22:27 +0200787 if (interval >= 0)
788 res = internal_select(s, writing, interval, connect);
789 else
790 res = 1;
791 }
792 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200793 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200794 }
795
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 if (err)
798 *err = GET_SOCK_ERROR;
799
Victor Stinner31bf2d52015-04-01 21:57:09 +0200800 if (CHECK_ERRNO(EINTR)) {
801 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200802 if (PyErr_CheckSignals()) {
803 if (err)
804 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807
808 /* retry select() */
809 continue;
810 }
811
812 /* select() failed */
813 s->errorhandler();
814 return -1;
815 }
816
817 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 if (err)
819 *err = SOCK_TIMEOUT_ERR;
820 else
821 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 return -1;
823 }
824
825 /* the socket is ready */
826 }
827
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 /* inner loop to retry sock_func() when sock_func() is interrupted
829 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830 while (1) {
831 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 Py_END_ALLOW_THREADS
834
835 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 /* sock_func() succeeded */
837 if (err)
838 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839 return 0;
840 }
841
Victor Stinner81c41db2015-04-02 11:50:57 +0200842 if (err)
843 *err = GET_SOCK_ERROR;
844
Victor Stinner31bf2d52015-04-01 21:57:09 +0200845 if (!CHECK_ERRNO(EINTR))
846 break;
847
Victor Stinner81c41db2015-04-02 11:50:57 +0200848 /* sock_func() was interrupted by a signal */
849 if (PyErr_CheckSignals()) {
850 if (err)
851 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200852 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856 }
857
858 if (s->sock_timeout > 0
859 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861
862 For example, select() could indicate a socket is ready for
863 reading, but the data then discarded by the OS because of a
864 wrong checksum.
865
866 Loop on select() to recheck for socket readyness. */
867 continue;
868 }
869
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 /* sock_func() failed */
871 if (!err)
872 s->errorhandler();
873 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000874 return -1;
875 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000877
Victor Stinner81c41db2015-04-02 11:50:57 +0200878static int
879sock_call(PySocketSockObject *s,
880 int writing,
881 int (*func) (PySocketSockObject *s, void *data),
882 void *data)
883{
Victor Stinner8912d142015-04-06 23:16:34 +0200884 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200885}
886
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000887
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000888/* Initialize a new socket object. */
889
Victor Stinner88ed6402015-04-09 10:23:12 +0200890/* Default timeout for new sockets */
891static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000892
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200893static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000894init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 s->sock_fd = fd;
898 s->sock_family = family;
899 s->sock_type = type;
900 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000903#ifdef SOCK_NONBLOCK
904 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100905 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000906 else
907#endif
908 {
909 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200910 if (defaulttimeout >= 0) {
911 if (internal_setblocking(s, 0) == -1) {
912 return -1;
913 }
914 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000915 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200916 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000917}
918
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920/* Create a new socket object.
921 This just creates the object and initializes it.
922 If the creation fails, return NULL and set an exception (implicit
923 in NEWOBJ()). */
924
Guido van Rossum73624e91994-10-10 17:59:00 +0000925static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000926new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PySocketSockObject *s;
929 s = (PySocketSockObject *)
930 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200931 if (s == NULL)
932 return NULL;
933 if (init_sockobject(s, fd, family, type, proto) == -1) {
934 Py_DECREF(s);
935 return NULL;
936 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938}
939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940
Guido van Rossum48a680c2001-03-02 06:34:14 +0000941/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000942 thread to be in gethostbyname or getaddrinfo */
943#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200944static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000945#endif
946
947
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948/* Convert a string specifying a host name or one of a few symbolic
949 names to a numeric IP address. This usually calls gethostbyname()
950 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000951 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 an error occurred; then an exception is raised. */
953
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200955setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 struct addrinfo hints, *res;
958 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
961 if (name[0] == '\0') {
962 int siz;
963 memset(&hints, 0, sizeof(hints));
964 hints.ai_family = af;
965 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
966 hints.ai_flags = AI_PASSIVE;
967 Py_BEGIN_ALLOW_THREADS
968 ACQUIRE_GETADDRINFO_LOCK
969 error = getaddrinfo(NULL, "0", &hints, &res);
970 Py_END_ALLOW_THREADS
971 /* We assume that those thread-unsafe getaddrinfo() versions
972 *are* safe regarding their return value, ie. that a
973 subsequent call to getaddrinfo() does not destroy the
974 outcome of the first call. */
975 RELEASE_GETADDRINFO_LOCK
976 if (error) {
977 set_gaierror(error);
978 return -1;
979 }
980 switch (res->ai_family) {
981 case AF_INET:
982 siz = 4;
983 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000984#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case AF_INET6:
986 siz = 16;
987 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 default:
990 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200991 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 "unsupported address family");
993 return -1;
994 }
995 if (res->ai_next) {
996 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200997 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 "wildcard resolved to multiple address");
999 return -1;
1000 }
1001 if (res->ai_addrlen < addr_ret_size)
1002 addr_ret_size = res->ai_addrlen;
1003 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1004 freeaddrinfo(res);
1005 return siz;
1006 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001007 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001008 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001009 if (strcmp(name, "255.255.255.255") == 0 ||
1010 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 struct sockaddr_in *sin;
1012 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001013 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 "address family mismatched");
1015 return -1;
1016 }
1017 sin = (struct sockaddr_in *)addr_ret;
1018 memset((void *) sin, '\0', sizeof(*sin));
1019 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001020#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 sin->sin_addr.s_addr = INADDR_BROADCAST;
1024 return sizeof(sin->sin_addr);
1025 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001026
1027 /* avoid a name resolution in case of numeric address */
1028#ifdef HAVE_INET_PTON
1029 /* check for an IPv4 address */
1030 if (af == AF_UNSPEC || af == AF_INET) {
1031 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1032 memset(sin, 0, sizeof(*sin));
1033 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1034 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001035#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001036 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001037#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001038 return 4;
1039 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001041#ifdef ENABLE_IPV6
1042 /* check for an IPv6 address - if the address contains a scope ID, we
1043 * fallback to getaddrinfo(), which can handle translation from interface
1044 * name to interface index */
1045 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1046 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1047 memset(sin, 0, sizeof(*sin));
1048 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1049 sin->sin6_family = AF_INET6;
1050#ifdef HAVE_SOCKADDR_SA_LEN
1051 sin->sin6_len = sizeof(*sin);
1052#endif
1053 return 16;
1054 }
1055 }
1056#endif /* ENABLE_IPV6 */
1057#else /* HAVE_INET_PTON */
1058 /* check for an IPv4 address */
1059 if (af == AF_INET || af == AF_UNSPEC) {
1060 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1061 memset(sin, 0, sizeof(*sin));
1062 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1063 sin->sin_family = AF_INET;
1064#ifdef HAVE_SOCKADDR_SA_LEN
1065 sin->sin_len = sizeof(*sin);
1066#endif
1067 return 4;
1068 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001069 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001070#endif /* HAVE_INET_PTON */
1071
1072 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 memset(&hints, 0, sizeof(hints));
1074 hints.ai_family = af;
1075 Py_BEGIN_ALLOW_THREADS
1076 ACQUIRE_GETADDRINFO_LOCK
1077 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001078#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 if (error == EAI_NONAME && af == AF_UNSPEC) {
1080 /* On Tru64 V5.1, numeric-to-addr conversion fails
1081 if no address family is given. Assume IPv4 for now.*/
1082 hints.ai_family = AF_INET;
1083 error = getaddrinfo(name, NULL, &hints, &res);
1084 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 Py_END_ALLOW_THREADS
1087 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1088 if (error) {
1089 set_gaierror(error);
1090 return -1;
1091 }
1092 if (res->ai_addrlen < addr_ret_size)
1093 addr_ret_size = res->ai_addrlen;
1094 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1095 freeaddrinfo(res);
1096 switch (addr_ret->sa_family) {
1097 case AF_INET:
1098 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001099#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 case AF_INET6:
1101 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 return -1;
1106 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107}
1108
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110/* Create a string object representing an IP address.
1111 This is always a string of the form 'dd.dd.dd.dd' (with variable
1112 size numbers). */
1113
Guido van Rossum73624e91994-10-10 17:59:00 +00001114static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001115makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 char buf[NI_MAXHOST];
1118 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1121 NI_NUMERICHOST);
1122 if (error) {
1123 set_gaierror(error);
1124 return NULL;
1125 }
1126 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127}
1128
1129
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130#ifdef USE_BLUETOOTH
1131/* Convert a string representation of a Bluetooth address into a numeric
1132 address. Returns the length (6), or raises an exception and returns -1 if
1133 an error occurred. */
1134
1135static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001136setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 unsigned int b0, b1, b2, b3, b4, b5;
1139 char ch;
1140 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1143 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1144 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1145 bdaddr->b[0] = b0;
1146 bdaddr->b[1] = b1;
1147 bdaddr->b[2] = b2;
1148 bdaddr->b[3] = b3;
1149 bdaddr->b[4] = b4;
1150 bdaddr->b[5] = b5;
1151 return 6;
1152 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001153 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 return -1;
1155 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156}
1157
1158/* Create a string representation of the Bluetooth address. This is always a
1159 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1160 value (zero padded if necessary). */
1161
1162static PyObject *
1163makebdaddr(bdaddr_t *bdaddr)
1164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1168 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1169 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1170 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001171}
1172#endif
1173
1174
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175/* Create an object representing the given socket address,
1176 suitable for passing it back to bind(), connect() etc.
1177 The family field of the sockaddr structure is inspected
1178 to determine what kind of address it really is. */
1179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001182makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (addrlen == 0) {
1185 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001186 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_INET:
1192 {
1193 struct sockaddr_in *a;
1194 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1195 PyObject *ret = NULL;
1196 if (addrobj) {
1197 a = (struct sockaddr_in *)addr;
1198 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1199 Py_DECREF(addrobj);
1200 }
1201 return ret;
1202 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001204#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 case AF_UNIX:
1206 {
1207 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001208#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001209 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1210 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1211 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 }
1213 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001214#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 {
1216 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001217 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 }
1219 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001220#endif /* AF_UNIX */
1221
Martin v. Löwis11017b12006-01-14 18:12:57 +00001222#if defined(AF_NETLINK)
1223 case AF_NETLINK:
1224 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1226 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001227 }
1228#endif /* AF_NETLINK */
1229
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001230#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 case AF_INET6:
1232 {
1233 struct sockaddr_in6 *a;
1234 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1235 PyObject *ret = NULL;
1236 if (addrobj) {
1237 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001238 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 addrobj,
1240 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001241 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 a->sin6_scope_id);
1243 Py_DECREF(addrobj);
1244 }
1245 return ret;
1246 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001247#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 case AF_BLUETOOTH:
1251 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 case BTPROTO_L2CAP:
1254 {
1255 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1256 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1257 PyObject *ret = NULL;
1258 if (addrobj) {
1259 ret = Py_BuildValue("Oi",
1260 addrobj,
1261 _BT_L2_MEMB(a, psm));
1262 Py_DECREF(addrobj);
1263 }
1264 return ret;
1265 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case BTPROTO_RFCOMM:
1268 {
1269 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1270 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1271 PyObject *ret = NULL;
1272 if (addrobj) {
1273 ret = Py_BuildValue("Oi",
1274 addrobj,
1275 _BT_RC_MEMB(a, channel));
1276 Py_DECREF(addrobj);
1277 }
1278 return ret;
1279 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 case BTPROTO_HCI:
1282 {
1283 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001284#if defined(__NetBSD__) || defined(__DragonFly__)
1285 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1286#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyObject *ret = NULL;
1288 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1289 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001292
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case BTPROTO_SCO:
1295 {
1296 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1297 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1298 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299#endif
1300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 default:
1302 PyErr_SetString(PyExc_ValueError,
1303 "Unknown Bluetooth protocol");
1304 return NULL;
1305 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306#endif
1307
Antoine Pitroub156a462010-10-27 20:13:57 +00001308#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 case AF_PACKET:
1310 {
1311 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1312 char *ifname = "";
1313 struct ifreq ifr;
1314 /* need to look up interface name give index */
1315 if (a->sll_ifindex) {
1316 ifr.ifr_ifindex = a->sll_ifindex;
1317 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1318 ifname = ifr.ifr_name;
1319 }
1320 return Py_BuildValue("shbhy#",
1321 ifname,
1322 ntohs(a->sll_protocol),
1323 a->sll_pkttype,
1324 a->sll_hatype,
1325 a->sll_addr,
1326 a->sll_halen);
1327 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001328#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001329
Christian Heimes043d6f62008-01-07 17:19:16 +00001330#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case AF_TIPC:
1332 {
1333 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1334 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1335 return Py_BuildValue("IIIII",
1336 a->addrtype,
1337 a->addr.nameseq.type,
1338 a->addr.nameseq.lower,
1339 a->addr.nameseq.upper,
1340 a->scope);
1341 } else if (a->addrtype == TIPC_ADDR_NAME) {
1342 return Py_BuildValue("IIIII",
1343 a->addrtype,
1344 a->addr.name.name.type,
1345 a->addr.name.name.instance,
1346 a->addr.name.name.instance,
1347 a->scope);
1348 } else if (a->addrtype == TIPC_ADDR_ID) {
1349 return Py_BuildValue("IIIII",
1350 a->addrtype,
1351 a->addr.id.node,
1352 a->addr.id.ref,
1353 0,
1354 a->scope);
1355 } else {
1356 PyErr_SetString(PyExc_ValueError,
1357 "Invalid address type");
1358 return NULL;
1359 }
1360 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001361#endif
1362
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001363#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001364 case AF_CAN:
1365 {
1366 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1367 char *ifname = "";
1368 struct ifreq ifr;
1369 /* need to look up interface name given index */
1370 if (a->can_ifindex) {
1371 ifr.ifr_ifindex = a->can_ifindex;
1372 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1373 ifname = ifr.ifr_name;
1374 }
1375
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001376 switch (proto) {
1377#ifdef CAN_ISOTP
1378 case CAN_ISOTP:
1379 {
1380 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1381 ifname,
1382 a->can_addr.tp.rx_id,
1383 a->can_addr.tp.tx_id);
1384 }
1385#endif
1386 default:
1387 {
1388 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1389 ifname);
1390 }
1391 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001392 }
1393#endif
1394
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001395#ifdef PF_SYSTEM
1396 case PF_SYSTEM:
1397 switch(proto) {
1398#ifdef SYSPROTO_CONTROL
1399 case SYSPROTO_CONTROL:
1400 {
1401 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1402 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1403 }
1404#endif
1405 default:
1406 PyErr_SetString(PyExc_ValueError,
1407 "Invalid address type");
1408 return 0;
1409 }
1410#endif
1411
Christian Heimesdffa3942016-09-05 23:54:41 +02001412#ifdef HAVE_SOCKADDR_ALG
1413 case AF_ALG:
1414 {
1415 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1416 return Py_BuildValue("s#s#HH",
1417 a->salg_type,
1418 strnlen((const char*)a->salg_type,
1419 sizeof(a->salg_type)),
1420 a->salg_name,
1421 strnlen((const char*)a->salg_name,
1422 sizeof(a->salg_name)),
1423 a->salg_feat,
1424 a->salg_mask);
1425 }
1426#endif
1427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 default:
1431 /* If we don't know the address family, don't raise an
1432 exception -- return it as an (int, bytes) tuple. */
1433 return Py_BuildValue("iy#",
1434 addr->sa_family,
1435 addr->sa_data,
1436 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439}
1440
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001441/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1442 (in particular, numeric IP addresses). */
1443struct maybe_idna {
1444 PyObject *obj;
1445 char *buf;
1446};
1447
1448static void
1449idna_cleanup(struct maybe_idna *data)
1450{
1451 Py_CLEAR(data->obj);
1452}
1453
1454static int
1455idna_converter(PyObject *obj, struct maybe_idna *data)
1456{
1457 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001458 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001459 if (obj == NULL) {
1460 idna_cleanup(data);
1461 return 1;
1462 }
1463 data->obj = NULL;
1464 len = -1;
1465 if (PyBytes_Check(obj)) {
1466 data->buf = PyBytes_AsString(obj);
1467 len = PyBytes_Size(obj);
1468 }
1469 else if (PyByteArray_Check(obj)) {
1470 data->buf = PyByteArray_AsString(obj);
1471 len = PyByteArray_Size(obj);
1472 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001473 else if (PyUnicode_Check(obj)) {
1474 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1475 data->buf = PyUnicode_DATA(obj);
1476 len = PyUnicode_GET_LENGTH(obj);
1477 }
1478 else {
1479 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1480 if (!obj2) {
1481 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1482 return 0;
1483 }
1484 assert(PyBytes_Check(obj2));
1485 data->obj = obj2;
1486 data->buf = PyBytes_AS_STRING(obj2);
1487 len = PyBytes_GET_SIZE(obj2);
1488 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001489 }
1490 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001491 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1492 obj->ob_type->tp_name);
1493 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001494 }
1495 if (strlen(data->buf) != len) {
1496 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001497 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001498 return 0;
1499 }
1500 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001501}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001502
1503/* Parse a socket address argument according to the socket object's
1504 address family. Return 1 if the address was in the proper format,
1505 0 of not. The address is returned through addr_ret, its length
1506 through len_ret. */
1507
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001509getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001513
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001514#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 case AF_UNIX:
1516 {
1517 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001518 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001519 int retval = 0;
1520
1521 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1522 allow embedded nulls on Linux. */
1523 if (PyUnicode_Check(args)) {
1524 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1525 return 0;
1526 }
1527 else
1528 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001529 if (!PyArg_Parse(args, "y*", &path)) {
1530 Py_DECREF(args);
1531 return retval;
1532 }
1533 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001536#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001537 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001539 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001540 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001542 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 }
1544 }
1545 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001546#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 {
1548 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001549 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001550 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001552 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001554 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 }
1556 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001557 memcpy(addr->sun_path, path.buf, path.len);
1558 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001559 retval = 1;
1560 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001561 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001562 Py_DECREF(args);
1563 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001565#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566
Martin v. Löwis11017b12006-01-14 18:12:57 +00001567#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 case AF_NETLINK:
1569 {
1570 struct sockaddr_nl* addr;
1571 int pid, groups;
1572 addr = (struct sockaddr_nl *)addr_ret;
1573 if (!PyTuple_Check(args)) {
1574 PyErr_Format(
1575 PyExc_TypeError,
1576 "getsockaddrarg: "
1577 "AF_NETLINK address must be tuple, not %.500s",
1578 Py_TYPE(args)->tp_name);
1579 return 0;
1580 }
1581 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1582 return 0;
1583 addr->nl_family = AF_NETLINK;
1584 addr->nl_pid = pid;
1585 addr->nl_groups = groups;
1586 *len_ret = sizeof(*addr);
1587 return 1;
1588 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001589#endif
1590
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001591#ifdef AF_RDS
1592 case AF_RDS:
1593 /* RDS sockets use sockaddr_in: fall-through */
1594#endif
1595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 case AF_INET:
1597 {
1598 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001599 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 int port, result;
1601 if (!PyTuple_Check(args)) {
1602 PyErr_Format(
1603 PyExc_TypeError,
1604 "getsockaddrarg: "
1605 "AF_INET address must be tuple, not %.500s",
1606 Py_TYPE(args)->tp_name);
1607 return 0;
1608 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001609 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1610 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 return 0;
1612 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001613 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001615 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 if (result < 0)
1617 return 0;
1618 if (port < 0 || port > 0xffff) {
1619 PyErr_SetString(
1620 PyExc_OverflowError,
1621 "getsockaddrarg: port must be 0-65535.");
1622 return 0;
1623 }
1624 addr->sin_family = AF_INET;
1625 addr->sin_port = htons((short)port);
1626 *len_ret = sizeof *addr;
1627 return 1;
1628 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001629
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001630#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 case AF_INET6:
1632 {
1633 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001635 int port, result;
1636 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 flowinfo = scope_id = 0;
1638 if (!PyTuple_Check(args)) {
1639 PyErr_Format(
1640 PyExc_TypeError,
1641 "getsockaddrarg: "
1642 "AF_INET6 address must be tuple, not %.500s",
1643 Py_TYPE(args)->tp_name);
1644 return 0;
1645 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001646 if (!PyArg_ParseTuple(args, "O&i|II",
1647 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 &scope_id)) {
1649 return 0;
1650 }
1651 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001652 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001654 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 if (result < 0)
1656 return 0;
1657 if (port < 0 || port > 0xffff) {
1658 PyErr_SetString(
1659 PyExc_OverflowError,
1660 "getsockaddrarg: port must be 0-65535.");
1661 return 0;
1662 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001663 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001664 PyErr_SetString(
1665 PyExc_OverflowError,
1666 "getsockaddrarg: flowinfo must be 0-1048575.");
1667 return 0;
1668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 addr->sin6_family = s->sock_family;
1670 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001671 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 addr->sin6_scope_id = scope_id;
1673 *len_ret = sizeof *addr;
1674 return 1;
1675 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001676#endif
1677
Hye-Shik Chang81268602004-02-02 06:05:24 +00001678#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 case AF_BLUETOOTH:
1680 {
1681 switch (s->sock_proto) {
1682 case BTPROTO_L2CAP:
1683 {
1684 struct sockaddr_l2 *addr;
1685 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 addr = (struct sockaddr_l2 *)addr_ret;
1688 memset(addr, 0, sizeof(struct sockaddr_l2));
1689 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1690 if (!PyArg_ParseTuple(args, "si", &straddr,
1691 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001692 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 "wrong format");
1694 return 0;
1695 }
1696 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1697 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 *len_ret = sizeof *addr;
1700 return 1;
1701 }
1702 case BTPROTO_RFCOMM:
1703 {
1704 struct sockaddr_rc *addr;
1705 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 addr = (struct sockaddr_rc *)addr_ret;
1708 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1709 if (!PyArg_ParseTuple(args, "si", &straddr,
1710 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001711 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 "wrong format");
1713 return 0;
1714 }
1715 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1716 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 *len_ret = sizeof *addr;
1719 return 1;
1720 }
1721 case BTPROTO_HCI:
1722 {
1723 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001724#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001725 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001726
Alexander Belopolskye239d232010-12-08 23:31:48 +00001727 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001728 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001729 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001730 "wrong format");
1731 return 0;
1732 }
1733 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1734 return 0;
1735#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1737 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001738 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 "wrong format");
1740 return 0;
1741 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 *len_ret = sizeof *addr;
1744 return 1;
1745 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001746#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 case BTPROTO_SCO:
1748 {
1749 struct sockaddr_sco *addr;
1750 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 addr = (struct sockaddr_sco *)addr_ret;
1753 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1754 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001755 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 "wrong format");
1757 return 0;
1758 }
1759 straddr = PyBytes_AS_STRING(args);
1760 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1761 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 *len_ret = sizeof *addr;
1764 return 1;
1765 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001768 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 return 0;
1770 }
1771 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001772#endif
1773
Antoine Pitroub156a462010-10-27 20:13:57 +00001774#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 case AF_PACKET:
1776 {
1777 struct sockaddr_ll* addr;
1778 struct ifreq ifr;
1779 char *interfaceName;
1780 int protoNumber;
1781 int hatype = 0;
1782 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001783 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 if (!PyTuple_Check(args)) {
1786 PyErr_Format(
1787 PyExc_TypeError,
1788 "getsockaddrarg: "
1789 "AF_PACKET address must be tuple, not %.500s",
1790 Py_TYPE(args)->tp_name);
1791 return 0;
1792 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001793 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001795 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 return 0;
1797 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1798 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1799 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1800 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001801 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 return 0;
1803 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001804 if (haddr.buf && haddr.len > 8) {
1805 PyErr_SetString(PyExc_ValueError,
1806 "Hardware address must be 8 bytes or less");
1807 PyBuffer_Release(&haddr);
1808 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 }
1810 if (protoNumber < 0 || protoNumber > 0xffff) {
1811 PyErr_SetString(
1812 PyExc_OverflowError,
1813 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001814 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 return 0;
1816 }
1817 addr = (struct sockaddr_ll*)addr_ret;
1818 addr->sll_family = AF_PACKET;
1819 addr->sll_protocol = htons((short)protoNumber);
1820 addr->sll_ifindex = ifr.ifr_ifindex;
1821 addr->sll_pkttype = pkttype;
1822 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001823 if (haddr.buf) {
1824 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1825 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001827 else
1828 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001830 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 1;
1832 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001833#endif
1834
Christian Heimes043d6f62008-01-07 17:19:16 +00001835#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 case AF_TIPC:
1837 {
1838 unsigned int atype, v1, v2, v3;
1839 unsigned int scope = TIPC_CLUSTER_SCOPE;
1840 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 if (!PyTuple_Check(args)) {
1843 PyErr_Format(
1844 PyExc_TypeError,
1845 "getsockaddrarg: "
1846 "AF_TIPC address must be tuple, not %.500s",
1847 Py_TYPE(args)->tp_name);
1848 return 0;
1849 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 if (!PyArg_ParseTuple(args,
1852 "IIII|I;Invalid TIPC address format",
1853 &atype, &v1, &v2, &v3, &scope))
1854 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 addr = (struct sockaddr_tipc *) addr_ret;
1857 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 addr->family = AF_TIPC;
1860 addr->scope = scope;
1861 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 if (atype == TIPC_ADDR_NAMESEQ) {
1864 addr->addr.nameseq.type = v1;
1865 addr->addr.nameseq.lower = v2;
1866 addr->addr.nameseq.upper = v3;
1867 } else if (atype == TIPC_ADDR_NAME) {
1868 addr->addr.name.name.type = v1;
1869 addr->addr.name.name.instance = v2;
1870 } else if (atype == TIPC_ADDR_ID) {
1871 addr->addr.id.node = v1;
1872 addr->addr.id.ref = v2;
1873 } else {
1874 /* Shouldn't happen */
1875 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1876 return 0;
1877 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 return 1;
1882 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001883#endif
1884
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001885#ifdef AF_CAN
1886
1887#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001888 case AF_CAN:
1889 switch (s->sock_proto) {
1890 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001891 /* fall-through */
1892 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001893 {
1894 struct sockaddr_can *addr;
1895 PyObject *interfaceName;
1896 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001897 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001898 addr = (struct sockaddr_can *)addr_ret;
1899
Charles-François Natali47413c12011-10-06 19:47:44 +02001900 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1901 &interfaceName))
1902 return 0;
1903
1904 len = PyBytes_GET_SIZE(interfaceName);
1905
1906 if (len == 0) {
1907 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001908 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001909 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1910 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001911 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1912 s->errorhandler();
1913 Py_DECREF(interfaceName);
1914 return 0;
1915 }
1916 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001917 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001918 "AF_CAN interface name too long");
1919 Py_DECREF(interfaceName);
1920 return 0;
1921 }
1922
1923 addr->can_family = AF_CAN;
1924 addr->can_ifindex = ifr.ifr_ifindex;
1925
1926 *len_ret = sizeof(*addr);
1927 Py_DECREF(interfaceName);
1928 return 1;
1929 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001930#endif
1931
1932#ifdef CAN_ISOTP
1933 case CAN_ISOTP:
1934 {
1935 struct sockaddr_can *addr;
1936 PyObject *interfaceName;
1937 struct ifreq ifr;
1938 Py_ssize_t len;
1939 unsigned long int rx_id, tx_id;
1940
1941 addr = (struct sockaddr_can *)addr_ret;
1942
1943 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1944 &interfaceName,
1945 &rx_id,
1946 &tx_id))
1947 return 0;
1948
1949 len = PyBytes_GET_SIZE(interfaceName);
1950
1951 if (len == 0) {
1952 ifr.ifr_ifindex = 0;
1953 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1954 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1955 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1956 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1957 s->errorhandler();
1958 Py_DECREF(interfaceName);
1959 return 0;
1960 }
1961 } else {
1962 PyErr_SetString(PyExc_OSError,
1963 "AF_CAN interface name too long");
1964 Py_DECREF(interfaceName);
1965 return 0;
1966 }
1967
1968 addr->can_family = AF_CAN;
1969 addr->can_ifindex = ifr.ifr_ifindex;
1970 addr->can_addr.tp.rx_id = rx_id;
1971 addr->can_addr.tp.tx_id = tx_id;
1972
1973 *len_ret = sizeof(*addr);
1974 Py_DECREF(interfaceName);
1975 return 1;
1976 }
1977#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001978 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001979 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001980 "getsockaddrarg: unsupported CAN protocol");
1981 return 0;
1982 }
1983#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001984
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001985#ifdef PF_SYSTEM
1986 case PF_SYSTEM:
1987 switch (s->sock_proto) {
1988#ifdef SYSPROTO_CONTROL
1989 case SYSPROTO_CONTROL:
1990 {
1991 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001992
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001993 addr = (struct sockaddr_ctl *)addr_ret;
1994 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001995 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001996
1997 if (PyUnicode_Check(args)) {
1998 struct ctl_info info;
1999 PyObject *ctl_name;
2000
2001 if (!PyArg_Parse(args, "O&",
2002 PyUnicode_FSConverter, &ctl_name)) {
2003 return 0;
2004 }
2005
Victor Stinnerf50e1872015-03-20 11:32:24 +01002006 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002007 PyErr_SetString(PyExc_ValueError,
2008 "provided string is too long");
2009 Py_DECREF(ctl_name);
2010 return 0;
2011 }
2012 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2013 sizeof(info.ctl_name));
2014 Py_DECREF(ctl_name);
2015
2016 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2017 PyErr_SetString(PyExc_OSError,
2018 "cannot find kernel control with provided name");
2019 return 0;
2020 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002021
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002022 addr->sc_id = info.ctl_id;
2023 addr->sc_unit = 0;
2024 } else if (!PyArg_ParseTuple(args, "II",
2025 &(addr->sc_id), &(addr->sc_unit))) {
2026 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2027 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002028
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002029 return 0;
2030 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002031
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002032 *len_ret = sizeof(*addr);
2033 return 1;
2034 }
2035#endif
2036 default:
2037 PyErr_SetString(PyExc_OSError,
2038 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2039 return 0;
2040 }
2041#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002042#ifdef HAVE_SOCKADDR_ALG
2043 case AF_ALG:
2044 {
2045 struct sockaddr_alg *sa;
2046 char *type;
2047 char *name;
2048 sa = (struct sockaddr_alg *)addr_ret;
2049
2050 memset(sa, 0, sizeof(*sa));
2051 sa->salg_family = AF_ALG;
2052
2053 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2054 &type, &name, &sa->salg_feat, &sa->salg_mask))
2055 return 0;
2056 /* sockaddr_alg has fixed-sized char arrays for type and name */
2057 if (strlen(type) > sizeof(sa->salg_type)) {
2058 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2059 return 0;
2060 }
2061 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2062 if (strlen(name) > sizeof(sa->salg_name)) {
2063 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2064 return 0;
2065 }
2066 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2067
2068 *len_ret = sizeof(*sa);
2069 return 1;
2070 }
2071#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002076 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002080}
2081
Guido van Rossum30a685f1991-06-27 15:51:29 +00002082
Guido van Rossum48a680c2001-03-02 06:34:14 +00002083/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002084 Return 1 if the family is known, 0 otherwise. The length is returned
2085 through len_ret. */
2086
2087static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002088getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002091
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002092#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 case AF_UNIX:
2094 {
2095 *len_ret = sizeof (struct sockaddr_un);
2096 return 1;
2097 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002098#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002099
Martin v. Löwis11017b12006-01-14 18:12:57 +00002100#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002101 case AF_NETLINK:
2102 {
2103 *len_ret = sizeof (struct sockaddr_nl);
2104 return 1;
2105 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002106#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002107
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002108#ifdef AF_RDS
2109 case AF_RDS:
2110 /* RDS sockets use sockaddr_in: fall-through */
2111#endif
2112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 case AF_INET:
2114 {
2115 *len_ret = sizeof (struct sockaddr_in);
2116 return 1;
2117 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002118
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002119#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 case AF_INET6:
2121 {
2122 *len_ret = sizeof (struct sockaddr_in6);
2123 return 1;
2124 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002125#endif
2126
Hye-Shik Chang81268602004-02-02 06:05:24 +00002127#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 case AF_BLUETOOTH:
2129 {
2130 switch(s->sock_proto)
2131 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 case BTPROTO_L2CAP:
2134 *len_ret = sizeof (struct sockaddr_l2);
2135 return 1;
2136 case BTPROTO_RFCOMM:
2137 *len_ret = sizeof (struct sockaddr_rc);
2138 return 1;
2139 case BTPROTO_HCI:
2140 *len_ret = sizeof (struct sockaddr_hci);
2141 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002142#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 case BTPROTO_SCO:
2144 *len_ret = sizeof (struct sockaddr_sco);
2145 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002148 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 "unknown BT protocol");
2150 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 }
2153 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002154#endif
2155
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002156#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 case AF_PACKET:
2158 {
2159 *len_ret = sizeof (struct sockaddr_ll);
2160 return 1;
2161 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002162#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002163
Christian Heimes043d6f62008-01-07 17:19:16 +00002164#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 case AF_TIPC:
2166 {
2167 *len_ret = sizeof (struct sockaddr_tipc);
2168 return 1;
2169 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002170#endif
2171
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002172#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002173 case AF_CAN:
2174 {
2175 *len_ret = sizeof (struct sockaddr_can);
2176 return 1;
2177 }
2178#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002179
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002180#ifdef PF_SYSTEM
2181 case PF_SYSTEM:
2182 switch(s->sock_proto) {
2183#ifdef SYSPROTO_CONTROL
2184 case SYSPROTO_CONTROL:
2185 *len_ret = sizeof (struct sockaddr_ctl);
2186 return 1;
2187#endif
2188 default:
2189 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2190 "unknown PF_SYSTEM protocol");
2191 return 0;
2192 }
2193#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002194#ifdef HAVE_SOCKADDR_ALG
2195 case AF_ALG:
2196 {
2197 *len_ret = sizeof (struct sockaddr_alg);
2198 return 1;
2199 }
2200#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002205 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002209}
2210
2211
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002212/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2213 Currently, these methods are only compiled if the RFC 2292/3542
2214 CMSG_LEN() macro is available. Older systems seem to have used
2215 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2216 it may be possible to define CMSG_LEN() that way if it's not
2217 provided. Some architectures might need extra padding after the
2218 cmsghdr, however, and CMSG_LEN() would have to take account of
2219 this. */
2220#ifdef CMSG_LEN
2221/* If length is in range, set *result to CMSG_LEN(length) and return
2222 true; otherwise, return false. */
2223static int
2224get_CMSG_LEN(size_t length, size_t *result)
2225{
2226 size_t tmp;
2227
2228 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2229 return 0;
2230 tmp = CMSG_LEN(length);
2231 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2232 return 0;
2233 *result = tmp;
2234 return 1;
2235}
2236
2237#ifdef CMSG_SPACE
2238/* If length is in range, set *result to CMSG_SPACE(length) and return
2239 true; otherwise, return false. */
2240static int
2241get_CMSG_SPACE(size_t length, size_t *result)
2242{
2243 size_t tmp;
2244
2245 /* Use CMSG_SPACE(1) here in order to take account of the padding
2246 necessary before *and* after the data. */
2247 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2248 return 0;
2249 tmp = CMSG_SPACE(length);
2250 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2251 return 0;
2252 *result = tmp;
2253 return 1;
2254}
2255#endif
2256
2257/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2258 pointer in msg->msg_control with at least "space" bytes after it,
2259 and its cmsg_len member inside the buffer. */
2260static int
2261cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2262{
2263 size_t cmsg_offset;
2264 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2265 sizeof(cmsgh->cmsg_len));
2266
Charles-François Natali466517d2011-08-28 18:23:43 +02002267 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002268 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002269 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002270 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2271 annoying under OS X as it's unsigned there and so it triggers a
2272 tautological comparison warning under Clang when compared against 0.
2273 Since the check is valid on other platforms, silence the warning under
2274 Clang. */
2275 #ifdef __clang__
2276 #pragma clang diagnostic push
2277 #pragma clang diagnostic ignored "-Wtautological-compare"
2278 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002279 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002280 #pragma GCC diagnostic push
2281 #pragma GCC diagnostic ignored "-Wtype-limits"
2282 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002283 if (msg->msg_controllen < 0)
2284 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002285 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002286 #pragma GCC diagnostic pop
2287 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002288 #ifdef __clang__
2289 #pragma clang diagnostic pop
2290 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002291 if (space < cmsg_len_end)
2292 space = cmsg_len_end;
2293 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2294 return (cmsg_offset <= (size_t)-1 - space &&
2295 cmsg_offset + space <= msg->msg_controllen);
2296}
2297
2298/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2299 *space to number of bytes following it in the buffer and return
2300 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2301 msg->msg_controllen are valid. */
2302static int
2303get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2304{
2305 size_t data_offset;
2306 char *data_ptr;
2307
2308 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2309 return 0;
2310 data_offset = data_ptr - (char *)msg->msg_control;
2311 if (data_offset > msg->msg_controllen)
2312 return 0;
2313 *space = msg->msg_controllen - data_offset;
2314 return 1;
2315}
2316
2317/* If cmsgh is invalid or not contained in the buffer pointed to by
2318 msg->msg_control, return -1. If cmsgh is valid and its associated
2319 data is entirely contained in the buffer, set *data_len to the
2320 length of the associated data and return 0. If only part of the
2321 associated data is contained in the buffer but cmsgh is otherwise
2322 valid, set *data_len to the length contained in the buffer and
2323 return 1. */
2324static int
2325get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2326{
2327 size_t space, cmsg_data_len;
2328
2329 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2330 cmsgh->cmsg_len < CMSG_LEN(0))
2331 return -1;
2332 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2333 if (!get_cmsg_data_space(msg, cmsgh, &space))
2334 return -1;
2335 if (space >= cmsg_data_len) {
2336 *data_len = cmsg_data_len;
2337 return 0;
2338 }
2339 *data_len = space;
2340 return 1;
2341}
2342#endif /* CMSG_LEN */
2343
2344
Victor Stinner31bf2d52015-04-01 21:57:09 +02002345struct sock_accept {
2346 socklen_t *addrlen;
2347 sock_addr_t *addrbuf;
2348 SOCKET_T result;
2349};
2350
2351#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2352/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2353static int accept4_works = -1;
2354#endif
2355
2356static int
2357sock_accept_impl(PySocketSockObject *s, void *data)
2358{
2359 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002360 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2361 socklen_t *paddrlen = ctx->addrlen;
2362#ifdef HAVE_SOCKADDR_ALG
2363 /* AF_ALG does not support accept() with addr and raises
2364 * ECONNABORTED instead. */
2365 if (s->sock_family == AF_ALG) {
2366 addr = NULL;
2367 paddrlen = NULL;
2368 *ctx->addrlen = 0;
2369 }
2370#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002371
2372#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2373 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002374 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002375 SOCK_CLOEXEC);
2376 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2377 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2378 accept4_works = (errno != ENOSYS);
2379 }
2380 }
2381 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002382 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002383#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002384 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002385#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002386
2387#ifdef MS_WINDOWS
2388 return (ctx->result != INVALID_SOCKET);
2389#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002390 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002391#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002392}
2393
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002394/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002395
Guido van Rossum73624e91994-10-10 17:59:00 +00002396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002400 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 socklen_t addrlen;
2402 PyObject *sock = NULL;
2403 PyObject *addr = NULL;
2404 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002405 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 if (!getsockaddrlen(s, &addrlen))
2408 return NULL;
2409 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 if (!IS_SELECTABLE(s))
2412 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002413
Victor Stinner31bf2d52015-04-01 21:57:09 +02002414 ctx.addrlen = &addrlen;
2415 ctx.addrbuf = &addrbuf;
2416 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002418 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002419
Victor Stinnerdaf45552013-08-28 00:53:59 +02002420#ifdef MS_WINDOWS
2421 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2422 PyErr_SetFromWindowsErr(0);
2423 SOCKETCLOSE(newfd);
2424 goto finally;
2425 }
2426#else
2427
2428#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2429 if (!accept4_works)
2430#endif
2431 {
2432 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2433 SOCKETCLOSE(newfd);
2434 goto finally;
2435 }
2436 }
2437#endif
2438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 sock = PyLong_FromSocket_t(newfd);
2440 if (sock == NULL) {
2441 SOCKETCLOSE(newfd);
2442 goto finally;
2443 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2446 addrlen, s->sock_proto);
2447 if (addr == NULL)
2448 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002451
Guido van Rossum67f7a382002-06-06 21:08:16 +00002452finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 Py_XDECREF(sock);
2454 Py_XDECREF(addr);
2455 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002456}
2457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002459"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002460\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002461Wait for an incoming connection. Return a new socket file descriptor\n\
2462representing the connection, and the address of the client.\n\
2463For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002464
Guido van Rossum11ba0942002-06-13 15:07:44 +00002465/* s.setblocking(flag) method. Argument:
2466 False -- non-blocking mode; same as settimeout(0)
2467 True -- blocking mode; same as settimeout(None)
2468*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002469
Guido van Rossum73624e91994-10-10 17:59:00 +00002470static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002471sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002472{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002473 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 block = PyLong_AsLong(arg);
2476 if (block == -1 && PyErr_Occurred())
2477 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002478
Victor Stinner9001d802015-04-06 23:06:01 +02002479 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002480 if (internal_setblocking(s, block) == -1) {
2481 return NULL;
2482 }
2483 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002484}
Guido van Rossume4485b01994-09-07 14:32:49 +00002485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487"setblocking(flag)\n\
2488\n\
2489Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002490setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002491setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002492
Victor Stinner71694d52015-03-28 01:18:54 +01002493static int
2494socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2495{
2496#ifdef MS_WINDOWS
2497 struct timeval tv;
2498#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002499#ifndef HAVE_POLL
2500 _PyTime_t ms;
2501#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002502 int overflow = 0;
2503
2504 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002505 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002506 return 0;
2507 }
2508
Victor Stinner869e1772015-03-30 03:49:14 +02002509 if (_PyTime_FromSecondsObject(timeout,
2510 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002511 return -1;
2512
2513 if (*timeout < 0) {
2514 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2515 return -1;
2516 }
2517
2518#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002519 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002520#endif
2521#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002522 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2523 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002524#endif
2525 if (overflow) {
2526 PyErr_SetString(PyExc_OverflowError,
2527 "timeout doesn't fit into C timeval");
2528 return -1;
2529 }
2530
2531 return 0;
2532}
2533
Guido van Rossum11ba0942002-06-13 15:07:44 +00002534/* s.settimeout(timeout) method. Argument:
2535 None -- no timeout, blocking mode; same as setblocking(True)
2536 0.0 -- non-blocking mode; same as setblocking(False)
2537 > 0 -- timeout mode; operations time out after timeout seconds
2538 < 0 -- illegal; raises an exception
2539*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002541sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002542{
Victor Stinner71694d52015-03-28 01:18:54 +01002543 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002544
Victor Stinner71694d52015-03-28 01:18:54 +01002545 if (socket_parse_timeout(&timeout, arg) < 0)
2546 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002549 if (internal_setblocking(s, timeout < 0) == -1) {
2550 return NULL;
2551 }
2552 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002553}
2554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002555PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002556"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002557\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002558Set a timeout on socket operations. 'timeout' can be a float,\n\
2559giving in seconds, or None. Setting a timeout of None disables\n\
2560the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002561Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002562
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002563/* s.gettimeout() method.
2564 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002567{
Victor Stinner71694d52015-03-28 01:18:54 +01002568 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002569 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 }
Victor Stinner71694d52015-03-28 01:18:54 +01002571 else {
2572 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2573 return PyFloat_FromDouble(seconds);
2574 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575}
2576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002577PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002578"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002580Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002581operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002583
Guido van Rossumaee08791992-09-08 09:05:33 +00002584/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002585 With an integer third argument, sets an integer optval with optlen=4.
2586 With None as third argument and an integer fourth argument, set
2587 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002588 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002589 use optional built-in module 'struct' to encode the string.
2590*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002591
Guido van Rossum73624e91994-10-10 17:59:00 +00002592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002593sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 int level;
2596 int optname;
2597 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002598 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002600 unsigned int optlen;
2601 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002602
Christian Heimesdffa3942016-09-05 23:54:41 +02002603 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 if (PyArg_ParseTuple(args, "iii:setsockopt",
2605 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002606 res = setsockopt(s->sock_fd, level, optname,
2607 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002608 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002610
2611 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002612 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002613 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2614 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2615 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002616 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002617 NULL, (socklen_t)optlen);
2618 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002620
2621 PyErr_Clear();
2622 /* setsockopt(level, opt, buffer) */
2623 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2624 &level, &optname, &optval))
2625 return NULL;
2626
2627#ifdef MS_WINDOWS
2628 if (optval.len > INT_MAX) {
2629 PyBuffer_Release(&optval);
2630 PyErr_Format(PyExc_OverflowError,
2631 "socket option is larger than %i bytes",
2632 INT_MAX);
2633 return NULL;
2634 }
2635 res = setsockopt(s->sock_fd, level, optname,
2636 optval.buf, (int)optval.len);
2637#else
2638 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2639#endif
2640 PyBuffer_Release(&optval);
2641
2642done:
Victor Stinnercc739322016-03-23 21:35:29 +01002643 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002645 }
2646
2647 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002648}
2649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002650PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002651"setsockopt(level, option, value: int)\n\
2652setsockopt(level, option, value: buffer)\n\
2653setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002654\n\
2655Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002656The value argument can either be an integer, a string buffer, or \n\
2657None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002658
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002659
Guido van Rossumaee08791992-09-08 09:05:33 +00002660/* s.getsockopt() method.
2661 With two arguments, retrieves an integer option.
2662 With a third integer argument, retrieves a string buffer of that size;
2663 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002664
Guido van Rossum73624e91994-10-10 17:59:00 +00002665static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002666sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 int level;
2669 int optname;
2670 int res;
2671 PyObject *buf;
2672 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2675 &level, &optname, &buflen))
2676 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 if (buflen == 0) {
2679 int flag = 0;
2680 socklen_t flagsize = sizeof flag;
2681 res = getsockopt(s->sock_fd, level, optname,
2682 (void *)&flag, &flagsize);
2683 if (res < 0)
2684 return s->errorhandler();
2685 return PyLong_FromLong(flag);
2686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002688 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 "getsockopt buflen out of range");
2690 return NULL;
2691 }
2692 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2693 if (buf == NULL)
2694 return NULL;
2695 res = getsockopt(s->sock_fd, level, optname,
2696 (void *)PyBytes_AS_STRING(buf), &buflen);
2697 if (res < 0) {
2698 Py_DECREF(buf);
2699 return s->errorhandler();
2700 }
2701 _PyBytes_Resize(&buf, buflen);
2702 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002703}
2704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002705PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706"getsockopt(level, option[, buffersize]) -> value\n\
2707\n\
2708Get a socket option. See the Unix manual for level and option.\n\
2709If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002712
Fred Drake728819a2000-07-01 03:40:12 +00002713/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002714
Guido van Rossum73624e91994-10-10 17:59:00 +00002715static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002716sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 sock_addr_t addrbuf;
2719 int addrlen;
2720 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2723 return NULL;
2724 Py_BEGIN_ALLOW_THREADS
2725 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2726 Py_END_ALLOW_THREADS
2727 if (res < 0)
2728 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002729 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002730}
2731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002732PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002733"bind(address)\n\
2734\n\
2735Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002736pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002738
Guido van Rossum30a685f1991-06-27 15:51:29 +00002739
2740/* s.close() method.
2741 Set the file descriptor to -1 so operations tried subsequently
2742 will surely fail. */
2743
Guido van Rossum73624e91994-10-10 17:59:00 +00002744static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002745sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002748 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002749
Victor Stinner19a8e842016-03-21 16:36:48 +01002750 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002751 if (fd != INVALID_SOCKET) {
2752 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002753
2754 /* We do not want to retry upon EINTR: see
2755 http://lwn.net/Articles/576478/ and
2756 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2757 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002759 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002761 /* bpo-30319: The peer can already have closed the connection.
2762 Python ignores ECONNRESET on close(). */
2763 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002764 return s->errorhandler();
2765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002767 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002768}
2769
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002770PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002771"close()\n\
2772\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002773Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002774
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002775static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002776sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002777{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002778 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002779 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002780 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002781}
2782
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002783PyDoc_STRVAR(detach_doc,
2784"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002785\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002786Close the socket object without closing the underlying file descriptor.\n\
2787The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002788can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002789
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002790static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002791sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002792{
Victor Stinner81c41db2015-04-02 11:50:57 +02002793 int err;
2794 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002795
Victor Stinner81c41db2015-04-02 11:50:57 +02002796 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2797 /* getsockopt() failed */
2798 return 0;
2799 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002800
Victor Stinner81c41db2015-04-02 11:50:57 +02002801 if (err == EISCONN)
2802 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002803 if (err != 0) {
2804 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2805 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002806 return 0;
2807 }
2808 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002809}
2810
2811static int
2812internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2813 int raise)
2814{
2815 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002816
2817 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002819 Py_END_ALLOW_THREADS
2820
Victor Stinner70a46f62015-03-31 22:03:59 +02002821 if (!res) {
2822 /* connect() succeeded, the socket is connected */
2823 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002825
Victor Stinner81c41db2015-04-02 11:50:57 +02002826 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002827
Victor Stinner81c41db2015-04-02 11:50:57 +02002828 /* save error, PyErr_CheckSignals() can replace it */
2829 err = GET_SOCK_ERROR;
2830 if (CHECK_ERRNO(EINTR)) {
2831 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002832 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002833
2834 /* Issue #23618: when connect() fails with EINTR, the connection is
2835 running asynchronously.
2836
2837 If the socket is blocking or has a timeout, wait until the
2838 connection completes, fails or timed out using select(), and then
2839 get the connection status using getsockopt(SO_ERROR).
2840
2841 If the socket is non-blocking, raise InterruptedError. The caller is
2842 responsible to wait until the connection completes, fails or timed
2843 out (it's the case in asyncio for example). */
2844 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2845 }
2846 else {
2847 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2848 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002849 }
2850
Victor Stinner81c41db2015-04-02 11:50:57 +02002851 if (!wait_connect) {
2852 if (raise) {
2853 /* restore error, maybe replaced by PyErr_CheckSignals() */
2854 SET_SOCK_ERROR(err);
2855 s->errorhandler();
2856 return -1;
2857 }
2858 else
2859 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002860 }
2861
Victor Stinner81c41db2015-04-02 11:50:57 +02002862 if (raise) {
2863 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002864 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2865 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002866 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002867 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002868 else {
2869 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002870 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2871 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002872 return err;
2873 }
2874 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002875}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002876
Fred Drake728819a2000-07-01 03:40:12 +00002877/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002878
Guido van Rossum73624e91994-10-10 17:59:00 +00002879static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 sock_addr_t addrbuf;
2883 int addrlen;
2884 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2887 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002888
Victor Stinner81c41db2015-04-02 11:50:57 +02002889 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002890 if (res < 0)
2891 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002892
Victor Stinneree699e92015-03-31 21:28:42 +02002893 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002894}
2895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002896PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002897"connect(address)\n\
2898\n\
2899Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002900is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002901
Guido van Rossum30a685f1991-06-27 15:51:29 +00002902
Fred Drake728819a2000-07-01 03:40:12 +00002903/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002904
2905static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002906sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 sock_addr_t addrbuf;
2909 int addrlen;
2910 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2913 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Victor Stinner81c41db2015-04-02 11:50:57 +02002915 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002916 if (res < 0)
2917 return NULL;
2918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002920}
2921
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002922PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002923"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002924\n\
2925This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002926instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002927
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002928
Guido van Rossumed233a51992-06-23 09:07:03 +00002929/* s.fileno() method */
2930
Guido van Rossum73624e91994-10-10 17:59:00 +00002931static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002932sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002935}
2936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002937PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002938"fileno() -> integer\n\
2939\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002940Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941
Guido van Rossumed233a51992-06-23 09:07:03 +00002942
Guido van Rossumc89705d1992-11-26 08:54:07 +00002943/* s.getsockname() method */
2944
Guido van Rossum73624e91994-10-10 17:59:00 +00002945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 sock_addr_t addrbuf;
2949 int res;
2950 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 if (!getsockaddrlen(s, &addrlen))
2953 return NULL;
2954 memset(&addrbuf, 0, addrlen);
2955 Py_BEGIN_ALLOW_THREADS
2956 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2957 Py_END_ALLOW_THREADS
2958 if (res < 0)
2959 return s->errorhandler();
2960 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2961 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002962}
2963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965"getsockname() -> address info\n\
2966\n\
2967Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969
Guido van Rossumc89705d1992-11-26 08:54:07 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002972/* s.getpeername() method */
2973
Guido van Rossum73624e91994-10-10 17:59:00 +00002974static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002975sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 sock_addr_t addrbuf;
2978 int res;
2979 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 if (!getsockaddrlen(s, &addrlen))
2982 return NULL;
2983 memset(&addrbuf, 0, addrlen);
2984 Py_BEGIN_ALLOW_THREADS
2985 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2986 Py_END_ALLOW_THREADS
2987 if (res < 0)
2988 return s->errorhandler();
2989 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2990 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002991}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002992
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002993PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002994"getpeername() -> address info\n\
2995\n\
2996Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998
Guido van Rossumb6775db1994-08-01 11:34:53 +00002999#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003000
3001
Guido van Rossum30a685f1991-06-27 15:51:29 +00003002/* s.listen(n) method */
3003
Guido van Rossum73624e91994-10-10 17:59:00 +00003004static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003005sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003006{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003007 /* We try to choose a default backlog high enough to avoid connection drops
3008 * for common workloads, yet not too high to limit resource usage. */
3009 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003011
Charles-François Natali644b8f52014-05-22 19:45:39 +01003012 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003016 /* To avoid problems on systems that don't allow a negative backlog
3017 * (which doesn't make sense anyway) we force a minimum value of 0. */
3018 if (backlog < 0)
3019 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 res = listen(s->sock_fd, backlog);
3021 Py_END_ALLOW_THREADS
3022 if (res < 0)
3023 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003024 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003025}
3026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003027PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003028"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003029\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003030Enable a server to accept connections. If backlog is specified, it must be\n\
3031at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003032unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003033connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003034
Victor Stinner31bf2d52015-04-01 21:57:09 +02003035struct sock_recv {
3036 char *cbuf;
3037 Py_ssize_t len;
3038 int flags;
3039 Py_ssize_t result;
3040};
3041
3042static int
3043sock_recv_impl(PySocketSockObject *s, void *data)
3044{
3045 struct sock_recv *ctx = data;
3046
3047#ifdef MS_WINDOWS
3048 if (ctx->len > INT_MAX)
3049 ctx->len = INT_MAX;
3050 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3051#else
3052 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3053#endif
3054 return (ctx->result >= 0);
3055}
3056
Guido van Rossum82a5c661998-07-07 20:45:43 +00003057
Thomas Wouters477c8d52006-05-27 19:21:47 +00003058/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003059 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003060 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003061 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003062 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003063 * also possible that we return a number of bytes smaller than the request
3064 * bytes.
3065 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003066
Antoine Pitrou19467d22010-08-17 19:33:30 +00003067static Py_ssize_t
3068sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003069{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003070 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 if (!IS_SELECTABLE(s)) {
3073 select_error();
3074 return -1;
3075 }
3076 if (len == 0) {
3077 /* If 0 bytes were requested, do nothing. */
3078 return 0;
3079 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003080
Victor Stinner31bf2d52015-04-01 21:57:09 +02003081 ctx.cbuf = cbuf;
3082 ctx.len = len;
3083 ctx.flags = flags;
3084 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003086
3087 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003088}
3089
Guido van Rossum48a680c2001-03-02 06:34:14 +00003090
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003091/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003092
Guido van Rossum73624e91994-10-10 17:59:00 +00003093static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003094sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003095{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003096 Py_ssize_t recvlen, outlen;
3097 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003099
Antoine Pitrou19467d22010-08-17 19:33:30 +00003100 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 if (recvlen < 0) {
3104 PyErr_SetString(PyExc_ValueError,
3105 "negative buffersize in recv");
3106 return NULL;
3107 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 /* Allocate a new string. */
3110 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3111 if (buf == NULL)
3112 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 /* Call the guts */
3115 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3116 if (outlen < 0) {
3117 /* An error occurred, release the string and return an
3118 error. */
3119 Py_DECREF(buf);
3120 return NULL;
3121 }
3122 if (outlen != recvlen) {
3123 /* We did not read as many bytes as we anticipated, resize the
3124 string if possible and be successful. */
3125 _PyBytes_Resize(&buf, outlen);
3126 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003129}
3130
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003131PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003132"recv(buffersize[, flags]) -> data\n\
3133\n\
3134Receive up to buffersize bytes from the socket. For the optional flags\n\
3135argument, see the Unix manual. When no data is available, block until\n\
3136at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003137the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003138
Guido van Rossum30a685f1991-06-27 15:51:29 +00003139
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003140/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003141
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003143sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003146
Antoine Pitrou19467d22010-08-17 19:33:30 +00003147 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 Py_buffer pbuf;
3149 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003150 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003153 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 &pbuf, &recvlen, &flags))
3155 return NULL;
3156 buf = pbuf.buf;
3157 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 if (recvlen < 0) {
3160 PyBuffer_Release(&pbuf);
3161 PyErr_SetString(PyExc_ValueError,
3162 "negative buffersize in recv_into");
3163 return NULL;
3164 }
3165 if (recvlen == 0) {
3166 /* If nbytes was not specified, use the buffer's length */
3167 recvlen = buflen;
3168 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 /* Check if the buffer is large enough */
3171 if (buflen < recvlen) {
3172 PyBuffer_Release(&pbuf);
3173 PyErr_SetString(PyExc_ValueError,
3174 "buffer too small for requested bytes");
3175 return NULL;
3176 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 /* Call the guts */
3179 readlen = sock_recv_guts(s, buf, recvlen, flags);
3180 if (readlen < 0) {
3181 /* Return an error. */
3182 PyBuffer_Release(&pbuf);
3183 return NULL;
3184 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 PyBuffer_Release(&pbuf);
3187 /* Return the number of bytes read. Note that we do not do anything
3188 special here in the case that readlen < recvlen. */
3189 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003190}
3191
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003192PyDoc_STRVAR(recv_into_doc,
3193"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003194\n\
3195A version of recv() that stores its data into a buffer rather than creating \n\
3196a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3197is not specified (or 0), receive up to the size available in the given buffer.\n\
3198\n\
3199See recv() for documentation about the flags.");
3200
Victor Stinner31bf2d52015-04-01 21:57:09 +02003201struct sock_recvfrom {
3202 char* cbuf;
3203 Py_ssize_t len;
3204 int flags;
3205 socklen_t *addrlen;
3206 sock_addr_t *addrbuf;
3207 Py_ssize_t result;
3208};
3209
3210static int
3211sock_recvfrom_impl(PySocketSockObject *s, void *data)
3212{
3213 struct sock_recvfrom *ctx = data;
3214
3215 memset(ctx->addrbuf, 0, *ctx->addrlen);
3216
3217#ifdef MS_WINDOWS
3218 if (ctx->len > INT_MAX)
3219 ctx->len = INT_MAX;
3220 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3221 SAS2SA(ctx->addrbuf), ctx->addrlen);
3222#else
3223 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3224 SAS2SA(ctx->addrbuf), ctx->addrlen);
3225#endif
3226 return (ctx->result >= 0);
3227}
3228
Thomas Wouters477c8d52006-05-27 19:21:47 +00003229
3230/*
Christian Heimes99170a52007-12-19 02:07:34 +00003231 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3232 * into a char buffer. If you have any inc/def ref to do to the objects that
3233 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003234 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003235 * that it is also possible that we return a number of bytes smaller than the
3236 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003237 *
3238 * 'addr' is a return value for the address object. Note that you must decref
3239 * it yourself.
3240 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003241static Py_ssize_t
3242sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003247 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 if (!getsockaddrlen(s, &addrlen))
3252 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 if (!IS_SELECTABLE(s)) {
3255 select_error();
3256 return -1;
3257 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003258
Victor Stinner31bf2d52015-04-01 21:57:09 +02003259 ctx.cbuf = cbuf;
3260 ctx.len = len;
3261 ctx.flags = flags;
3262 ctx.addrbuf = &addrbuf;
3263 ctx.addrlen = &addrlen;
3264 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003266
Victor Stinner31bf2d52015-04-01 21:57:09 +02003267 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3268 s->sock_proto);
3269 if (*addr == NULL)
3270 return -1;
3271
3272 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003273}
3274
3275/* s.recvfrom(nbytes [,flags]) method */
3276
3277static PyObject *
3278sock_recvfrom(PySocketSockObject *s, PyObject *args)
3279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 PyObject *buf = NULL;
3281 PyObject *addr = NULL;
3282 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003283 int flags = 0;
3284 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003285
Antoine Pitrou19467d22010-08-17 19:33:30 +00003286 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 if (recvlen < 0) {
3290 PyErr_SetString(PyExc_ValueError,
3291 "negative buffersize in recvfrom");
3292 return NULL;
3293 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3296 if (buf == NULL)
3297 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3300 recvlen, flags, &addr);
3301 if (outlen < 0) {
3302 goto finally;
3303 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 if (outlen != recvlen) {
3306 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003307 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003309 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 goto finally;
3311 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
3315finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 Py_XDECREF(buf);
3317 Py_XDECREF(addr);
3318 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003319}
3320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003321PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003322"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3323\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003325
Thomas Wouters477c8d52006-05-27 19:21:47 +00003326
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003327/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003328
3329static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003330sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003333
Antoine Pitrou19467d22010-08-17 19:33:30 +00003334 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 Py_buffer pbuf;
3336 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003337 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003340
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 kwlist, &pbuf,
3343 &recvlen, &flags))
3344 return NULL;
3345 buf = pbuf.buf;
3346 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 if (recvlen < 0) {
3349 PyBuffer_Release(&pbuf);
3350 PyErr_SetString(PyExc_ValueError,
3351 "negative buffersize in recvfrom_into");
3352 return NULL;
3353 }
3354 if (recvlen == 0) {
3355 /* If nbytes was not specified, use the buffer's length */
3356 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003357 } else if (recvlen > buflen) {
3358 PyBuffer_Release(&pbuf);
3359 PyErr_SetString(PyExc_ValueError,
3360 "nbytes is greater than the length of the buffer");
3361 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3365 if (readlen < 0) {
3366 PyBuffer_Release(&pbuf);
3367 /* Return an error */
3368 Py_XDECREF(addr);
3369 return NULL;
3370 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 PyBuffer_Release(&pbuf);
3373 /* Return the number of bytes read and the address. Note that we do
3374 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003375 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003376}
3377
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003378PyDoc_STRVAR(recvfrom_into_doc,
3379"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003381Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003382
Victor Stinner35bee932015-04-02 12:28:07 +02003383/* The sendmsg() and recvmsg[_into]() methods require a working
3384 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3385#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003386struct sock_recvmsg {
3387 struct msghdr *msg;
3388 int flags;
3389 ssize_t result;
3390};
3391
3392static int
3393sock_recvmsg_impl(PySocketSockObject *s, void *data)
3394{
3395 struct sock_recvmsg *ctx = data;
3396
3397 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3398 return (ctx->result >= 0);
3399}
3400
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003401/*
3402 * Call recvmsg() with the supplied iovec structures, flags, and
3403 * ancillary data buffer size (controllen). Returns the tuple return
3404 * value for recvmsg() or recvmsg_into(), with the first item provided
3405 * by the supplied makeval() function. makeval() will be called with
3406 * the length read and makeval_data as arguments, and must return a
3407 * new reference (which will be decrefed if there is a subsequent
3408 * error). On error, closes any file descriptors received via
3409 * SCM_RIGHTS.
3410 */
3411static PyObject *
3412sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3413 int flags, Py_ssize_t controllen,
3414 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3415{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003416 sock_addr_t addrbuf;
3417 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003418 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003419 PyObject *cmsg_list = NULL, *retval = NULL;
3420 void *controlbuf = NULL;
3421 struct cmsghdr *cmsgh;
3422 size_t cmsgdatalen = 0;
3423 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003424 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425
3426 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3427 ignored" when the socket is connected (Linux fills them in
3428 anyway for AF_UNIX sockets at least). Normally msg_namelen
3429 seems to be set to 0 if there's no address, but try to
3430 initialize msg_name to something that won't be mistaken for a
3431 real address if that doesn't happen. */
3432 if (!getsockaddrlen(s, &addrbuflen))
3433 return NULL;
3434 memset(&addrbuf, 0, addrbuflen);
3435 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3436
3437 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3438 PyErr_SetString(PyExc_ValueError,
3439 "invalid ancillary data buffer length");
3440 return NULL;
3441 }
3442 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3443 return PyErr_NoMemory();
3444
3445 /* Make the system call. */
3446 if (!IS_SELECTABLE(s)) {
3447 select_error();
3448 goto finally;
3449 }
3450
Victor Stinner31bf2d52015-04-01 21:57:09 +02003451 msg.msg_name = SAS2SA(&addrbuf);
3452 msg.msg_namelen = addrbuflen;
3453 msg.msg_iov = iov;
3454 msg.msg_iovlen = iovlen;
3455 msg.msg_control = controlbuf;
3456 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003457
Victor Stinner31bf2d52015-04-01 21:57:09 +02003458 ctx.msg = &msg;
3459 ctx.flags = flags;
3460 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003461 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003462
3463 /* Make list of (level, type, data) tuples from control messages. */
3464 if ((cmsg_list = PyList_New(0)) == NULL)
3465 goto err_closefds;
3466 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3467 implementations didn't do so. */
3468 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3469 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3470 PyObject *bytes, *tuple;
3471 int tmp;
3472
3473 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3474 if (cmsg_status != 0) {
3475 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3476 "received malformed or improperly-truncated "
3477 "ancillary data", 1) == -1)
3478 goto err_closefds;
3479 }
3480 if (cmsg_status < 0)
3481 break;
3482 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003483 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003484 goto err_closefds;
3485 }
3486
3487 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3488 cmsgdatalen);
3489 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3490 (int)cmsgh->cmsg_type, bytes);
3491 if (tuple == NULL)
3492 goto err_closefds;
3493 tmp = PyList_Append(cmsg_list, tuple);
3494 Py_DECREF(tuple);
3495 if (tmp != 0)
3496 goto err_closefds;
3497
3498 if (cmsg_status != 0)
3499 break;
3500 }
3501
3502 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003503 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003504 cmsg_list,
3505 (int)msg.msg_flags,
3506 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3507 ((msg.msg_namelen > addrbuflen) ?
3508 addrbuflen : msg.msg_namelen),
3509 s->sock_proto));
3510 if (retval == NULL)
3511 goto err_closefds;
3512
3513finally:
3514 Py_XDECREF(cmsg_list);
3515 PyMem_Free(controlbuf);
3516 return retval;
3517
3518err_closefds:
3519#ifdef SCM_RIGHTS
3520 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3521 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3522 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3523 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3524 if (cmsg_status < 0)
3525 break;
3526 if (cmsgh->cmsg_level == SOL_SOCKET &&
3527 cmsgh->cmsg_type == SCM_RIGHTS) {
3528 size_t numfds;
3529 int *fdp;
3530
3531 numfds = cmsgdatalen / sizeof(int);
3532 fdp = (int *)CMSG_DATA(cmsgh);
3533 while (numfds-- > 0)
3534 close(*fdp++);
3535 }
3536 if (cmsg_status != 0)
3537 break;
3538 }
3539#endif /* SCM_RIGHTS */
3540 goto finally;
3541}
3542
3543
3544static PyObject *
3545makeval_recvmsg(ssize_t received, void *data)
3546{
3547 PyObject **buf = data;
3548
3549 if (received < PyBytes_GET_SIZE(*buf))
3550 _PyBytes_Resize(buf, received);
3551 Py_XINCREF(*buf);
3552 return *buf;
3553}
3554
3555/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3556
3557static PyObject *
3558sock_recvmsg(PySocketSockObject *s, PyObject *args)
3559{
3560 Py_ssize_t bufsize, ancbufsize = 0;
3561 int flags = 0;
3562 struct iovec iov;
3563 PyObject *buf = NULL, *retval = NULL;
3564
3565 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3566 return NULL;
3567
3568 if (bufsize < 0) {
3569 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3570 return NULL;
3571 }
3572 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3573 return NULL;
3574 iov.iov_base = PyBytes_AS_STRING(buf);
3575 iov.iov_len = bufsize;
3576
3577 /* Note that we're passing a pointer to *our pointer* to the bytes
3578 object here (&buf); makeval_recvmsg() may incref the object, or
3579 deallocate it and set our pointer to NULL. */
3580 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3581 &makeval_recvmsg, &buf);
3582 Py_XDECREF(buf);
3583 return retval;
3584}
3585
3586PyDoc_STRVAR(recvmsg_doc,
3587"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3588\n\
3589Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3590socket. The ancbufsize argument sets the size in bytes of the\n\
3591internal buffer used to receive the ancillary data; it defaults to 0,\n\
3592meaning that no ancillary data will be received. Appropriate buffer\n\
3593sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3594CMSG_LEN(), and items which do not fit into the buffer might be\n\
3595truncated or discarded. The flags argument defaults to 0 and has the\n\
3596same meaning as for recv().\n\
3597\n\
3598The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3599The data item is a bytes object holding the non-ancillary data\n\
3600received. The ancdata item is a list of zero or more tuples\n\
3601(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3602(control messages) received: cmsg_level and cmsg_type are integers\n\
3603specifying the protocol level and protocol-specific type respectively,\n\
3604and cmsg_data is a bytes object holding the associated data. The\n\
3605msg_flags item is the bitwise OR of various flags indicating\n\
3606conditions on the received message; see your system documentation for\n\
3607details. If the receiving socket is unconnected, address is the\n\
3608address of the sending socket, if available; otherwise, its value is\n\
3609unspecified.\n\
3610\n\
3611If recvmsg() raises an exception after the system call returns, it\n\
3612will first attempt to close any file descriptors received via the\n\
3613SCM_RIGHTS mechanism.");
3614
3615
3616static PyObject *
3617makeval_recvmsg_into(ssize_t received, void *data)
3618{
3619 return PyLong_FromSsize_t(received);
3620}
3621
3622/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3623
3624static PyObject *
3625sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3626{
3627 Py_ssize_t ancbufsize = 0;
3628 int flags = 0;
3629 struct iovec *iovs = NULL;
3630 Py_ssize_t i, nitems, nbufs = 0;
3631 Py_buffer *bufs = NULL;
3632 PyObject *buffers_arg, *fast, *retval = NULL;
3633
3634 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3635 &buffers_arg, &ancbufsize, &flags))
3636 return NULL;
3637
3638 if ((fast = PySequence_Fast(buffers_arg,
3639 "recvmsg_into() argument 1 must be an "
3640 "iterable")) == NULL)
3641 return NULL;
3642 nitems = PySequence_Fast_GET_SIZE(fast);
3643 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003644 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003645 goto finally;
3646 }
3647
3648 /* Fill in an iovec for each item, and save the Py_buffer
3649 structs to release afterwards. */
3650 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3651 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3652 PyErr_NoMemory();
3653 goto finally;
3654 }
3655 for (; nbufs < nitems; nbufs++) {
3656 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3657 "w*;recvmsg_into() argument 1 must be an iterable "
3658 "of single-segment read-write buffers",
3659 &bufs[nbufs]))
3660 goto finally;
3661 iovs[nbufs].iov_base = bufs[nbufs].buf;
3662 iovs[nbufs].iov_len = bufs[nbufs].len;
3663 }
3664
3665 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3666 &makeval_recvmsg_into, NULL);
3667finally:
3668 for (i = 0; i < nbufs; i++)
3669 PyBuffer_Release(&bufs[i]);
3670 PyMem_Free(bufs);
3671 PyMem_Free(iovs);
3672 Py_DECREF(fast);
3673 return retval;
3674}
3675
3676PyDoc_STRVAR(recvmsg_into_doc,
3677"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3678\n\
3679Receive normal data and ancillary data from the socket, scattering the\n\
3680non-ancillary data into a series of buffers. The buffers argument\n\
3681must be an iterable of objects that export writable buffers\n\
3682(e.g. bytearray objects); these will be filled with successive chunks\n\
3683of the non-ancillary data until it has all been written or there are\n\
3684no more buffers. The ancbufsize argument sets the size in bytes of\n\
3685the internal buffer used to receive the ancillary data; it defaults to\n\
36860, meaning that no ancillary data will be received. Appropriate\n\
3687buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3688or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3689truncated or discarded. The flags argument defaults to 0 and has the\n\
3690same meaning as for recv().\n\
3691\n\
3692The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3693The nbytes item is the total number of bytes of non-ancillary data\n\
3694written into the buffers. The ancdata item is a list of zero or more\n\
3695tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3696data (control messages) received: cmsg_level and cmsg_type are\n\
3697integers specifying the protocol level and protocol-specific type\n\
3698respectively, and cmsg_data is a bytes object holding the associated\n\
3699data. The msg_flags item is the bitwise OR of various flags\n\
3700indicating conditions on the received message; see your system\n\
3701documentation for details. If the receiving socket is unconnected,\n\
3702address is the address of the sending socket, if available; otherwise,\n\
3703its value is unspecified.\n\
3704\n\
3705If recvmsg_into() raises an exception after the system call returns,\n\
3706it will first attempt to close any file descriptors received via the\n\
3707SCM_RIGHTS mechanism.");
3708#endif /* CMSG_LEN */
3709
3710
Victor Stinner31bf2d52015-04-01 21:57:09 +02003711struct sock_send {
3712 char *buf;
3713 Py_ssize_t len;
3714 int flags;
3715 Py_ssize_t result;
3716};
3717
3718static int
3719sock_send_impl(PySocketSockObject *s, void *data)
3720{
3721 struct sock_send *ctx = data;
3722
3723#ifdef MS_WINDOWS
3724 if (ctx->len > INT_MAX)
3725 ctx->len = INT_MAX;
3726 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3727#else
3728 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3729#endif
3730 return (ctx->result >= 0);
3731}
3732
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003733/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003734
Guido van Rossum73624e91994-10-10 17:59:00 +00003735static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003736sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003737{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003738 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003740 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3743 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 if (!IS_SELECTABLE(s)) {
3746 PyBuffer_Release(&pbuf);
3747 return select_error();
3748 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003749 ctx.buf = pbuf.buf;
3750 ctx.len = pbuf.len;
3751 ctx.flags = flags;
3752 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003753 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 return NULL;
3755 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003756 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003757
3758 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003759}
3760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003761PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003762"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003763\n\
3764Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003765argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003766sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003767
3768
3769/* s.sendall(data [,flags]) method */
3770
3771static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003772sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003774 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003775 Py_ssize_t len, n;
3776 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003778 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003779 int has_timeout = (s->sock_timeout > 0);
3780 _PyTime_t interval = s->sock_timeout;
3781 _PyTime_t deadline = 0;
3782 int deadline_initialized = 0;
3783 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3786 return NULL;
3787 buf = pbuf.buf;
3788 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 if (!IS_SELECTABLE(s)) {
3791 PyBuffer_Release(&pbuf);
3792 return select_error();
3793 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003796 if (has_timeout) {
3797 if (deadline_initialized) {
3798 /* recompute the timeout */
3799 interval = deadline - _PyTime_GetMonotonicClock();
3800 }
3801 else {
3802 deadline_initialized = 1;
3803 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3804 }
3805
3806 if (interval <= 0) {
3807 PyErr_SetString(socket_timeout, "timed out");
3808 goto done;
3809 }
3810 }
3811
Victor Stinner02f32ab2015-04-01 22:53:26 +02003812 ctx.buf = buf;
3813 ctx.len = len;
3814 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003815 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3816 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003817 n = ctx.result;
3818 assert(n >= 0);
3819
3820 buf += n;
3821 len -= n;
3822
3823 /* We must run our signal handlers before looping again.
3824 send() can return a successful partial write when it is
3825 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003826 if (PyErr_CheckSignals())
3827 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003828 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003830
Victor Stinner8912d142015-04-06 23:16:34 +02003831 Py_INCREF(Py_None);
3832 res = Py_None;
3833
3834done:
3835 PyBuffer_Release(&pbuf);
3836 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003837}
3838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003839PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003840"sendall(data[, flags])\n\
3841\n\
3842Send a data string to the socket. For the optional flags\n\
3843argument, see the Unix manual. This calls send() repeatedly\n\
3844until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003845to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003846
Guido van Rossum30a685f1991-06-27 15:51:29 +00003847
Victor Stinner31bf2d52015-04-01 21:57:09 +02003848struct sock_sendto {
3849 char *buf;
3850 Py_ssize_t len;
3851 int flags;
3852 int addrlen;
3853 sock_addr_t *addrbuf;
3854 Py_ssize_t result;
3855};
3856
3857static int
3858sock_sendto_impl(PySocketSockObject *s, void *data)
3859{
3860 struct sock_sendto *ctx = data;
3861
3862#ifdef MS_WINDOWS
3863 if (ctx->len > INT_MAX)
3864 ctx->len = INT_MAX;
3865 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3866 SAS2SA(ctx->addrbuf), ctx->addrlen);
3867#else
3868 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3869 SAS2SA(ctx->addrbuf), ctx->addrlen);
3870#endif
3871 return (ctx->result >= 0);
3872}
3873
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003874/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003875
Guido van Rossum73624e91994-10-10 17:59:00 +00003876static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003877sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 Py_buffer pbuf;
3880 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003881 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003883 int addrlen, flags;
3884 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003887 arglen = PyTuple_Size(args);
3888 switch (arglen) {
3889 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003890 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3891 return NULL;
3892 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003893 break;
3894 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003895 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3896 &pbuf, &flags, &addro)) {
3897 return NULL;
3898 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003899 break;
3900 default:
3901 PyErr_Format(PyExc_TypeError,
3902 "sendto() takes 2 or 3 arguments (%d given)",
3903 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003904 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003907 if (!IS_SELECTABLE(s)) {
3908 PyBuffer_Release(&pbuf);
3909 return select_error();
3910 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3913 PyBuffer_Release(&pbuf);
3914 return NULL;
3915 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003916
Victor Stinner31bf2d52015-04-01 21:57:09 +02003917 ctx.buf = pbuf.buf;
3918 ctx.len = pbuf.len;
3919 ctx.flags = flags;
3920 ctx.addrlen = addrlen;
3921 ctx.addrbuf = &addrbuf;
3922 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003923 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003924 return NULL;
3925 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003926 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003927
3928 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003929}
3930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003931PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003932"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003933\n\
3934Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003935For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003936
Guido van Rossum30a685f1991-06-27 15:51:29 +00003937
Victor Stinner35bee932015-04-02 12:28:07 +02003938/* The sendmsg() and recvmsg[_into]() methods require a working
3939 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3940#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003941struct sock_sendmsg {
3942 struct msghdr *msg;
3943 int flags;
3944 ssize_t result;
3945};
3946
3947static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003948sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3949 struct msghdr *msg,
3950 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3951 Py_ssize_t ndataparts, ndatabufs = 0;
3952 int result = -1;
3953 struct iovec *iovs = NULL;
3954 PyObject *data_fast = NULL;
3955 Py_buffer *databufs = NULL;
3956
3957 /* Fill in an iovec for each message part, and save the Py_buffer
3958 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003959 data_fast = PySequence_Fast(data_arg,
3960 "sendmsg() argument 1 must be an "
3961 "iterable");
3962 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003963 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003964 }
3965
Christian Heimesdffa3942016-09-05 23:54:41 +02003966 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3967 if (ndataparts > INT_MAX) {
3968 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3969 goto finally;
3970 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003971
Christian Heimesdffa3942016-09-05 23:54:41 +02003972 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003973 if (ndataparts > 0) {
3974 iovs = PyMem_New(struct iovec, ndataparts);
3975 if (iovs == NULL) {
3976 PyErr_NoMemory();
3977 goto finally;
3978 }
3979 msg->msg_iov = iovs;
3980
3981 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003982 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003983 PyErr_NoMemory();
3984 goto finally;
3985 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003986 }
3987 for (; ndatabufs < ndataparts; ndatabufs++) {
3988 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3989 "y*;sendmsg() argument 1 must be an iterable of "
3990 "bytes-like objects",
3991 &databufs[ndatabufs]))
3992 goto finally;
3993 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3994 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3995 }
3996 result = 0;
3997 finally:
3998 *databufsout = databufs;
3999 *ndatabufsout = ndatabufs;
4000 Py_XDECREF(data_fast);
4001 return result;
4002}
4003
4004static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004005sock_sendmsg_impl(PySocketSockObject *s, void *data)
4006{
4007 struct sock_sendmsg *ctx = data;
4008
4009 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4010 return (ctx->result >= 0);
4011}
4012
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004013/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4014
4015static PyObject *
4016sock_sendmsg(PySocketSockObject *s, PyObject *args)
4017{
Christian Heimesdffa3942016-09-05 23:54:41 +02004018 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004019 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004020 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004021 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004022 struct cmsginfo {
4023 int level;
4024 int type;
4025 Py_buffer data;
4026 } *cmsgs = NULL;
4027 void *controlbuf = NULL;
4028 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004029 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004030 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004031 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004032 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004033
4034 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004035 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004036 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004037 }
4038
4039 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041 /* Parse destination address. */
4042 if (addr_arg != NULL && addr_arg != Py_None) {
4043 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4044 goto finally;
4045 msg.msg_name = &addrbuf;
4046 msg.msg_namelen = addrlen;
4047 }
4048
4049 /* Fill in an iovec for each message part, and save the Py_buffer
4050 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004051 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004052 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004053 }
4054
4055 if (cmsg_arg == NULL)
4056 ncmsgs = 0;
4057 else {
4058 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4059 "sendmsg() argument 2 must be an "
4060 "iterable")) == NULL)
4061 goto finally;
4062 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4063 }
4064
4065#ifndef CMSG_SPACE
4066 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004067 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004068 "sending multiple control messages is not supported "
4069 "on this system");
4070 goto finally;
4071 }
4072#endif
4073 /* Save level, type and Py_buffer for each control message,
4074 and calculate total size. */
4075 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4076 PyErr_NoMemory();
4077 goto finally;
4078 }
4079 controllen = controllen_last = 0;
4080 while (ncmsgbufs < ncmsgs) {
4081 size_t bufsize, space;
4082
4083 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4084 "(iiy*):[sendmsg() ancillary data items]",
4085 &cmsgs[ncmsgbufs].level,
4086 &cmsgs[ncmsgbufs].type,
4087 &cmsgs[ncmsgbufs].data))
4088 goto finally;
4089 bufsize = cmsgs[ncmsgbufs++].data.len;
4090
4091#ifdef CMSG_SPACE
4092 if (!get_CMSG_SPACE(bufsize, &space)) {
4093#else
4094 if (!get_CMSG_LEN(bufsize, &space)) {
4095#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004096 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097 goto finally;
4098 }
4099 controllen += space;
4100 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004101 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 goto finally;
4103 }
4104 controllen_last = controllen;
4105 }
4106
4107 /* Construct ancillary data block from control message info. */
4108 if (ncmsgbufs > 0) {
4109 struct cmsghdr *cmsgh = NULL;
4110
Victor Stinner52d61e42016-09-12 11:41:58 +02004111 controlbuf = PyMem_Malloc(controllen);
4112 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113 PyErr_NoMemory();
4114 goto finally;
4115 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004116 msg.msg_control = controlbuf;
4117
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004118 msg.msg_controllen = controllen;
4119
4120 /* Need to zero out the buffer as a workaround for glibc's
4121 CMSG_NXTHDR() implementation. After getting the pointer to
4122 the next header, it checks its (uninitialized) cmsg_len
4123 member to see if the "message" fits in the buffer, and
4124 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004125 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004126 memset(controlbuf, 0, controllen);
4127
4128 for (i = 0; i < ncmsgbufs; i++) {
4129 size_t msg_len, data_len = cmsgs[i].data.len;
4130 int enough_space = 0;
4131
4132 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4133 if (cmsgh == NULL) {
4134 PyErr_Format(PyExc_RuntimeError,
4135 "unexpected NULL result from %s()",
4136 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4137 goto finally;
4138 }
4139 if (!get_CMSG_LEN(data_len, &msg_len)) {
4140 PyErr_SetString(PyExc_RuntimeError,
4141 "item size out of range for CMSG_LEN()");
4142 goto finally;
4143 }
4144 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4145 size_t space;
4146
4147 cmsgh->cmsg_len = msg_len;
4148 if (get_cmsg_data_space(&msg, cmsgh, &space))
4149 enough_space = (space >= data_len);
4150 }
4151 if (!enough_space) {
4152 PyErr_SetString(PyExc_RuntimeError,
4153 "ancillary data does not fit in calculated "
4154 "space");
4155 goto finally;
4156 }
4157 cmsgh->cmsg_level = cmsgs[i].level;
4158 cmsgh->cmsg_type = cmsgs[i].type;
4159 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4160 }
4161 }
4162
4163 /* Make the system call. */
4164 if (!IS_SELECTABLE(s)) {
4165 select_error();
4166 goto finally;
4167 }
4168
Victor Stinner31bf2d52015-04-01 21:57:09 +02004169 ctx.msg = &msg;
4170 ctx.flags = flags;
4171 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004172 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004173
4174 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004175
4176finally:
4177 PyMem_Free(controlbuf);
4178 for (i = 0; i < ncmsgbufs; i++)
4179 PyBuffer_Release(&cmsgs[i].data);
4180 PyMem_Free(cmsgs);
4181 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004182 PyMem_Free(msg.msg_iov);
4183 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004185 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004186 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004187 return retval;
4188}
4189
4190PyDoc_STRVAR(sendmsg_doc,
4191"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4192\n\
4193Send normal and ancillary data to the socket, gathering the\n\
4194non-ancillary data from a series of buffers and concatenating it into\n\
4195a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004196data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004197The ancdata argument specifies the ancillary data (control messages)\n\
4198as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4199cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4200protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004201is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004202argument defaults to 0 and has the same meaning as for send(). If\n\
4203address is supplied and not None, it sets a destination address for\n\
4204the message. The return value is the number of bytes of non-ancillary\n\
4205data sent.");
4206#endif /* CMSG_LEN */
4207
Christian Heimesdffa3942016-09-05 23:54:41 +02004208#ifdef HAVE_SOCKADDR_ALG
4209static PyObject*
4210sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4211{
4212 PyObject *retval = NULL;
4213
4214 Py_ssize_t i, ndatabufs = 0;
4215 Py_buffer *databufs = NULL;
4216 PyObject *data_arg = NULL;
4217
4218 Py_buffer iv = {NULL, NULL};
4219
4220 PyObject *opobj = NULL;
4221 int op = -1;
4222
4223 PyObject *assoclenobj = NULL;
4224 int assoclen = -1;
4225
4226 unsigned int *uiptr;
4227 int flags = 0;
4228
4229 struct msghdr msg;
4230 struct cmsghdr *header = NULL;
4231 struct af_alg_iv *alg_iv = NULL;
4232 struct sock_sendmsg ctx;
4233 Py_ssize_t controllen;
4234 void *controlbuf = NULL;
4235 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4236
4237 if (self->sock_family != AF_ALG) {
4238 PyErr_SetString(PyExc_OSError,
4239 "algset is only supported for AF_ALG");
4240 return NULL;
4241 }
4242
4243 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4244 "|O$O!y*O!i:sendmsg_afalg", keywords,
4245 &data_arg,
4246 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004247 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004248 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004249 }
4250
4251 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004252
4253 /* op is a required, keyword-only argument >= 0 */
4254 if (opobj != NULL) {
4255 op = _PyLong_AsInt(opobj);
4256 }
4257 if (op < 0) {
4258 /* override exception from _PyLong_AsInt() */
4259 PyErr_SetString(PyExc_TypeError,
4260 "Invalid or missing argument 'op'");
4261 goto finally;
4262 }
4263 /* assoclen is optional but must be >= 0 */
4264 if (assoclenobj != NULL) {
4265 assoclen = _PyLong_AsInt(assoclenobj);
4266 if (assoclen == -1 && PyErr_Occurred()) {
4267 goto finally;
4268 }
4269 if (assoclen < 0) {
4270 PyErr_SetString(PyExc_TypeError,
4271 "assoclen must be positive");
4272 goto finally;
4273 }
4274 }
4275
4276 controllen = CMSG_SPACE(4);
4277 if (iv.buf != NULL) {
4278 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4279 }
4280 if (assoclen >= 0) {
4281 controllen += CMSG_SPACE(4);
4282 }
4283
4284 controlbuf = PyMem_Malloc(controllen);
4285 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004286 PyErr_NoMemory();
4287 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004288 }
4289 memset(controlbuf, 0, controllen);
4290
Christian Heimesdffa3942016-09-05 23:54:41 +02004291 msg.msg_controllen = controllen;
4292 msg.msg_control = controlbuf;
4293
4294 /* Fill in an iovec for each message part, and save the Py_buffer
4295 structs to release afterwards. */
4296 if (data_arg != NULL) {
4297 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4298 goto finally;
4299 }
4300 }
4301
4302 /* set operation to encrypt or decrypt */
4303 header = CMSG_FIRSTHDR(&msg);
4304 if (header == NULL) {
4305 PyErr_SetString(PyExc_RuntimeError,
4306 "unexpected NULL result from CMSG_FIRSTHDR");
4307 goto finally;
4308 }
4309 header->cmsg_level = SOL_ALG;
4310 header->cmsg_type = ALG_SET_OP;
4311 header->cmsg_len = CMSG_LEN(4);
4312 uiptr = (void*)CMSG_DATA(header);
4313 *uiptr = (unsigned int)op;
4314
4315 /* set initialization vector */
4316 if (iv.buf != NULL) {
4317 header = CMSG_NXTHDR(&msg, header);
4318 if (header == NULL) {
4319 PyErr_SetString(PyExc_RuntimeError,
4320 "unexpected NULL result from CMSG_NXTHDR(iv)");
4321 goto finally;
4322 }
4323 header->cmsg_level = SOL_ALG;
4324 header->cmsg_type = ALG_SET_IV;
4325 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4326 alg_iv = (void*)CMSG_DATA(header);
4327 alg_iv->ivlen = iv.len;
4328 memcpy(alg_iv->iv, iv.buf, iv.len);
4329 }
4330
4331 /* set length of associated data for AEAD */
4332 if (assoclen >= 0) {
4333 header = CMSG_NXTHDR(&msg, header);
4334 if (header == NULL) {
4335 PyErr_SetString(PyExc_RuntimeError,
4336 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4337 goto finally;
4338 }
4339 header->cmsg_level = SOL_ALG;
4340 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4341 header->cmsg_len = CMSG_LEN(4);
4342 uiptr = (void*)CMSG_DATA(header);
4343 *uiptr = (unsigned int)assoclen;
4344 }
4345
4346 ctx.msg = &msg;
4347 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004348 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004349 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004350 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004351
4352 retval = PyLong_FromSsize_t(ctx.result);
4353
4354 finally:
4355 PyMem_Free(controlbuf);
4356 if (iv.buf != NULL) {
4357 PyBuffer_Release(&iv);
4358 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004359 PyMem_Free(msg.msg_iov);
4360 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004361 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004362 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004363 PyMem_Free(databufs);
4364 return retval;
4365}
4366
4367PyDoc_STRVAR(sendmsg_afalg_doc,
4368"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4369\n\
4370Set operation mode, IV and length of associated data for an AF_ALG\n\
4371operation socket.");
4372#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004373
Guido van Rossum30a685f1991-06-27 15:51:29 +00004374/* s.shutdown(how) method */
4375
Guido van Rossum73624e91994-10-10 17:59:00 +00004376static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004377sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 int how;
4380 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004381
Serhiy Storchaka78980432013-01-15 01:12:17 +02004382 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 if (how == -1 && PyErr_Occurred())
4384 return NULL;
4385 Py_BEGIN_ALLOW_THREADS
4386 res = shutdown(s->sock_fd, how);
4387 Py_END_ALLOW_THREADS
4388 if (res < 0)
4389 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004390 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004391}
4392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004393PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004394"shutdown(flag)\n\
4395\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004396Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4397of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004398
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004399#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004400static PyObject*
4401sock_ioctl(PySocketSockObject *s, PyObject *arg)
4402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 unsigned long cmd = SIO_RCVALL;
4404 PyObject *argO;
4405 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4408 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 switch (cmd) {
4411 case SIO_RCVALL: {
4412 unsigned int option = RCVALL_ON;
4413 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4414 return NULL;
4415 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4416 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4417 return set_error();
4418 }
4419 return PyLong_FromUnsignedLong(recv); }
4420 case SIO_KEEPALIVE_VALS: {
4421 struct tcp_keepalive ka;
4422 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4423 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4424 return NULL;
4425 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4426 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4427 return set_error();
4428 }
4429 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004430#if defined(SIO_LOOPBACK_FAST_PATH)
4431 case SIO_LOOPBACK_FAST_PATH: {
4432 unsigned int option;
4433 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4434 return NULL;
4435 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4436 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4437 return set_error();
4438 }
4439 return PyLong_FromUnsignedLong(recv); }
4440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 default:
4442 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4443 return NULL;
4444 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004445}
4446PyDoc_STRVAR(sock_ioctl_doc,
4447"ioctl(cmd, option) -> long\n\
4448\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004449Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4450SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004451SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4452SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004453#endif
4454
4455#if defined(MS_WINDOWS)
4456static PyObject*
4457sock_share(PySocketSockObject *s, PyObject *arg)
4458{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004459 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004460 DWORD processId;
4461 int result;
4462
4463 if (!PyArg_ParseTuple(arg, "I", &processId))
4464 return NULL;
4465
4466 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004467 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004468 Py_END_ALLOW_THREADS
4469 if (result == SOCKET_ERROR)
4470 return set_error();
4471 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4472}
4473PyDoc_STRVAR(sock_share_doc,
4474"share(process_id) -> bytes\n\
4475\n\
4476Share the socket with another process. The target process id\n\
4477must be provided and the resulting bytes object passed to the target\n\
4478process. There the shared socket can be instantiated by calling\n\
4479socket.fromshare().");
4480
Christian Heimesfaf2f632008-01-06 16:59:19 +00004481
4482#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004483
4484/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004485
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004486static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4488 accept_doc},
4489 {"bind", (PyCFunction)sock_bind, METH_O,
4490 bind_doc},
4491 {"close", (PyCFunction)sock_close, METH_NOARGS,
4492 close_doc},
4493 {"connect", (PyCFunction)sock_connect, METH_O,
4494 connect_doc},
4495 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4496 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004497 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4498 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4500 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004501#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 {"getpeername", (PyCFunction)sock_getpeername,
4503 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 {"getsockname", (PyCFunction)sock_getsockname,
4506 METH_NOARGS, getsockname_doc},
4507 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4508 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004509#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4511 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004512#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004513#if defined(MS_WINDOWS)
4514 {"share", (PyCFunction)sock_share, METH_VARARGS,
4515 sock_share_doc},
4516#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004517 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 listen_doc},
4519 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4520 recv_doc},
4521 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4522 recv_into_doc},
4523 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4524 recvfrom_doc},
4525 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4526 recvfrom_into_doc},
4527 {"send", (PyCFunction)sock_send, METH_VARARGS,
4528 send_doc},
4529 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4530 sendall_doc},
4531 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4532 sendto_doc},
4533 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4534 setblocking_doc},
4535 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4536 settimeout_doc},
4537 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4538 gettimeout_doc},
4539 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4540 setsockopt_doc},
4541 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4542 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004543#ifdef CMSG_LEN
4544 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4545 recvmsg_doc},
4546 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4547 recvmsg_into_doc,},
4548 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4549 sendmsg_doc},
4550#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004551#ifdef HAVE_SOCKADDR_ALG
4552 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4553 sendmsg_afalg_doc},
4554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004556};
4557
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004558/* SockObject members */
4559static PyMemberDef sock_memberlist[] = {
4560 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4561 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4562 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004563 {0},
4564};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004565
Victor Stinner71694d52015-03-28 01:18:54 +01004566static PyGetSetDef sock_getsetlist[] = {
4567 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4568 {NULL} /* sentinel */
4569};
4570
Guido van Rossum73624e91994-10-10 17:59:00 +00004571/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004572 First close the file description. */
4573
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004574static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004575sock_finalize(PySocketSockObject *s)
4576{
4577 SOCKET_T fd;
4578 PyObject *error_type, *error_value, *error_traceback;
4579
4580 /* Save the current exception, if any. */
4581 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4582
Victor Stinnerd3afb622016-07-22 17:47:09 +02004583 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004584 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4585 /* Spurious errors can appear at shutdown */
4586 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4587 PyErr_WriteUnraisable((PyObject *)s);
4588 }
4589 }
4590
4591 /* Only close the socket *after* logging the ResourceWarning warning
4592 to allow the logger to call socket methods like
4593 socket.getsockname(). If the socket is closed before, socket
4594 methods fails with the EBADF error. */
4595 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004596 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004597
4598 /* We do not want to retry upon EINTR: see sock_close() */
4599 Py_BEGIN_ALLOW_THREADS
4600 (void) SOCKETCLOSE(fd);
4601 Py_END_ALLOW_THREADS
4602 }
4603
4604 /* Restore the saved exception. */
4605 PyErr_Restore(error_type, error_value, error_traceback);
4606}
4607
4608static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004609sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004610{
Victor Stinner19a8e842016-03-21 16:36:48 +01004611 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4612 return;
4613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004615}
4616
Guido van Rossum30a685f1991-06-27 15:51:29 +00004617
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004619sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004620{
Victor Stinnere254e532014-07-26 14:36:55 +02004621 long sock_fd;
4622 /* On Windows, this test is needed because SOCKET_T is unsigned */
4623 if (s->sock_fd == INVALID_SOCKET) {
4624 sock_fd = -1;
4625 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004626#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004627 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 /* this can occur on Win64, and actually there is a special
4629 ugly printf formatter for decimal pointer length integer
4630 printing, only bother if necessary*/
4631 PyErr_SetString(PyExc_OverflowError,
4632 "no printf formatter to display "
4633 "the socket descriptor in decimal");
4634 return NULL;
4635 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004636#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004637 else
4638 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 return PyUnicode_FromFormat(
4640 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004641 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 s->sock_type,
4643 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004644}
4645
4646
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004647/* Create a new, uninitialized socket object. */
4648
4649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004650sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 new = type->tp_alloc(type, 0);
4655 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004656 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004657 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 ((PySocketSockObject *)new)->errorhandler = &set_error;
4659 }
4660 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004661}
4662
4663
4664/* Initialize a new socket object. */
4665
Victor Stinnerdaf45552013-08-28 00:53:59 +02004666#ifdef SOCK_CLOEXEC
4667/* socket() and socketpair() fail with EINVAL on Linux kernel older
4668 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4669static int sock_cloexec_works = -1;
4670#endif
4671
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004672/*ARGSUSED*/
4673static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004674sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 PySocketSockObject *s = (PySocketSockObject *)self;
4677 PyObject *fdobj = NULL;
4678 SOCKET_T fd = INVALID_SOCKET;
4679 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4680 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004681#ifndef MS_WINDOWS
4682#ifdef SOCK_CLOEXEC
4683 int *atomic_flag_works = &sock_cloexec_works;
4684#else
4685 int *atomic_flag_works = NULL;
4686#endif
4687#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4690 "|iiiO:socket", keywords,
4691 &family, &type, &proto, &fdobj))
4692 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004695#ifdef MS_WINDOWS
4696 /* recreate a socket that was duplicated */
4697 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004698 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004699 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4700 PyErr_Format(PyExc_ValueError,
4701 "socket descriptor string has wrong size, "
4702 "should be %zu bytes.", sizeof(info));
4703 return -1;
4704 }
4705 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4706 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004707 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004708 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4709 Py_END_ALLOW_THREADS
4710 if (fd == INVALID_SOCKET) {
4711 set_error();
4712 return -1;
4713 }
4714 family = info.iAddressFamily;
4715 type = info.iSocketType;
4716 proto = info.iProtocol;
4717 }
4718 else
4719#endif
4720 {
4721 fd = PyLong_AsSocket_t(fdobj);
4722 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4723 return -1;
4724 if (fd == INVALID_SOCKET) {
4725 PyErr_SetString(PyExc_ValueError,
4726 "can't use invalid socket value");
4727 return -1;
4728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 }
4730 }
4731 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004732#ifdef MS_WINDOWS
4733 /* Windows implementation */
4734#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4735#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4736#endif
4737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004739 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004740 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004741 NULL, 0,
4742 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4743 if (fd == INVALID_SOCKET) {
4744 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4745 support_wsa_no_inherit = 0;
4746 fd = socket(family, type, proto);
4747 }
4748 }
4749 else {
4750 fd = socket(family, type, proto);
4751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 if (fd == INVALID_SOCKET) {
4755 set_error();
4756 return -1;
4757 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004758
4759 if (!support_wsa_no_inherit) {
4760 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4761 closesocket(fd);
4762 PyErr_SetFromWindowsErr(0);
4763 return -1;
4764 }
4765 }
4766#else
4767 /* UNIX */
4768 Py_BEGIN_ALLOW_THREADS
4769#ifdef SOCK_CLOEXEC
4770 if (sock_cloexec_works != 0) {
4771 fd = socket(family, type | SOCK_CLOEXEC, proto);
4772 if (sock_cloexec_works == -1) {
4773 if (fd >= 0) {
4774 sock_cloexec_works = 1;
4775 }
4776 else if (errno == EINVAL) {
4777 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4778 sock_cloexec_works = 0;
4779 fd = socket(family, type, proto);
4780 }
4781 }
4782 }
4783 else
4784#endif
4785 {
4786 fd = socket(family, type, proto);
4787 }
4788 Py_END_ALLOW_THREADS
4789
4790 if (fd == INVALID_SOCKET) {
4791 set_error();
4792 return -1;
4793 }
4794
4795 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4796 SOCKETCLOSE(fd);
4797 return -1;
4798 }
4799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004801 if (init_sockobject(s, fd, family, type, proto) == -1) {
4802 SOCKETCLOSE(fd);
4803 return -1;
4804 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004807
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004808}
4809
4810
Guido van Rossumb6775db1994-08-01 11:34:53 +00004811/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004812
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004813static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4815 "_socket.socket", /* tp_name */
4816 sizeof(PySocketSockObject), /* tp_basicsize */
4817 0, /* tp_itemsize */
4818 (destructor)sock_dealloc, /* tp_dealloc */
4819 0, /* tp_print */
4820 0, /* tp_getattr */
4821 0, /* tp_setattr */
4822 0, /* tp_reserved */
4823 (reprfunc)sock_repr, /* tp_repr */
4824 0, /* tp_as_number */
4825 0, /* tp_as_sequence */
4826 0, /* tp_as_mapping */
4827 0, /* tp_hash */
4828 0, /* tp_call */
4829 0, /* tp_str */
4830 PyObject_GenericGetAttr, /* tp_getattro */
4831 0, /* tp_setattro */
4832 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004833 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4834 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 sock_doc, /* tp_doc */
4836 0, /* tp_traverse */
4837 0, /* tp_clear */
4838 0, /* tp_richcompare */
4839 0, /* tp_weaklistoffset */
4840 0, /* tp_iter */
4841 0, /* tp_iternext */
4842 sock_methods, /* tp_methods */
4843 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004844 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 0, /* tp_base */
4846 0, /* tp_dict */
4847 0, /* tp_descr_get */
4848 0, /* tp_descr_set */
4849 0, /* tp_dictoffset */
4850 sock_initobj, /* tp_init */
4851 PyType_GenericAlloc, /* tp_alloc */
4852 sock_new, /* tp_new */
4853 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004854 0, /* tp_is_gc */
4855 0, /* tp_bases */
4856 0, /* tp_mro */
4857 0, /* tp_cache */
4858 0, /* tp_subclasses */
4859 0, /* tp_weaklist */
4860 0, /* tp_del */
4861 0, /* tp_version_tag */
4862 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004863};
4864
Guido van Rossum30a685f1991-06-27 15:51:29 +00004865
Guido van Rossum81194471991-07-27 21:42:02 +00004866/* Python interface to gethostname(). */
4867
4868/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004869static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004870socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004871{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004872#ifdef MS_WINDOWS
4873 /* Don't use winsock's gethostname, as this returns the ANSI
4874 version of the hostname, whereas we need a Unicode string.
4875 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004876 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004877 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004878 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004879 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004880
4881 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004882 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004883
4884 if (GetLastError() != ERROR_MORE_DATA)
4885 return PyErr_SetFromWindowsErr(0);
4886
4887 if (size == 0)
4888 return PyUnicode_New(0, 0);
4889
4890 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4891 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004892 name = PyMem_New(wchar_t, size);
4893 if (!name) {
4894 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004895 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004896 }
Victor Stinner74168972011-11-17 01:11:36 +01004897 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4898 name,
4899 &size))
4900 {
4901 PyMem_Free(name);
4902 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004903 }
Victor Stinner74168972011-11-17 01:11:36 +01004904
4905 result = PyUnicode_FromWideChar(name, size);
4906 PyMem_Free(name);
4907 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004908#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 char buf[1024];
4910 int res;
4911 Py_BEGIN_ALLOW_THREADS
4912 res = gethostname(buf, (int) sizeof buf - 1);
4913 Py_END_ALLOW_THREADS
4914 if (res < 0)
4915 return set_error();
4916 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004917 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004918#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004919}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004921PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004922"gethostname() -> string\n\
4923\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004924Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004925
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004926#ifdef HAVE_SETHOSTNAME
4927PyDoc_STRVAR(sethostname_doc,
4928"sethostname(name)\n\n\
4929Sets the hostname to name.");
4930
4931static PyObject *
4932socket_sethostname(PyObject *self, PyObject *args)
4933{
4934 PyObject *hnobj;
4935 Py_buffer buf;
4936 int res, flag = 0;
4937
Christian Heimesd2774c72013-06-19 02:06:29 +02004938#ifdef _AIX
4939/* issue #18259, not declared in any useful header file */
4940extern int sethostname(const char *, size_t);
4941#endif
4942
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004943 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4944 PyErr_Clear();
4945 if (!PyArg_ParseTuple(args, "O&:sethostname",
4946 PyUnicode_FSConverter, &hnobj))
4947 return NULL;
4948 flag = 1;
4949 }
4950 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4951 if (!res) {
4952 res = sethostname(buf.buf, buf.len);
4953 PyBuffer_Release(&buf);
4954 }
4955 if (flag)
4956 Py_DECREF(hnobj);
4957 if (res)
4958 return set_error();
4959 Py_RETURN_NONE;
4960}
4961#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004962
Guido van Rossum30a685f1991-06-27 15:51:29 +00004963/* Python interface to gethostbyname(name). */
4964
4965/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004966static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004967socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 char *name;
4970 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004971 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004972
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004973 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 return NULL;
4975 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004976 goto finally;
4977 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4978finally:
4979 PyMem_Free(name);
4980 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004981}
4982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004983PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004984"gethostbyname(host) -> address\n\
4985\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004986Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004987
4988
Victor Stinner72400302016-01-28 15:41:01 +01004989static PyObject*
4990sock_decode_hostname(const char *name)
4991{
4992#ifdef MS_WINDOWS
4993 /* Issue #26227: gethostbyaddr() returns a string encoded
4994 * to the ANSI code page */
4995 return PyUnicode_DecodeFSDefault(name);
4996#else
4997 /* Decode from UTF-8 */
4998 return PyUnicode_FromString(name);
4999#endif
5000}
5001
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005002/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5003
5004static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005005gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 char **pch;
5008 PyObject *rtn_tuple = (PyObject *)NULL;
5009 PyObject *name_list = (PyObject *)NULL;
5010 PyObject *addr_list = (PyObject *)NULL;
5011 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005012 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 if (h == NULL) {
5015 /* Let's get real error message to return */
5016 set_herror(h_errno);
5017 return NULL;
5018 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 if (h->h_addrtype != af) {
5021 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005022 errno = EAFNOSUPPORT;
5023 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 return NULL;
5025 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 case AF_INET:
5030 if (alen < sizeof(struct sockaddr_in))
5031 return NULL;
5032 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005033
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005034#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 case AF_INET6:
5036 if (alen < sizeof(struct sockaddr_in6))
5037 return NULL;
5038 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005039#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 if ((name_list = PyList_New(0)) == NULL)
5044 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 if ((addr_list = PyList_New(0)) == NULL)
5047 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 /* SF #1511317: h_aliases can be NULL */
5050 if (h->h_aliases) {
5051 for (pch = h->h_aliases; *pch != NULL; pch++) {
5052 int status;
5053 tmp = PyUnicode_FromString(*pch);
5054 if (tmp == NULL)
5055 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 status = PyList_Append(name_list, tmp);
5058 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 if (status)
5061 goto err;
5062 }
5063 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5066 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 case AF_INET:
5071 {
5072 struct sockaddr_in sin;
5073 memset(&sin, 0, sizeof(sin));
5074 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005075#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5079 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 if (pch == h->h_addr_list && alen >= sizeof(sin))
5082 memcpy((char *) addr, &sin, sizeof(sin));
5083 break;
5084 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005085
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005086#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 case AF_INET6:
5088 {
5089 struct sockaddr_in6 sin6;
5090 memset(&sin6, 0, sizeof(sin6));
5091 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005092#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5096 tmp = makeipaddr((struct sockaddr *)&sin6,
5097 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5100 memcpy((char *) addr, &sin6, sizeof(sin6));
5101 break;
5102 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005103#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005106 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 "unsupported address family");
5108 return NULL;
5109 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 if (tmp == NULL)
5112 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 status = PyList_Append(addr_list, tmp);
5115 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 if (status)
5118 goto err;
5119 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005120
Victor Stinner72400302016-01-28 15:41:01 +01005121 name = sock_decode_hostname(h->h_name);
5122 if (name == NULL)
5123 goto err;
5124 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005125
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005126 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 Py_XDECREF(name_list);
5128 Py_XDECREF(addr_list);
5129 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005130}
5131
5132
5133/* Python interface to gethostbyname_ex(name). */
5134
5135/*ARGSUSED*/
5136static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005137socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 char *name;
5140 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005141 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005143 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005144#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005146#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005148#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 char buf[16384];
5150 int buf_len = (sizeof buf) - 1;
5151 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005152#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005153#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005155#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005156#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005157
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005158 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005160 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005161 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005163#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005164#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005165 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005167#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005169#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 memset((void *) &data, '\0', sizeof(data));
5171 result = gethostbyname_r(name, &hp_allocated, &data);
5172 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005173#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005174#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005175#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005177#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005178 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005180#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 Py_END_ALLOW_THREADS
5182 /* Some C libraries would require addr.__ss_family instead of
5183 addr.ss_family.
5184 Therefore, we cast the sockaddr_storage into sockaddr to
5185 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005186 sa = SAS2SA(&addr);
5187 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005189#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005191#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005192finally:
5193 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005195}
5196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005197PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005198"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5199\n\
5200Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005201for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005202
5203
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005204/* Python interface to gethostbyaddr(IP). */
5205
5206/*ARGSUSED*/
5207static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005208socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005209{
Charles-François Natali8b759652011-12-23 16:44:51 +01005210 sock_addr_t addr;
5211 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 char *ip_num;
5213 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005214 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005215#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005217#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005219#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 /* glibcs up to 2.10 assume that the buf argument to
5221 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5222 does not ensure. The attribute below instructs the compiler
5223 to maintain this alignment. */
5224 char buf[16384] Py_ALIGNED(8);
5225 int buf_len = (sizeof buf) - 1;
5226 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005227#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005228#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005230#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005231#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 char *ap;
5233 int al;
5234 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005235
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005236 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 return NULL;
5238 af = AF_UNSPEC;
5239 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005240 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 af = sa->sa_family;
5242 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005243 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 switch (af) {
5245 case AF_INET:
5246 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5247 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5248 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005249#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 case AF_INET6:
5251 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5252 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5253 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005256 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005257 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 }
5259 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005260#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005261#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005262 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 &hp_allocated, buf, buf_len,
5264 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005265#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 h = gethostbyaddr_r(ap, al, af,
5267 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005268#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 memset((void *) &data, '\0', sizeof(data));
5270 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5271 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005272#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005273#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005274#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005276#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005277 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005279#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005281 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005282#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005284#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005285finally:
5286 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005288}
5289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005290PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005291"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5292\n\
5293Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005294for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005295
Guido van Rossum30a685f1991-06-27 15:51:29 +00005296
5297/* Python interface to getservbyname(name).
5298 This only returns the port number, since the other info is already
5299 known or not useful (like the list of aliases). */
5300
5301/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005302static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005303socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 char *name, *proto=NULL;
5306 struct servent *sp;
5307 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5308 return NULL;
5309 Py_BEGIN_ALLOW_THREADS
5310 sp = getservbyname(name, proto);
5311 Py_END_ALLOW_THREADS
5312 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005313 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 return NULL;
5315 }
5316 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005317}
5318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005319PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005320"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005321\n\
5322Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005323The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5324otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005325
Guido van Rossum30a685f1991-06-27 15:51:29 +00005326
Barry Warsaw11b91a02004-06-28 00:50:43 +00005327/* Python interface to getservbyport(port).
5328 This only returns the service name, since the other info is already
5329 known or not useful (like the list of aliases). */
5330
5331/*ARGSUSED*/
5332static PyObject *
5333socket_getservbyport(PyObject *self, PyObject *args)
5334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 int port;
5336 char *proto=NULL;
5337 struct servent *sp;
5338 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5339 return NULL;
5340 if (port < 0 || port > 0xffff) {
5341 PyErr_SetString(
5342 PyExc_OverflowError,
5343 "getservbyport: port must be 0-65535.");
5344 return NULL;
5345 }
5346 Py_BEGIN_ALLOW_THREADS
5347 sp = getservbyport(htons((short)port), proto);
5348 Py_END_ALLOW_THREADS
5349 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005350 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 return NULL;
5352 }
5353 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005354}
5355
5356PyDoc_STRVAR(getservbyport_doc,
5357"getservbyport(port[, protocolname]) -> string\n\
5358\n\
5359Return the service name from a port number and protocol name.\n\
5360The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5361otherwise any protocol will match.");
5362
Guido van Rossum3901d851996-12-19 16:35:04 +00005363/* Python interface to getprotobyname(name).
5364 This only returns the protocol number, since the other info is
5365 already known or not useful (like the list of aliases). */
5366
5367/*ARGSUSED*/
5368static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005369socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 char *name;
5372 struct protoent *sp;
5373 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5374 return NULL;
5375 Py_BEGIN_ALLOW_THREADS
5376 sp = getprotobyname(name);
5377 Py_END_ALLOW_THREADS
5378 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005379 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 return NULL;
5381 }
5382 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005383}
5384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005385PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005386"getprotobyname(name) -> integer\n\
5387\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005388Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005389
Guido van Rossum3901d851996-12-19 16:35:04 +00005390
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005391#ifndef NO_DUP
5392/* dup() function for socket fds */
5393
5394static PyObject *
5395socket_dup(PyObject *self, PyObject *fdobj)
5396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 SOCKET_T fd, newfd;
5398 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005399#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005400 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005401#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 fd = PyLong_AsSocket_t(fdobj);
5404 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5405 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005406
Victor Stinnerdaf45552013-08-28 00:53:59 +02005407#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005408 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005409 return set_error();
5410
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005411 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005412 FROM_PROTOCOL_INFO,
5413 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 if (newfd == INVALID_SOCKET)
5415 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005416
Victor Stinnerdaf45552013-08-28 00:53:59 +02005417 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5418 closesocket(newfd);
5419 PyErr_SetFromWindowsErr(0);
5420 return NULL;
5421 }
5422#else
5423 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5424 newfd = _Py_dup(fd);
5425 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005426 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005427#endif
5428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 newfdobj = PyLong_FromSocket_t(newfd);
5430 if (newfdobj == NULL)
5431 SOCKETCLOSE(newfd);
5432 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005433}
5434
5435PyDoc_STRVAR(dup_doc,
5436"dup(integer) -> integer\n\
5437\n\
5438Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5439sockets; on some platforms os.dup() won't work for socket file descriptors.");
5440#endif
5441
5442
Dave Cole331708b2004-08-09 04:51:41 +00005443#ifdef HAVE_SOCKETPAIR
5444/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005445 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005446 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005447
5448/*ARGSUSED*/
5449static PyObject *
5450socket_socketpair(PyObject *self, PyObject *args)
5451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 PySocketSockObject *s0 = NULL, *s1 = NULL;
5453 SOCKET_T sv[2];
5454 int family, type = SOCK_STREAM, proto = 0;
5455 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005456#ifdef SOCK_CLOEXEC
5457 int *atomic_flag_works = &sock_cloexec_works;
5458#else
5459 int *atomic_flag_works = NULL;
5460#endif
5461 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005462
5463#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005465#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5469 &family, &type, &proto))
5470 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005473 Py_BEGIN_ALLOW_THREADS
5474#ifdef SOCK_CLOEXEC
5475 if (sock_cloexec_works != 0) {
5476 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5477 if (sock_cloexec_works == -1) {
5478 if (ret >= 0) {
5479 sock_cloexec_works = 1;
5480 }
5481 else if (errno == EINVAL) {
5482 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5483 sock_cloexec_works = 0;
5484 ret = socketpair(family, type, proto, sv);
5485 }
5486 }
5487 }
5488 else
5489#endif
5490 {
5491 ret = socketpair(family, type, proto, sv);
5492 }
5493 Py_END_ALLOW_THREADS
5494
5495 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005497
5498 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5499 goto finally;
5500 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5501 goto finally;
5502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 s0 = new_sockobject(sv[0], family, type, proto);
5504 if (s0 == NULL)
5505 goto finally;
5506 s1 = new_sockobject(sv[1], family, type, proto);
5507 if (s1 == NULL)
5508 goto finally;
5509 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005510
5511finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 if (res == NULL) {
5513 if (s0 == NULL)
5514 SOCKETCLOSE(sv[0]);
5515 if (s1 == NULL)
5516 SOCKETCLOSE(sv[1]);
5517 }
5518 Py_XDECREF(s0);
5519 Py_XDECREF(s1);
5520 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005521}
5522
5523PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005524"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005525\n\
5526Create a pair of socket objects from the sockets returned by the platform\n\
5527socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005528The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005529AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005530
5531#endif /* HAVE_SOCKETPAIR */
5532
5533
Guido van Rossum006bf911996-06-12 04:04:55 +00005534static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005535socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005536{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005537 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005538
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005539 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 return NULL;
5541 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005542 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005544 "ntohs: can't convert negative Python int to C "
5545 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 return NULL;
5547 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005548 if (x > 0xffff) {
5549 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5550 "ntohs: Python int too large to convert to C "
5551 "16-bit unsigned integer (The silent truncation "
5552 "is deprecated)",
5553 1)) {
5554 return NULL;
5555 }
5556 }
5557 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005558}
5559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005560PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005561"ntohs(integer) -> integer\n\
5562\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005563Convert a 16-bit unsigned integer from network to host byte order.\n\
5564Note that in case the received integer does not fit in 16-bit unsigned\n\
5565integer, but does fit in a positive C int, it is silently truncated to\n\
556616-bit unsigned integer.\n\
5567However, this silent truncation feature is deprecated, and will raise an \n\
5568exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005569
5570
Guido van Rossum006bf911996-06-12 04:04:55 +00005571static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005572socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 if (PyLong_Check(arg)) {
5577 x = PyLong_AsUnsignedLong(arg);
5578 if (x == (unsigned long) -1 && PyErr_Occurred())
5579 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005580#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 {
5582 unsigned long y;
5583 /* only want the trailing 32 bits */
5584 y = x & 0xFFFFFFFFUL;
5585 if (y ^ x)
5586 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005587 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 x = y;
5589 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 }
5592 else
5593 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005594 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005597}
5598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005599PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005600"ntohl(integer) -> integer\n\
5601\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005602Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005603
5604
Guido van Rossum006bf911996-06-12 04:04:55 +00005605static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005606socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005607{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005608 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005609
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005610 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 return NULL;
5612 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005613 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005615 "htons: can't convert negative Python int to C "
5616 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 return NULL;
5618 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005619 if (x > 0xffff) {
5620 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5621 "htons: Python int too large to convert to C "
5622 "16-bit unsigned integer (The silent truncation "
5623 "is deprecated)",
5624 1)) {
5625 return NULL;
5626 }
5627 }
5628 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005629}
5630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005631PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005632"htons(integer) -> integer\n\
5633\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005634Convert a 16-bit unsigned integer from host to network byte order.\n\
5635Note that in case the received integer does not fit in 16-bit unsigned\n\
5636integer, but does fit in a positive C int, it is silently truncated to\n\
563716-bit unsigned integer.\n\
5638However, this silent truncation feature is deprecated, and will raise an \n\
5639exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005640
5641
Guido van Rossum006bf911996-06-12 04:04:55 +00005642static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005643socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 if (PyLong_Check(arg)) {
5648 x = PyLong_AsUnsignedLong(arg);
5649 if (x == (unsigned long) -1 && PyErr_Occurred())
5650 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005651#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 {
5653 unsigned long y;
5654 /* only want the trailing 32 bits */
5655 y = x & 0xFFFFFFFFUL;
5656 if (y ^ x)
5657 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005658 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 x = y;
5660 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 }
5663 else
5664 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005665 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 Py_TYPE(arg)->tp_name);
5667 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005668}
5669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005670PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005671"htonl(integer) -> integer\n\
5672\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005673Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005674
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005675/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005676
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005677PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005678"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005679\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005680Convert 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 +00005681binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005682
5683static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005684socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005685{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005686#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005688#endif
5689
5690#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005691#if (SIZEOF_INT != 4)
5692#error "Not sure if in_addr_t exists and int is not 32-bits."
5693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 /* Have to use inet_addr() instead */
5695 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005696#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5700 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005701
Tim Peters1df9fdd2003-02-13 03:13:40 +00005702
5703#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005704
5705#ifdef USE_INET_ATON_WEAKLINK
5706 if (inet_aton != NULL) {
5707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 if (inet_aton(ip_addr, &buf))
5709 return PyBytes_FromStringAndSize((char *)(&buf),
5710 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005711
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005712 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 "illegal IP address string passed to inet_aton");
5714 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005715
Thomas Wouters477c8d52006-05-27 19:21:47 +00005716#ifdef USE_INET_ATON_WEAKLINK
5717 } else {
5718#endif
5719
5720#endif
5721
5722#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 /* special-case this address as inet_addr might return INADDR_NONE
5725 * for this */
5726 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005727 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005729
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005730 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005734 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 "illegal IP address string passed to inet_aton");
5736 return NULL;
5737 }
5738 }
5739 return PyBytes_FromStringAndSize((char *) &packed_addr,
5740 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005741
5742#ifdef USE_INET_ATON_WEAKLINK
5743 }
5744#endif
5745
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005746#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005747}
5748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005749PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005750"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005751\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005752Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005753
5754static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005755socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005756{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005757 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005759
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005760 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 return NULL;
5762 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005763
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005764 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005765 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005767 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 return NULL;
5769 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005770
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005771 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5772 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005773
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005774 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005776}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005777
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005778#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005779
5780PyDoc_STRVAR(inet_pton_doc,
5781"inet_pton(af, ip) -> packed IP address string\n\
5782\n\
5783Convert an IP address from string format to a packed string suitable\n\
5784for use with low-level network functions.");
5785
5786static PyObject *
5787socket_inet_pton(PyObject *self, PyObject *args)
5788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789 int af;
5790 char* ip;
5791 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005792#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005793 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005794#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5798 return NULL;
5799 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005800
Martin v. Löwis04697e82004-06-02 12:35:29 +00005801#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005803 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 "can't use AF_INET6, IPv6 is disabled");
5805 return NULL;
5806 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005807#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 retval = inet_pton(af, ip, packed);
5810 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005811 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 return NULL;
5813 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005814 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 "illegal IP address string passed to inet_pton");
5816 return NULL;
5817 } else if (af == AF_INET) {
5818 return PyBytes_FromStringAndSize(packed,
5819 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005820#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 } else if (af == AF_INET6) {
5822 return PyBytes_FromStringAndSize(packed,
5823 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005826 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 return NULL;
5828 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005829}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005830
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005831PyDoc_STRVAR(inet_ntop_doc,
5832"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5833\n\
5834Convert a packed IP address of the given family to string format.");
5835
5836static PyObject *
5837socket_inet_ntop(PyObject *self, PyObject *args)
5838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005840 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005842#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005843 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005844#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005846#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5849 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005850
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005851 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 return NULL;
5853 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005856 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 PyErr_SetString(PyExc_ValueError,
5858 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005859 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 return NULL;
5861 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005862#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005864 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 PyErr_SetString(PyExc_ValueError,
5866 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005867 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 return NULL;
5869 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 } else {
5872 PyErr_Format(PyExc_ValueError,
5873 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005874 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 return NULL;
5876 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005877
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005878 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5879 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005881 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 return NULL;
5883 } else {
5884 return PyUnicode_FromString(retval);
5885 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005886}
5887
5888#endif /* HAVE_INET_PTON */
5889
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005890/* Python interface to getaddrinfo(host, port). */
5891
5892/*ARGSUSED*/
5893static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005894socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005895{
Victor Stinner77af1722011-05-26 14:05:59 +02005896 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005897 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 struct addrinfo hints, *res;
5899 struct addrinfo *res0 = NULL;
5900 PyObject *hobj = NULL;
5901 PyObject *pobj = (PyObject *)NULL;
5902 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005903 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 int family, socktype, protocol, flags;
5905 int error;
5906 PyObject *all = (PyObject *)NULL;
5907 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005908
Georg Brandl6083a4b2013-10-14 06:51:46 +02005909 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005911 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005912 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 &protocol, &flags)) {
5914 return NULL;
5915 }
5916 if (hobj == Py_None) {
5917 hptr = NULL;
5918 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005919 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 if (!idna)
5921 return NULL;
5922 assert(PyBytes_Check(idna));
5923 hptr = PyBytes_AS_STRING(idna);
5924 } else if (PyBytes_Check(hobj)) {
5925 hptr = PyBytes_AsString(hobj);
5926 } else {
5927 PyErr_SetString(PyExc_TypeError,
5928 "getaddrinfo() argument 1 must be string or None");
5929 return NULL;
5930 }
5931 if (PyLong_CheckExact(pobj)) {
5932 long value = PyLong_AsLong(pobj);
5933 if (value == -1 && PyErr_Occurred())
5934 goto err;
5935 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5936 pptr = pbuf;
5937 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005938 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005939 if (pptr == NULL)
5940 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005942 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 } else if (pobj == Py_None) {
5944 pptr = (char *)NULL;
5945 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005946 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 goto err;
5948 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005949#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005950 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5951 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005952 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5953 * This workaround avoids a segfault in libsystem.
5954 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005955 pptr = "00";
5956 }
5957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 memset(&hints, 0, sizeof(hints));
5959 hints.ai_family = family;
5960 hints.ai_socktype = socktype;
5961 hints.ai_protocol = protocol;
5962 hints.ai_flags = flags;
5963 Py_BEGIN_ALLOW_THREADS
5964 ACQUIRE_GETADDRINFO_LOCK
5965 error = getaddrinfo(hptr, pptr, &hints, &res0);
5966 Py_END_ALLOW_THREADS
5967 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5968 if (error) {
5969 set_gaierror(error);
5970 goto err;
5971 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005972
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005973 all = PyList_New(0);
5974 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 goto err;
5976 for (res = res0; res; res = res->ai_next) {
5977 PyObject *single;
5978 PyObject *addr =
5979 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5980 if (addr == NULL)
5981 goto err;
5982 single = Py_BuildValue("iiisO", res->ai_family,
5983 res->ai_socktype, res->ai_protocol,
5984 res->ai_canonname ? res->ai_canonname : "",
5985 addr);
5986 Py_DECREF(addr);
5987 if (single == NULL)
5988 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 if (PyList_Append(all, single))
5991 goto err;
5992 Py_XDECREF(single);
5993 }
5994 Py_XDECREF(idna);
5995 if (res0)
5996 freeaddrinfo(res0);
5997 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005998 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 Py_XDECREF(all);
6000 Py_XDECREF(idna);
6001 if (res0)
6002 freeaddrinfo(res0);
6003 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006004}
6005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006006PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006007"getaddrinfo(host, port [, family, type, proto, flags])\n\
6008 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006009\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006010Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006011
6012/* Python interface to getnameinfo(sa, flags). */
6013
6014/*ARGSUSED*/
6015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006016socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 PyObject *sa = (PyObject *)NULL;
6019 int flags;
6020 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006021 int port;
6022 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6024 struct addrinfo hints, *res = NULL;
6025 int error;
6026 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006027 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 flags = flowinfo = scope_id = 0;
6030 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6031 return NULL;
6032 if (!PyTuple_Check(sa)) {
6033 PyErr_SetString(PyExc_TypeError,
6034 "getnameinfo() argument 1 must be a tuple");
6035 return NULL;
6036 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006037 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006039 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006041 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006042 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006043 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006044 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006045 return NULL;
6046 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6048 memset(&hints, 0, sizeof(hints));
6049 hints.ai_family = AF_UNSPEC;
6050 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006051 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 Py_BEGIN_ALLOW_THREADS
6053 ACQUIRE_GETADDRINFO_LOCK
6054 error = getaddrinfo(hostp, pbuf, &hints, &res);
6055 Py_END_ALLOW_THREADS
6056 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6057 if (error) {
6058 set_gaierror(error);
6059 goto fail;
6060 }
6061 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006062 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 "sockaddr resolved to multiple addresses");
6064 goto fail;
6065 }
6066 switch (res->ai_family) {
6067 case AF_INET:
6068 {
6069 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006070 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 "IPv4 sockaddr must be 2 tuple");
6072 goto fail;
6073 }
6074 break;
6075 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006076#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 case AF_INET6:
6078 {
6079 struct sockaddr_in6 *sin6;
6080 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006081 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 sin6->sin6_scope_id = scope_id;
6083 break;
6084 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006087 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6089 if (error) {
6090 set_gaierror(error);
6091 goto fail;
6092 }
Victor Stinner72400302016-01-28 15:41:01 +01006093
6094 name = sock_decode_hostname(hbuf);
6095 if (name == NULL)
6096 goto fail;
6097 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006098
6099fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 if (res)
6101 freeaddrinfo(res);
6102 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006103}
6104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006105PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006106"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006107\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006108Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006109
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006110
6111/* Python API to getting and setting the default timeout value. */
6112
6113static PyObject *
6114socket_getdefaulttimeout(PyObject *self)
6115{
Victor Stinner71694d52015-03-28 01:18:54 +01006116 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006117 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 }
Victor Stinner71694d52015-03-28 01:18:54 +01006119 else {
6120 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6121 return PyFloat_FromDouble(seconds);
6122 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006123}
6124
6125PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006126"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006127\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006128Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006129A value of None indicates that new socket objects have no timeout.\n\
6130When the socket module is first imported, the default is None.");
6131
6132static PyObject *
6133socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6134{
Victor Stinner71694d52015-03-28 01:18:54 +01006135 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006136
Victor Stinner71694d52015-03-28 01:18:54 +01006137 if (socket_parse_timeout(&timeout, arg) < 0)
6138 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006141
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006142 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006143}
6144
6145PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006146"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006147\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006148Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006149A value of None indicates that new socket objects have no timeout.\n\
6150When the socket module is first imported, the default is None.");
6151
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006152#ifdef HAVE_IF_NAMEINDEX
6153/* Python API for getting interface indices and names */
6154
6155static PyObject *
6156socket_if_nameindex(PyObject *self, PyObject *arg)
6157{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006158 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006159 int i;
6160 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006161
Charles-François Natali60713592011-05-20 16:55:06 +02006162 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006163 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006164 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006165 return NULL;
6166 }
6167
6168 list = PyList_New(0);
6169 if (list == NULL) {
6170 if_freenameindex(ni);
6171 return NULL;
6172 }
6173
Charles-François Natali60713592011-05-20 16:55:06 +02006174 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6175 PyObject *ni_tuple = Py_BuildValue("IO&",
6176 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006177
6178 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6179 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006180 Py_DECREF(list);
6181 if_freenameindex(ni);
6182 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006183 }
6184 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006185 }
6186
6187 if_freenameindex(ni);
6188 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006189}
6190
6191PyDoc_STRVAR(if_nameindex_doc,
6192"if_nameindex()\n\
6193\n\
6194Returns a list of network interface information (index, name) tuples.");
6195
Charles-François Natali60713592011-05-20 16:55:06 +02006196static PyObject *
6197socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006198{
Charles-François Natali60713592011-05-20 16:55:06 +02006199 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006200 unsigned long index;
6201
Charles-François Natali60713592011-05-20 16:55:06 +02006202 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6203 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006204 return NULL;
6205
Charles-François Natali60713592011-05-20 16:55:06 +02006206 index = if_nametoindex(PyBytes_AS_STRING(oname));
6207 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006208 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006209 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006210 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006211 return NULL;
6212 }
6213
6214 return PyLong_FromUnsignedLong(index);
6215}
6216
6217PyDoc_STRVAR(if_nametoindex_doc,
6218"if_nametoindex(if_name)\n\
6219\n\
6220Returns the interface index corresponding to the interface name if_name.");
6221
Charles-François Natali60713592011-05-20 16:55:06 +02006222static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006223socket_if_indextoname(PyObject *self, PyObject *arg)
6224{
Charles-François Natali60713592011-05-20 16:55:06 +02006225 unsigned long index;
6226 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006227
Charles-François Natali60713592011-05-20 16:55:06 +02006228 index = PyLong_AsUnsignedLong(arg);
6229 if (index == (unsigned long) -1)
6230 return NULL;
6231
6232 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006233 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006234 return NULL;
6235 }
6236
Charles-François Natali60713592011-05-20 16:55:06 +02006237 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006238}
6239
6240PyDoc_STRVAR(if_indextoname_doc,
6241"if_indextoname(if_index)\n\
6242\n\
6243Returns the interface name corresponding to the interface index if_index.");
6244
6245#endif /* HAVE_IF_NAMEINDEX */
6246
6247
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006248#ifdef CMSG_LEN
6249/* Python interface to CMSG_LEN(length). */
6250
6251static PyObject *
6252socket_CMSG_LEN(PyObject *self, PyObject *args)
6253{
6254 Py_ssize_t length;
6255 size_t result;
6256
6257 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6258 return NULL;
6259 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6260 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6261 return NULL;
6262 }
6263 return PyLong_FromSize_t(result);
6264}
6265
6266PyDoc_STRVAR(CMSG_LEN_doc,
6267"CMSG_LEN(length) -> control message length\n\
6268\n\
6269Return the total length, without trailing padding, of an ancillary\n\
6270data item with associated data of the given length. This value can\n\
6271often be used as the buffer size for recvmsg() to receive a single\n\
6272item of ancillary data, but RFC 3542 requires portable applications to\n\
6273use CMSG_SPACE() and thus include space for padding, even when the\n\
6274item will be the last in the buffer. Raises OverflowError if length\n\
6275is outside the permissible range of values.");
6276
6277
6278#ifdef CMSG_SPACE
6279/* Python interface to CMSG_SPACE(length). */
6280
6281static PyObject *
6282socket_CMSG_SPACE(PyObject *self, PyObject *args)
6283{
6284 Py_ssize_t length;
6285 size_t result;
6286
6287 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6288 return NULL;
6289 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6290 PyErr_SetString(PyExc_OverflowError,
6291 "CMSG_SPACE() argument out of range");
6292 return NULL;
6293 }
6294 return PyLong_FromSize_t(result);
6295}
6296
6297PyDoc_STRVAR(CMSG_SPACE_doc,
6298"CMSG_SPACE(length) -> buffer size\n\
6299\n\
6300Return the buffer size needed for recvmsg() to receive an ancillary\n\
6301data item with associated data of the given length, along with any\n\
6302trailing padding. The buffer space needed to receive multiple items\n\
6303is the sum of the CMSG_SPACE() values for their associated data\n\
6304lengths. Raises OverflowError if length is outside the permissible\n\
6305range of values.");
6306#endif /* CMSG_SPACE */
6307#endif /* CMSG_LEN */
6308
6309
Guido van Rossum30a685f1991-06-27 15:51:29 +00006310/* List of functions exported by this module. */
6311
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006312static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 {"gethostbyname", socket_gethostbyname,
6314 METH_VARARGS, gethostbyname_doc},
6315 {"gethostbyname_ex", socket_gethostbyname_ex,
6316 METH_VARARGS, ghbn_ex_doc},
6317 {"gethostbyaddr", socket_gethostbyaddr,
6318 METH_VARARGS, gethostbyaddr_doc},
6319 {"gethostname", socket_gethostname,
6320 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006321#ifdef HAVE_SETHOSTNAME
6322 {"sethostname", socket_sethostname,
6323 METH_VARARGS, sethostname_doc},
6324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 {"getservbyname", socket_getservbyname,
6326 METH_VARARGS, getservbyname_doc},
6327 {"getservbyport", socket_getservbyport,
6328 METH_VARARGS, getservbyport_doc},
6329 {"getprotobyname", socket_getprotobyname,
6330 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006331#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 {"dup", socket_dup,
6333 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006334#endif
Dave Cole331708b2004-08-09 04:51:41 +00006335#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 {"socketpair", socket_socketpair,
6337 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 {"ntohs", socket_ntohs,
6340 METH_VARARGS, ntohs_doc},
6341 {"ntohl", socket_ntohl,
6342 METH_O, ntohl_doc},
6343 {"htons", socket_htons,
6344 METH_VARARGS, htons_doc},
6345 {"htonl", socket_htonl,
6346 METH_O, htonl_doc},
6347 {"inet_aton", socket_inet_aton,
6348 METH_VARARGS, inet_aton_doc},
6349 {"inet_ntoa", socket_inet_ntoa,
6350 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006351#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 {"inet_pton", socket_inet_pton,
6353 METH_VARARGS, inet_pton_doc},
6354 {"inet_ntop", socket_inet_ntop,
6355 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006356#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006357 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6358 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 {"getnameinfo", socket_getnameinfo,
6360 METH_VARARGS, getnameinfo_doc},
6361 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6362 METH_NOARGS, getdefaulttimeout_doc},
6363 {"setdefaulttimeout", socket_setdefaulttimeout,
6364 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006365#ifdef HAVE_IF_NAMEINDEX
6366 {"if_nameindex", socket_if_nameindex,
6367 METH_NOARGS, if_nameindex_doc},
6368 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006369 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006370 {"if_indextoname", socket_if_indextoname,
6371 METH_O, if_indextoname_doc},
6372#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006373#ifdef CMSG_LEN
6374 {"CMSG_LEN", socket_CMSG_LEN,
6375 METH_VARARGS, CMSG_LEN_doc},
6376#ifdef CMSG_SPACE
6377 {"CMSG_SPACE", socket_CMSG_SPACE,
6378 METH_VARARGS, CMSG_SPACE_doc},
6379#endif
6380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006382};
6383
Guido van Rossum30a685f1991-06-27 15:51:29 +00006384
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006385#ifdef MS_WINDOWS
6386#define OS_INIT_DEFINED
6387
6388/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006389
6390static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006391os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006394}
6395
6396static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006397os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 WSADATA WSAData;
6400 int ret;
6401 ret = WSAStartup(0x0101, &WSAData);
6402 switch (ret) {
6403 case 0: /* No error */
6404 Py_AtExit(os_cleanup);
6405 return 1; /* Success */
6406 case WSASYSNOTREADY:
6407 PyErr_SetString(PyExc_ImportError,
6408 "WSAStartup failed: network not ready");
6409 break;
6410 case WSAVERNOTSUPPORTED:
6411 case WSAEINVAL:
6412 PyErr_SetString(
6413 PyExc_ImportError,
6414 "WSAStartup failed: requested version not supported");
6415 break;
6416 default:
6417 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6418 break;
6419 }
6420 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006421}
6422
Guido van Rossum8d665e61996-06-26 18:22:49 +00006423#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006424
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006425
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006426
6427#ifndef OS_INIT_DEFINED
6428static int
6429os_init(void)
6430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006432}
6433#endif
6434
6435
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006436/* C API table - always add new things to the end for binary
6437 compatibility. */
6438static
6439PySocketModule_APIObject PySocketModuleAPI =
6440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006442 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006444};
6445
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006447/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006448
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006449 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006450 "socket.py" which implements some additional functionality.
6451 The import of "_socket" may fail with an ImportError exception if
6452 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006453 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006454 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006455*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006456
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006457PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006458"Implementation module for socket operations.\n\
6459\n\
6460See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006461
Martin v. Löwis1a214512008-06-11 05:26:20 +00006462static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 PyModuleDef_HEAD_INIT,
6464 PySocket_MODULE_NAME,
6465 socket_doc,
6466 -1,
6467 socket_methods,
6468 NULL,
6469 NULL,
6470 NULL,
6471 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006472};
6473
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006474PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006475PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 if (!os_init())
6480 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006481
Victor Stinnerdaf45552013-08-28 00:53:59 +02006482#ifdef MS_WINDOWS
6483 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006484#if defined(_MSC_VER) && _MSC_VER >= 1800
6485 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6486#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006487 DWORD version = GetVersion();
6488 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6489 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6490 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006491 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6492#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006493 }
6494#endif
6495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 Py_TYPE(&sock_type) = &PyType_Type;
6497 m = PyModule_Create(&socketmodule);
6498 if (m == NULL)
6499 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006500
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006501 Py_INCREF(PyExc_OSError);
6502 PySocketModuleAPI.error = PyExc_OSError;
6503 Py_INCREF(PyExc_OSError);
6504 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006506 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 if (socket_herror == NULL)
6508 return NULL;
6509 Py_INCREF(socket_herror);
6510 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006511 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 NULL);
6513 if (socket_gaierror == NULL)
6514 return NULL;
6515 Py_INCREF(socket_gaierror);
6516 PyModule_AddObject(m, "gaierror", socket_gaierror);
6517 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006518 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519 if (socket_timeout == NULL)
6520 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006521 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522 Py_INCREF(socket_timeout);
6523 PyModule_AddObject(m, "timeout", socket_timeout);
6524 Py_INCREF((PyObject *)&sock_type);
6525 if (PyModule_AddObject(m, "SocketType",
6526 (PyObject *)&sock_type) != 0)
6527 return NULL;
6528 Py_INCREF((PyObject *)&sock_type);
6529 if (PyModule_AddObject(m, "socket",
6530 (PyObject *)&sock_type) != 0)
6531 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006532
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006533#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 Py_INCREF(has_ipv6);
6539 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 /* Export C API */
6542 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6543 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6544 ) != 0)
6545 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006548#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006550#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006551 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006552#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006554#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006555#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006557 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006558#endif
6559#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006561#endif
6562#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006565#endif
6566#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006569#endif
6570#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006573#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006574#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006577#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006578#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006581#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006582#ifdef HAVE_SOCKADDR_ALG
6583 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6584#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006585#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006588#endif
6589#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006591#endif
6592#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006595#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006596#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006598 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006599#endif
6600#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006603#endif
6604#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006607#endif
6608#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006611#endif
6612#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, AF_NETLINK);
6615 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006616#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006618#endif
6619#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006621#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6623 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006624#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006626#endif
6627#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006629#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006630#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006632#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006633#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006635#endif
6636#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006638#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006640#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006642#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006643#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006645#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006646#ifdef NETLINK_CRYPTO
6647 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6648#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006649#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006650#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006653#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006654#ifdef AF_LINK
6655 PyModule_AddIntMacro(m, AF_LINK);
6656#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006657#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006660#endif
6661#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006664#endif
6665#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006668#endif
6669#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006672#endif
6673#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006676#endif
6677#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006680#endif
6681#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006684#endif
6685#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006688#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006689
Hye-Shik Chang81268602004-02-02 06:05:24 +00006690#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6692 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6693 PyModule_AddIntMacro(m, BTPROTO_HCI);
6694 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006695#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006697#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006698#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006699#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006701#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6703 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006704#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6707 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006708#endif
6709
Charles-François Natali47413c12011-10-06 19:47:44 +02006710#ifdef AF_CAN
6711 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006713#endif
6714#ifdef PF_CAN
6715 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006717#endif
6718
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006719/* Reliable Datagram Sockets */
6720#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006722#endif
6723#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006725#endif
6726
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006727/* Kernel event messages */
6728#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006730#endif
6731#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006733#endif
6734
Antoine Pitroub156a462010-10-27 20:13:57 +00006735#ifdef AF_PACKET
6736 PyModule_AddIntMacro(m, AF_PACKET);
6737#endif
6738#ifdef PF_PACKET
6739 PyModule_AddIntMacro(m, PF_PACKET);
6740#endif
6741#ifdef PACKET_HOST
6742 PyModule_AddIntMacro(m, PACKET_HOST);
6743#endif
6744#ifdef PACKET_BROADCAST
6745 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6746#endif
6747#ifdef PACKET_MULTICAST
6748 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6749#endif
6750#ifdef PACKET_OTHERHOST
6751 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6752#endif
6753#ifdef PACKET_OUTGOING
6754 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6755#endif
6756#ifdef PACKET_LOOPBACK
6757 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6758#endif
6759#ifdef PACKET_FASTROUTE
6760 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006761#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006762
Christian Heimes043d6f62008-01-07 17:19:16 +00006763#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6768 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6769 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006770
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6772 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6773 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, SOL_TIPC);
6777 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6778 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6779 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6780 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006781
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6783 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6784 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6785 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6789 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006790#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006793#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6795 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6796 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6797 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6798 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6799 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006800#endif
6801
Christian Heimesdffa3942016-09-05 23:54:41 +02006802#ifdef HAVE_SOCKADDR_ALG
6803 /* Socket options */
6804 PyModule_AddIntMacro(m, ALG_SET_KEY);
6805 PyModule_AddIntMacro(m, ALG_SET_IV);
6806 PyModule_AddIntMacro(m, ALG_SET_OP);
6807 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6808 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6809 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6810
6811 /* Operations */
6812 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6813 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6814 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6815 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6816#endif
6817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, SOCK_STREAM);
6820 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006821/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006822#ifdef SOCK_RAW
6823 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006825#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006827#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006829#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006830#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006832#endif
6833#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006835#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006845#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006846#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006848#endif
6849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006867#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006868#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006871#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006879#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006899#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006900#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006902#endif
6903#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006905#endif
6906#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006908#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006909#ifdef SO_PASSSEC
6910 PyModule_AddIntMacro(m, SO_PASSSEC);
6911#endif
6912#ifdef SO_PEERSEC
6913 PyModule_AddIntMacro(m, SO_PEERSEC);
6914#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006915#ifdef SO_BINDTODEVICE
6916 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6917#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006918#ifdef SO_PRIORITY
6919 PyModule_AddIntMacro(m, SO_PRIORITY);
6920#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006921#ifdef SO_MARK
6922 PyModule_AddIntMacro(m, SO_MARK);
6923#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006924#ifdef SO_DOMAIN
6925 PyModule_AddIntMacro(m, SO_DOMAIN);
6926#endif
6927#ifdef SO_PROTOCOL
6928 PyModule_AddIntMacro(m, SO_PROTOCOL);
6929#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931 /* Maximum number of connections for "listen" */
6932#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
6937
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006938 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006939#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006941#endif
6942#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006944#endif
6945#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006947#endif
6948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949 /* Flags for send, recv */
6950#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006979#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006982#endif
6983#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006985#endif
6986#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006988#endif
6989#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006991#endif
6992#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006994#endif
6995#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006997#endif
6998#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007000#endif
7001#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007003#endif
7004#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007006#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007007#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007009#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 /* Protocol level and numbers, usable for [gs]etsockopt */
7012#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007017#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007020#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007023#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007026#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007037#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007042#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007044#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007045#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007047#endif
7048#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7050 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007051#endif
7052#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7054 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7055 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007056
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7058 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7059 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007060#ifdef CAN_ISOTP
7061 PyModule_AddIntMacro(m, CAN_ISOTP);
7062#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007063#endif
7064#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7066 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7067 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7068 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007069#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007070#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7071 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7072#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007073#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007075 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7076 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7077 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7078 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7079 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7080 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7081 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7082 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7083 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7084 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7085 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7086 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7087#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007088#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007090#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007091#ifdef HAVE_SOCKADDR_ALG
7092 PyModule_AddIntMacro(m, SOL_ALG);
7093#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007094#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007096#endif
7097#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007099#endif
7100#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007102#endif
7103#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007105#endif
7106#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007108#endif
7109#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007122#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007128#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007134#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007140#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007142#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007212#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007213#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007218#endif
7219/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007222#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
7228
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007229#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007231#endif
7232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* Some port configuration */
7234#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007243#endif
7244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245 /* Some reserved IP v.4 addresses */
7246#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007248#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007253#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007263#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef INADDR_ALLHOSTS_GROUP
7267 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7268 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007269#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007274#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007277#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007279#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007281#endif
7282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 /* IPv4 [gs]etsockopt options */
7284#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007331#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007332#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007333 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007334#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7337#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007356#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007360#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007362#endif
7363#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007365#endif
7366#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007368#endif
7369#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007371#endif
7372#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007374#endif
7375#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007377#endif
7378#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007380#endif
7381#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007383#endif
7384#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007386#endif
7387#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007389#endif
7390#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007392#endif
7393#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007395#endif
7396#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007398#endif
7399#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007401#endif
7402#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007404#endif
7405#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007407#endif
7408#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007410#endif
7411#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007413#endif
7414#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007416#endif
7417#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007419#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421 /* TCP options */
7422#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007435 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007446#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007457#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007458#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007460#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007461#ifdef TCP_CONGESTION
7462 PyModule_AddIntMacro(m, TCP_CONGESTION);
7463#endif
7464#ifdef TCP_USER_TIMEOUT
7465 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7466#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007467#ifdef TCP_NOTSENT_LOWAT
7468 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7469#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471 /* IPX options */
7472#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007474#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007475
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007476/* Reliable Datagram Sockets */
7477#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007479#endif
7480#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007482#endif
7483#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007485#endif
7486#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007488#endif
7489#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007491#endif
7492#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007494#endif
7495#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007497#endif
7498#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007500#endif
7501#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007503#endif
7504#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007506#endif
7507#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007509#endif
7510#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007512#endif
7513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007515#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007517#endif
7518#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007520#endif
7521#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007523#endif
7524#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007526#endif
7527#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007529#endif
7530#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007532#endif
7533#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007535#endif
7536#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007538#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007539#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007541#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007542#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007544#endif
7545#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007547#endif
7548#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007550#endif
7551#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007553#endif
7554#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007556#endif
7557#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007558 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007559#endif
7560#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007562#endif
7563#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007565#endif
7566#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007568#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007569#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007571#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007572#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007574#endif
7575#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007577#endif
7578#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007580#endif
7581#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007583#endif
7584#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007586#endif
7587#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007589#endif
7590#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007592#endif
7593#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007595#endif
7596#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007598#endif
7599#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007613#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007615#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007617#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007619#endif
7620#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007622#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007623 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007626#endif
7627#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007629#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007630 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007631#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007632 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007633#endif
7634
Christian Heimesfaf2f632008-01-06 16:59:19 +00007635#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007637 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7638#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007639 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007640#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007641 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007642 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7643#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007644 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007645#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007646 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007648 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007649 PyObject *tmp;
7650 tmp = PyLong_FromUnsignedLong(codes[i]);
7651 if (tmp == NULL)
7652 return NULL;
7653 PyModule_AddObject(m, names[i], tmp);
7654 }
7655 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, RCVALL_OFF);
7657 PyModule_AddIntMacro(m, RCVALL_ON);
7658 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007659#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007661#endif
7662#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007664#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007665#endif /* _MSTCPIP_ */
7666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007668#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007672}