blob: 37626e67cb0b60135ff49b90fad15b2a0676b6b7 [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
Benjamin Peterson06930632017-09-04 16:36:05 -0700271/* Solaris fails to define this variable at all. */
272#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000273#define INET_ADDRSTRLEN 16
274#endif
275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000278#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700281#ifdef HAVE_SYS_SOCKET_H
282#include <sys/socket.h>
283#endif
284
285#ifdef HAVE_NET_IF_H
286#include <net/if.h>
287#endif
288
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000289/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000291#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
293/* Addressing includes */
294
Guido van Rossum6f489d91996-06-28 20:15:15 +0000295#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296
297/* Non-MS WINDOWS includes */
298# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000299# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000300
Guido van Rossum9376b741999-09-15 22:01:40 +0000301/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000303
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000305
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000306#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000307
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000308/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309# ifdef HAVE_FCNTL_H
310# include <fcntl.h>
311# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000312
Steve Dower65e4cb12014-11-22 12:54:57 -0800313#if defined(_MSC_VER) && _MSC_VER >= 1800
314/* Provides the IsWindows7SP1OrGreater() function */
315#include <VersionHelpers.h>
316#endif
317
Jeremy Hylton22308652001-02-02 03:23:09 +0000318#endif
319
Skip Montanaro7befb992004-02-10 16:50:21 +0000320#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000321
Neal Norwitz39d22e52002-11-02 19:55:21 +0000322#ifndef O_NONBLOCK
323# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000324#endif
325
Trent Micka708d6e2004-09-07 17:48:26 +0000326/* include Python's addrinfo.h unless it causes trouble */
327#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
328 /* Do not include addinfo.h on some newer IRIX versions.
329 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
330 * for example, but not by 6.5.10.
331 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000333 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
334 * EAI_* constants are defined in (the already included) ws2tcpip.h.
335 */
336#else
337# include "addrinfo.h"
338#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000339
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#ifdef __APPLE__
341/* On OS X, getaddrinfo returns no error indication of lookup
342 failure, so we must use the emulation instead of the libinfo
343 implementation. Unfortunately, performing an autoconf test
344 for this bug would require DNS access for the machine performing
345 the configuration, which is not acceptable. Therefore, we
346 determine the bug just by checking for __APPLE__. If this bug
347 gets ever fixed, perhaps checking for sys/version.h would be
348 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000349#ifndef HAVE_GETNAMEINFO
350/* This bug seems to be fixed in Jaguar. Ths easiest way I could
351 Find to check for Jaguar is that it has getnameinfo(), which
352 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000353#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355
356#ifdef HAVE_INET_ATON
357#define USE_INET_ATON_WEAKLINK
358#endif
359
Jack Jansen84262fb2002-07-02 14:40:42 +0000360#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000362/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000364/* avoid clashes with the C library definition of the symbol. */
365#define getaddrinfo fake_getaddrinfo
366#define gai_strerror fake_gai_strerror
367#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000368#include "getaddrinfo.c"
369#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000370#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000371#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000372#include "getnameinfo.c"
373#endif
374
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000375#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000376#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000377#endif
378
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000379#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000380#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000381#define EAFNOSUPPORT WSAEAFNOSUPPORT
382#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000383#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000384
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000385#ifndef SOCKETCLOSE
386#define SOCKETCLOSE close
387#endif
388
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#define USE_BLUETOOTH 1
391#if defined(__FreeBSD__)
392#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
393#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000394#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000395#define SOL_HCI SOL_HCI_RAW
396#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000397#define sockaddr_l2 sockaddr_l2cap
398#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000399#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000400#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
401#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000402#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000403#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000404#define sockaddr_l2 sockaddr_bt
405#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000408#define SOL_HCI BTPROTO_HCI
409#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000410#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
411#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000412#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000413#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000414#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000415#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
416#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000417#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000418#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
419#endif
420#endif
421
Charles-François Natali8b759652011-12-23 16:44:51 +0100422/* Convert "sock_addr_t *" to "struct sockaddr *". */
423#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000424
Martin v. Löwise9416172003-05-03 10:12:45 +0000425/*
426 * Constants for getnameinfo()
427 */
428#if !defined(NI_MAXHOST)
429#define NI_MAXHOST 1025
430#endif
431#if !defined(NI_MAXSERV)
432#define NI_MAXSERV 32
433#endif
434
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000435#ifndef INVALID_SOCKET /* MS defines this */
436#define INVALID_SOCKET (-1)
437#endif
438
Charles-François Natali0cc86852013-09-13 19:53:08 +0200439#ifndef INADDR_NONE
440#define INADDR_NONE (-1)
441#endif
442
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000443/* XXX There's a problem here: *static* functions are not supposed to have
444 a Py prefix (or use CapitalizedWords). Later... */
445
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446/* Global variable holding the exception type for errors detected
447 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000448static PyObject *socket_herror;
449static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000450static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000451
Tim Peters643a7fc2002-02-17 04:13:21 +0000452/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000453 The sock_type variable contains pointers to various functions,
454 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000455 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000456static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000457
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458#if defined(HAVE_POLL_H)
459#include <poll.h>
460#elif defined(HAVE_SYS_POLL_H)
461#include <sys/poll.h>
462#endif
463
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000464/* Largest value to try to store in a socklen_t (used when handling
465 ancillary data). POSIX requires socklen_t to hold at least
466 (2**31)-1 and recommends against storing larger values, but
467 socklen_t was originally int in the BSD interface, so to be on the
468 safe side we use the smaller of (2**31)-1 and INT_MAX. */
469#if INT_MAX > 0x7fffffff
470#define SOCKLEN_T_LIMIT 0x7fffffff
471#else
472#define SOCKLEN_T_LIMIT INT_MAX
473#endif
474
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200475#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000476/* Instead of select(), we'll use poll() since poll() works on any fd. */
477#define IS_SELECTABLE(s) 1
478/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000479#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200480/* If there's no timeout left, we don't have to call select, so it's a safe,
481 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100482#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000483#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000484
485static PyObject*
486select_error(void)
487{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200488 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000490}
491
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000492#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000493#ifndef WSAEAGAIN
494#define WSAEAGAIN WSAEWOULDBLOCK
495#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000496#define CHECK_ERRNO(expected) \
497 (WSAGetLastError() == WSA ## expected)
498#else
499#define CHECK_ERRNO(expected) \
500 (errno == expected)
501#endif
502
Victor Stinnerdaf45552013-08-28 00:53:59 +0200503#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200504# define GET_SOCK_ERROR WSAGetLastError()
505# define SET_SOCK_ERROR(err) WSASetLastError(err)
506# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
507# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300508# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200509#else
510# define GET_SOCK_ERROR errno
511# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
512# define SOCK_TIMEOUT_ERR EWOULDBLOCK
513# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300514# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200515#endif
516
517
518#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200519/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
520static int support_wsa_no_inherit = -1;
521#endif
522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523/* Convenience function to raise an error according to errno
524 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000525
Guido van Rossum73624e91994-10-10 17:59:00 +0000526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000527set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000529#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 int err_no = WSAGetLastError();
531 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
532 recognizes the error codes used by both GetLastError() and
533 WSAGetLastError */
534 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200535 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000536#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000537
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200538 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539}
540
Guido van Rossum30a685f1991-06-27 15:51:29 +0000541
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000543set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546
547#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 if (v != NULL) {
553 PyErr_SetObject(socket_herror, v);
554 Py_DECREF(v);
555 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558}
559
560
561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000562set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565
Martin v. Löwis272cb402002-03-01 08:31:07 +0000566#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 /* EAI_SYSTEM is not available on Windows XP. */
568 if (error == EAI_SYSTEM)
569 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000570#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000572#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 if (v != NULL) {
578 PyErr_SetObject(socket_gaierror, v);
579 Py_DECREF(v);
580 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583}
584
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000585/* Function to perform the setting of socket blocking mode
586 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587static int
588internal_setblocking(PySocketSockObject *s, int block)
589{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400590 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200591#ifdef MS_WINDOWS
592 u_long arg;
593#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100594#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100595 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100596 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000598#ifdef SOCK_NONBLOCK
599 if (block)
600 s->sock_type &= (~SOCK_NONBLOCK);
601 else
602 s->sock_type |= SOCK_NONBLOCK;
603#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100607#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200609 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400610 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200613 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400614 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100616 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 else
Victor Stinner9a954832013-12-04 00:41:24 +0100618 new_delay_flag = delay_flag | O_NONBLOCK;
619 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200620 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400621 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100622#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200624 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200625 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400626 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400628
629 result = 0;
630
631 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000632 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Yury Selivanovfa22b292016-10-18 16:03:52 -0400635 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200636#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400637 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200638#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400639 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200640#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400641 }
642
643 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644}
645
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000646static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200647internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
648 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100651#ifdef HAVE_POLL
652 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200653 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100654#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200655 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200656 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100657#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000658
Victor Stinnerb7df3142015-03-27 22:59:32 +0100659#ifdef WITH_THREAD
660 /* must be called with the GIL held */
661 assert(PyGILState_Check());
662#endif
663
Victor Stinner416f2e62015-03-31 13:56:29 +0200664 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200665 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200668 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 /* Prefer poll, if available, since you can poll() any fd
672 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100674 pollfd.fd = s->sock_fd;
675 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200676 if (connect) {
677 /* On Windows, the socket becomes writable on connection success,
678 but a connection failure is notified as an error. On POSIX, the
679 socket becomes writable on connection success or on connection
680 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200681 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200682 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Victor Stinner71694d52015-03-28 01:18:54 +0100684 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200685 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200686 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000687
Victor Stinner71694d52015-03-28 01:18:54 +0100688 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200689 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100690 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000691#else
Victor Stinnerced11742015-04-09 10:27:25 +0200692 if (interval >= 0) {
693 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
694 tvp = &tv;
695 }
696 else
697 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698
Victor Stinner71694d52015-03-28 01:18:54 +0100699 FD_ZERO(&fds);
700 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200701 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200702 if (connect) {
703 /* On Windows, the socket becomes writable on connection success,
704 but a connection failure is notified as an error. On POSIX, the
705 socket becomes writable on connection success or on connection
706 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200707 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200708 }
Victor Stinner71694d52015-03-28 01:18:54 +0100709
710 /* See if the socket is ready */
711 Py_BEGIN_ALLOW_THREADS;
712 if (writing)
713 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200714 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100715 else
716 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200717 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100718 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000719#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 if (n < 0)
722 return -1;
723 if (n == 0)
724 return 1;
725 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000726}
727
Victor Stinner31bf2d52015-04-01 21:57:09 +0200728/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000729
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 On error, raise an exception and return -1 if err is set, or fill err and
731 return -1 otherwise. If a signal was received and the signal handler raised
732 an exception, return -1, and set err to -1 if err is set.
733
734 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100735
Victor Stinner31bf2d52015-04-01 21:57:09 +0200736 If the socket has a timeout, wait until the socket is ready before calling
737 the function: wait until the socket is writable if writing is nonzero, wait
738 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100739
Victor Stinner81c41db2015-04-02 11:50:57 +0200740 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200741 the function, except if the signal handler raised an exception (PEP 475).
742
743 When the function is retried, recompute the timeout using a monotonic clock.
744
Victor Stinner81c41db2015-04-02 11:50:57 +0200745 sock_call_ex() must be called with the GIL held. The socket function is
746 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200748sock_call_ex(PySocketSockObject *s,
749 int writing,
750 int (*sock_func) (PySocketSockObject *s, void *data),
751 void *data,
752 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200753 int *err,
754 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200755{
Victor Stinner8912d142015-04-06 23:16:34 +0200756 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757 _PyTime_t deadline = 0;
758 int deadline_initialized = 0;
759 int res;
760
Victor Stinner92f01132015-10-11 09:54:42 +0200761#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200762 /* sock_call() must be called with the GIL held. */
763 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200764#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200765
766 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200767 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200768 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 /* For connect(), poll even for blocking socket. The connection
770 runs asynchronously. */
771 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200772 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200773 _PyTime_t interval;
774
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 if (deadline_initialized) {
776 /* recompute the timeout */
777 interval = deadline - _PyTime_GetMonotonicClock();
778 }
779 else {
780 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200781 deadline = _PyTime_GetMonotonicClock() + timeout;
782 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200783 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784
Victor Stinner10550cd2015-04-03 13:22:27 +0200785 if (interval >= 0)
786 res = internal_select(s, writing, interval, connect);
787 else
788 res = 1;
789 }
790 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200791 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200792 }
793
Victor Stinner31bf2d52015-04-01 21:57:09 +0200794 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 if (err)
796 *err = GET_SOCK_ERROR;
797
Victor Stinner31bf2d52015-04-01 21:57:09 +0200798 if (CHECK_ERRNO(EINTR)) {
799 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 if (PyErr_CheckSignals()) {
801 if (err)
802 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200804 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805
806 /* retry select() */
807 continue;
808 }
809
810 /* select() failed */
811 s->errorhandler();
812 return -1;
813 }
814
815 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 if (err)
817 *err = SOCK_TIMEOUT_ERR;
818 else
819 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820 return -1;
821 }
822
823 /* the socket is ready */
824 }
825
Victor Stinner81c41db2015-04-02 11:50:57 +0200826 /* inner loop to retry sock_func() when sock_func() is interrupted
827 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828 while (1) {
829 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200830 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 Py_END_ALLOW_THREADS
832
833 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200834 /* sock_func() succeeded */
835 if (err)
836 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 return 0;
838 }
839
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 if (err)
841 *err = GET_SOCK_ERROR;
842
Victor Stinner31bf2d52015-04-01 21:57:09 +0200843 if (!CHECK_ERRNO(EINTR))
844 break;
845
Victor Stinner81c41db2015-04-02 11:50:57 +0200846 /* sock_func() was interrupted by a signal */
847 if (PyErr_CheckSignals()) {
848 if (err)
849 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200851 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200852
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854 }
855
856 if (s->sock_timeout > 0
857 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859
860 For example, select() could indicate a socket is ready for
861 reading, but the data then discarded by the OS because of a
862 wrong checksum.
863
864 Loop on select() to recheck for socket readyness. */
865 continue;
866 }
867
Victor Stinner81c41db2015-04-02 11:50:57 +0200868 /* sock_func() failed */
869 if (!err)
870 s->errorhandler();
871 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000872 return -1;
873 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000875
Victor Stinner81c41db2015-04-02 11:50:57 +0200876static int
877sock_call(PySocketSockObject *s,
878 int writing,
879 int (*func) (PySocketSockObject *s, void *data),
880 void *data)
881{
Victor Stinner8912d142015-04-06 23:16:34 +0200882 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200883}
884
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000885
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000886/* Initialize a new socket object. */
887
Victor Stinner88ed6402015-04-09 10:23:12 +0200888/* Default timeout for new sockets */
889static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000890
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200891static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000892init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 s->sock_fd = fd;
896 s->sock_family = family;
897 s->sock_type = type;
898 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000901#ifdef SOCK_NONBLOCK
902 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100903 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000904 else
905#endif
906 {
907 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200908 if (defaulttimeout >= 0) {
909 if (internal_setblocking(s, 0) == -1) {
910 return -1;
911 }
912 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000913 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200914 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000915}
916
917
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918/* Create a new socket object.
919 This just creates the object and initializes it.
920 If the creation fails, return NULL and set an exception (implicit
921 in NEWOBJ()). */
922
Guido van Rossum73624e91994-10-10 17:59:00 +0000923static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000924new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 PySocketSockObject *s;
927 s = (PySocketSockObject *)
928 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200929 if (s == NULL)
930 return NULL;
931 if (init_sockobject(s, fd, family, type, proto) == -1) {
932 Py_DECREF(s);
933 return NULL;
934 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000936}
937
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938
Guido van Rossum48a680c2001-03-02 06:34:14 +0000939/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000940 thread to be in gethostbyname or getaddrinfo */
941#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200942static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000943#endif
944
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946/* Convert a string specifying a host name or one of a few symbolic
947 names to a numeric IP address. This usually calls gethostbyname()
948 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 an error occurred; then an exception is raised. */
951
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000952static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200953setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 struct addrinfo hints, *res;
956 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
959 if (name[0] == '\0') {
960 int siz;
961 memset(&hints, 0, sizeof(hints));
962 hints.ai_family = af;
963 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
964 hints.ai_flags = AI_PASSIVE;
965 Py_BEGIN_ALLOW_THREADS
966 ACQUIRE_GETADDRINFO_LOCK
967 error = getaddrinfo(NULL, "0", &hints, &res);
968 Py_END_ALLOW_THREADS
969 /* We assume that those thread-unsafe getaddrinfo() versions
970 *are* safe regarding their return value, ie. that a
971 subsequent call to getaddrinfo() does not destroy the
972 outcome of the first call. */
973 RELEASE_GETADDRINFO_LOCK
974 if (error) {
975 set_gaierror(error);
976 return -1;
977 }
978 switch (res->ai_family) {
979 case AF_INET:
980 siz = 4;
981 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000982#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 case AF_INET6:
984 siz = 16;
985 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 default:
988 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200989 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 "unsupported address family");
991 return -1;
992 }
993 if (res->ai_next) {
994 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200995 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 "wildcard resolved to multiple address");
997 return -1;
998 }
999 if (res->ai_addrlen < addr_ret_size)
1000 addr_ret_size = res->ai_addrlen;
1001 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1002 freeaddrinfo(res);
1003 return siz;
1004 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001005 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001006 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001007 if (strcmp(name, "255.255.255.255") == 0 ||
1008 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 struct sockaddr_in *sin;
1010 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 "address family mismatched");
1013 return -1;
1014 }
1015 sin = (struct sockaddr_in *)addr_ret;
1016 memset((void *) sin, '\0', sizeof(*sin));
1017 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001018#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 sin->sin_addr.s_addr = INADDR_BROADCAST;
1022 return sizeof(sin->sin_addr);
1023 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001024
1025 /* avoid a name resolution in case of numeric address */
1026#ifdef HAVE_INET_PTON
1027 /* check for an IPv4 address */
1028 if (af == AF_UNSPEC || af == AF_INET) {
1029 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1030 memset(sin, 0, sizeof(*sin));
1031 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1032 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001033#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001034 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001035#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001036 return 4;
1037 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001039#ifdef ENABLE_IPV6
1040 /* check for an IPv6 address - if the address contains a scope ID, we
1041 * fallback to getaddrinfo(), which can handle translation from interface
1042 * name to interface index */
1043 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1044 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1045 memset(sin, 0, sizeof(*sin));
1046 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1047 sin->sin6_family = AF_INET6;
1048#ifdef HAVE_SOCKADDR_SA_LEN
1049 sin->sin6_len = sizeof(*sin);
1050#endif
1051 return 16;
1052 }
1053 }
1054#endif /* ENABLE_IPV6 */
1055#else /* HAVE_INET_PTON */
1056 /* check for an IPv4 address */
1057 if (af == AF_INET || af == AF_UNSPEC) {
1058 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1059 memset(sin, 0, sizeof(*sin));
1060 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1061 sin->sin_family = AF_INET;
1062#ifdef HAVE_SOCKADDR_SA_LEN
1063 sin->sin_len = sizeof(*sin);
1064#endif
1065 return 4;
1066 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001067 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001068#endif /* HAVE_INET_PTON */
1069
1070 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 memset(&hints, 0, sizeof(hints));
1072 hints.ai_family = af;
1073 Py_BEGIN_ALLOW_THREADS
1074 ACQUIRE_GETADDRINFO_LOCK
1075 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001076#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 if (error == EAI_NONAME && af == AF_UNSPEC) {
1078 /* On Tru64 V5.1, numeric-to-addr conversion fails
1079 if no address family is given. Assume IPv4 for now.*/
1080 hints.ai_family = AF_INET;
1081 error = getaddrinfo(name, NULL, &hints, &res);
1082 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 Py_END_ALLOW_THREADS
1085 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1086 if (error) {
1087 set_gaierror(error);
1088 return -1;
1089 }
1090 if (res->ai_addrlen < addr_ret_size)
1091 addr_ret_size = res->ai_addrlen;
1092 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1093 freeaddrinfo(res);
1094 switch (addr_ret->sa_family) {
1095 case AF_INET:
1096 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001097#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case AF_INET6:
1099 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001102 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 return -1;
1104 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105}
1106
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108/* Create a string object representing an IP address.
1109 This is always a string of the form 'dd.dd.dd.dd' (with variable
1110 size numbers). */
1111
Guido van Rossum73624e91994-10-10 17:59:00 +00001112static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001113makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 char buf[NI_MAXHOST];
1116 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1119 NI_NUMERICHOST);
1120 if (error) {
1121 set_gaierror(error);
1122 return NULL;
1123 }
1124 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125}
1126
1127
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128#ifdef USE_BLUETOOTH
1129/* Convert a string representation of a Bluetooth address into a numeric
1130 address. Returns the length (6), or raises an exception and returns -1 if
1131 an error occurred. */
1132
1133static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001134setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 unsigned int b0, b1, b2, b3, b4, b5;
1137 char ch;
1138 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1141 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1142 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1143 bdaddr->b[0] = b0;
1144 bdaddr->b[1] = b1;
1145 bdaddr->b[2] = b2;
1146 bdaddr->b[3] = b3;
1147 bdaddr->b[4] = b4;
1148 bdaddr->b[5] = b5;
1149 return 6;
1150 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001151 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 return -1;
1153 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154}
1155
1156/* Create a string representation of the Bluetooth address. This is always a
1157 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1158 value (zero padded if necessary). */
1159
1160static PyObject *
1161makebdaddr(bdaddr_t *bdaddr)
1162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1166 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1167 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1168 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001169}
1170#endif
1171
1172
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173/* Create an object representing the given socket address,
1174 suitable for passing it back to bind(), connect() etc.
1175 The family field of the sockaddr structure is inspected
1176 to determine what kind of address it really is. */
1177
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001180makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 if (addrlen == 0) {
1183 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001184 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 case AF_INET:
1190 {
1191 struct sockaddr_in *a;
1192 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1193 PyObject *ret = NULL;
1194 if (addrobj) {
1195 a = (struct sockaddr_in *)addr;
1196 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1197 Py_DECREF(addrobj);
1198 }
1199 return ret;
1200 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001202#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 case AF_UNIX:
1204 {
1205 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001206#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001207 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1208 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1209 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 }
1211 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001212#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 {
1214 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001215 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 }
1217 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001218#endif /* AF_UNIX */
1219
Martin v. Löwis11017b12006-01-14 18:12:57 +00001220#if defined(AF_NETLINK)
1221 case AF_NETLINK:
1222 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1224 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001225 }
1226#endif /* AF_NETLINK */
1227
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001228#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 case AF_INET6:
1230 {
1231 struct sockaddr_in6 *a;
1232 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1233 PyObject *ret = NULL;
1234 if (addrobj) {
1235 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001236 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 addrobj,
1238 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001239 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 a->sin6_scope_id);
1241 Py_DECREF(addrobj);
1242 }
1243 return ret;
1244 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001245#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001246
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001247#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 case AF_BLUETOOTH:
1249 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 case BTPROTO_L2CAP:
1252 {
1253 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1254 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1255 PyObject *ret = NULL;
1256 if (addrobj) {
1257 ret = Py_BuildValue("Oi",
1258 addrobj,
1259 _BT_L2_MEMB(a, psm));
1260 Py_DECREF(addrobj);
1261 }
1262 return ret;
1263 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 case BTPROTO_RFCOMM:
1266 {
1267 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1268 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1269 PyObject *ret = NULL;
1270 if (addrobj) {
1271 ret = Py_BuildValue("Oi",
1272 addrobj,
1273 _BT_RC_MEMB(a, channel));
1274 Py_DECREF(addrobj);
1275 }
1276 return ret;
1277 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 case BTPROTO_HCI:
1280 {
1281 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001282#if defined(__NetBSD__) || defined(__DragonFly__)
1283 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1284#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 PyObject *ret = NULL;
1286 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1287 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001290
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001291#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 case BTPROTO_SCO:
1293 {
1294 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1295 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1296 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001297#endif
1298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 default:
1300 PyErr_SetString(PyExc_ValueError,
1301 "Unknown Bluetooth protocol");
1302 return NULL;
1303 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001304#endif
1305
Antoine Pitroub156a462010-10-27 20:13:57 +00001306#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 case AF_PACKET:
1308 {
1309 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1310 char *ifname = "";
1311 struct ifreq ifr;
1312 /* need to look up interface name give index */
1313 if (a->sll_ifindex) {
1314 ifr.ifr_ifindex = a->sll_ifindex;
1315 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1316 ifname = ifr.ifr_name;
1317 }
1318 return Py_BuildValue("shbhy#",
1319 ifname,
1320 ntohs(a->sll_protocol),
1321 a->sll_pkttype,
1322 a->sll_hatype,
1323 a->sll_addr,
1324 a->sll_halen);
1325 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001326#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001327
Christian Heimes043d6f62008-01-07 17:19:16 +00001328#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 case AF_TIPC:
1330 {
1331 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1332 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1333 return Py_BuildValue("IIIII",
1334 a->addrtype,
1335 a->addr.nameseq.type,
1336 a->addr.nameseq.lower,
1337 a->addr.nameseq.upper,
1338 a->scope);
1339 } else if (a->addrtype == TIPC_ADDR_NAME) {
1340 return Py_BuildValue("IIIII",
1341 a->addrtype,
1342 a->addr.name.name.type,
1343 a->addr.name.name.instance,
1344 a->addr.name.name.instance,
1345 a->scope);
1346 } else if (a->addrtype == TIPC_ADDR_ID) {
1347 return Py_BuildValue("IIIII",
1348 a->addrtype,
1349 a->addr.id.node,
1350 a->addr.id.ref,
1351 0,
1352 a->scope);
1353 } else {
1354 PyErr_SetString(PyExc_ValueError,
1355 "Invalid address type");
1356 return NULL;
1357 }
1358 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001359#endif
1360
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001361#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001362 case AF_CAN:
1363 {
1364 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1365 char *ifname = "";
1366 struct ifreq ifr;
1367 /* need to look up interface name given index */
1368 if (a->can_ifindex) {
1369 ifr.ifr_ifindex = a->can_ifindex;
1370 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1371 ifname = ifr.ifr_name;
1372 }
1373
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001374 switch (proto) {
1375#ifdef CAN_ISOTP
1376 case CAN_ISOTP:
1377 {
1378 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1379 ifname,
1380 a->can_addr.tp.rx_id,
1381 a->can_addr.tp.tx_id);
1382 }
1383#endif
1384 default:
1385 {
1386 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1387 ifname);
1388 }
1389 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001390 }
1391#endif
1392
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001393#ifdef PF_SYSTEM
1394 case PF_SYSTEM:
1395 switch(proto) {
1396#ifdef SYSPROTO_CONTROL
1397 case SYSPROTO_CONTROL:
1398 {
1399 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1400 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1401 }
1402#endif
1403 default:
1404 PyErr_SetString(PyExc_ValueError,
1405 "Invalid address type");
1406 return 0;
1407 }
1408#endif
1409
Christian Heimesdffa3942016-09-05 23:54:41 +02001410#ifdef HAVE_SOCKADDR_ALG
1411 case AF_ALG:
1412 {
1413 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1414 return Py_BuildValue("s#s#HH",
1415 a->salg_type,
1416 strnlen((const char*)a->salg_type,
1417 sizeof(a->salg_type)),
1418 a->salg_name,
1419 strnlen((const char*)a->salg_name,
1420 sizeof(a->salg_name)),
1421 a->salg_feat,
1422 a->salg_mask);
1423 }
1424#endif
1425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 default:
1429 /* If we don't know the address family, don't raise an
1430 exception -- return it as an (int, bytes) tuple. */
1431 return Py_BuildValue("iy#",
1432 addr->sa_family,
1433 addr->sa_data,
1434 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437}
1438
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001439/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1440 (in particular, numeric IP addresses). */
1441struct maybe_idna {
1442 PyObject *obj;
1443 char *buf;
1444};
1445
1446static void
1447idna_cleanup(struct maybe_idna *data)
1448{
1449 Py_CLEAR(data->obj);
1450}
1451
1452static int
1453idna_converter(PyObject *obj, struct maybe_idna *data)
1454{
1455 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001456 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001457 if (obj == NULL) {
1458 idna_cleanup(data);
1459 return 1;
1460 }
1461 data->obj = NULL;
1462 len = -1;
1463 if (PyBytes_Check(obj)) {
1464 data->buf = PyBytes_AsString(obj);
1465 len = PyBytes_Size(obj);
1466 }
1467 else if (PyByteArray_Check(obj)) {
1468 data->buf = PyByteArray_AsString(obj);
1469 len = PyByteArray_Size(obj);
1470 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001471 else if (PyUnicode_Check(obj)) {
1472 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1473 data->buf = PyUnicode_DATA(obj);
1474 len = PyUnicode_GET_LENGTH(obj);
1475 }
1476 else {
1477 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1478 if (!obj2) {
1479 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1480 return 0;
1481 }
1482 assert(PyBytes_Check(obj2));
1483 data->obj = obj2;
1484 data->buf = PyBytes_AS_STRING(obj2);
1485 len = PyBytes_GET_SIZE(obj2);
1486 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001487 }
1488 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001489 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1490 obj->ob_type->tp_name);
1491 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001492 }
1493 if (strlen(data->buf) != len) {
1494 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001495 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001496 return 0;
1497 }
1498 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001499}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001500
1501/* Parse a socket address argument according to the socket object's
1502 address family. Return 1 if the address was in the proper format,
1503 0 of not. The address is returned through addr_ret, its length
1504 through len_ret. */
1505
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001506static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001511
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001512#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 case AF_UNIX:
1514 {
1515 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001516 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001517 int retval = 0;
1518
1519 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1520 allow embedded nulls on Linux. */
1521 if (PyUnicode_Check(args)) {
1522 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1523 return 0;
1524 }
1525 else
1526 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001527 if (!PyArg_Parse(args, "y*", &path)) {
1528 Py_DECREF(args);
1529 return retval;
1530 }
1531 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001534#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001537 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001538 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001540 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 }
1542 }
1543 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001544#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 {
1546 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001547 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001548 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001550 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 }
1554 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001555 memcpy(addr->sun_path, path.buf, path.len);
1556 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001557 retval = 1;
1558 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001559 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001560 Py_DECREF(args);
1561 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001563#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564
Martin v. Löwis11017b12006-01-14 18:12:57 +00001565#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 case AF_NETLINK:
1567 {
1568 struct sockaddr_nl* addr;
1569 int pid, groups;
1570 addr = (struct sockaddr_nl *)addr_ret;
1571 if (!PyTuple_Check(args)) {
1572 PyErr_Format(
1573 PyExc_TypeError,
1574 "getsockaddrarg: "
1575 "AF_NETLINK address must be tuple, not %.500s",
1576 Py_TYPE(args)->tp_name);
1577 return 0;
1578 }
1579 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1580 return 0;
1581 addr->nl_family = AF_NETLINK;
1582 addr->nl_pid = pid;
1583 addr->nl_groups = groups;
1584 *len_ret = sizeof(*addr);
1585 return 1;
1586 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001587#endif
1588
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001589#ifdef AF_RDS
1590 case AF_RDS:
1591 /* RDS sockets use sockaddr_in: fall-through */
1592#endif
1593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 case AF_INET:
1595 {
1596 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001597 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 int port, result;
1599 if (!PyTuple_Check(args)) {
1600 PyErr_Format(
1601 PyExc_TypeError,
1602 "getsockaddrarg: "
1603 "AF_INET address must be tuple, not %.500s",
1604 Py_TYPE(args)->tp_name);
1605 return 0;
1606 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001607 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1608 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 return 0;
1610 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001611 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001613 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 if (result < 0)
1615 return 0;
1616 if (port < 0 || port > 0xffff) {
1617 PyErr_SetString(
1618 PyExc_OverflowError,
1619 "getsockaddrarg: port must be 0-65535.");
1620 return 0;
1621 }
1622 addr->sin_family = AF_INET;
1623 addr->sin_port = htons((short)port);
1624 *len_ret = sizeof *addr;
1625 return 1;
1626 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001627
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001628#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 case AF_INET6:
1630 {
1631 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001632 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001633 int port, result;
1634 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 flowinfo = scope_id = 0;
1636 if (!PyTuple_Check(args)) {
1637 PyErr_Format(
1638 PyExc_TypeError,
1639 "getsockaddrarg: "
1640 "AF_INET6 address must be tuple, not %.500s",
1641 Py_TYPE(args)->tp_name);
1642 return 0;
1643 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001644 if (!PyArg_ParseTuple(args, "O&i|II",
1645 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 &scope_id)) {
1647 return 0;
1648 }
1649 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001650 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001652 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (result < 0)
1654 return 0;
1655 if (port < 0 || port > 0xffff) {
1656 PyErr_SetString(
1657 PyExc_OverflowError,
1658 "getsockaddrarg: port must be 0-65535.");
1659 return 0;
1660 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001661 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001662 PyErr_SetString(
1663 PyExc_OverflowError,
1664 "getsockaddrarg: flowinfo must be 0-1048575.");
1665 return 0;
1666 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 addr->sin6_family = s->sock_family;
1668 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001669 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 addr->sin6_scope_id = scope_id;
1671 *len_ret = sizeof *addr;
1672 return 1;
1673 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001674#endif
1675
Hye-Shik Chang81268602004-02-02 06:05:24 +00001676#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 case AF_BLUETOOTH:
1678 {
1679 switch (s->sock_proto) {
1680 case BTPROTO_L2CAP:
1681 {
1682 struct sockaddr_l2 *addr;
1683 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 addr = (struct sockaddr_l2 *)addr_ret;
1686 memset(addr, 0, sizeof(struct sockaddr_l2));
1687 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1688 if (!PyArg_ParseTuple(args, "si", &straddr,
1689 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001690 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 "wrong format");
1692 return 0;
1693 }
1694 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1695 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 *len_ret = sizeof *addr;
1698 return 1;
1699 }
1700 case BTPROTO_RFCOMM:
1701 {
1702 struct sockaddr_rc *addr;
1703 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 addr = (struct sockaddr_rc *)addr_ret;
1706 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1707 if (!PyArg_ParseTuple(args, "si", &straddr,
1708 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001709 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 "wrong format");
1711 return 0;
1712 }
1713 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1714 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 *len_ret = sizeof *addr;
1717 return 1;
1718 }
1719 case BTPROTO_HCI:
1720 {
1721 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001722#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001723 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001724
Alexander Belopolskye239d232010-12-08 23:31:48 +00001725 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001726 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001727 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001728 "wrong format");
1729 return 0;
1730 }
1731 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1732 return 0;
1733#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1735 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001736 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 "wrong format");
1738 return 0;
1739 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 *len_ret = sizeof *addr;
1742 return 1;
1743 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001744#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 case BTPROTO_SCO:
1746 {
1747 struct sockaddr_sco *addr;
1748 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 addr = (struct sockaddr_sco *)addr_ret;
1751 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1752 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001753 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 "wrong format");
1755 return 0;
1756 }
1757 straddr = PyBytes_AS_STRING(args);
1758 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1759 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 *len_ret = sizeof *addr;
1762 return 1;
1763 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001766 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return 0;
1768 }
1769 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001770#endif
1771
Antoine Pitroub156a462010-10-27 20:13:57 +00001772#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 case AF_PACKET:
1774 {
1775 struct sockaddr_ll* addr;
1776 struct ifreq ifr;
1777 char *interfaceName;
1778 int protoNumber;
1779 int hatype = 0;
1780 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001781 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 if (!PyTuple_Check(args)) {
1784 PyErr_Format(
1785 PyExc_TypeError,
1786 "getsockaddrarg: "
1787 "AF_PACKET address must be tuple, not %.500s",
1788 Py_TYPE(args)->tp_name);
1789 return 0;
1790 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001791 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001793 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 return 0;
1795 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1796 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1797 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1798 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001799 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return 0;
1801 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001802 if (haddr.buf && haddr.len > 8) {
1803 PyErr_SetString(PyExc_ValueError,
1804 "Hardware address must be 8 bytes or less");
1805 PyBuffer_Release(&haddr);
1806 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 }
1808 if (protoNumber < 0 || protoNumber > 0xffff) {
1809 PyErr_SetString(
1810 PyExc_OverflowError,
1811 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001812 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 return 0;
1814 }
1815 addr = (struct sockaddr_ll*)addr_ret;
1816 addr->sll_family = AF_PACKET;
1817 addr->sll_protocol = htons((short)protoNumber);
1818 addr->sll_ifindex = ifr.ifr_ifindex;
1819 addr->sll_pkttype = pkttype;
1820 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001821 if (haddr.buf) {
1822 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1823 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001825 else
1826 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 return 1;
1830 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001831#endif
1832
Christian Heimes043d6f62008-01-07 17:19:16 +00001833#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 case AF_TIPC:
1835 {
1836 unsigned int atype, v1, v2, v3;
1837 unsigned int scope = TIPC_CLUSTER_SCOPE;
1838 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 if (!PyTuple_Check(args)) {
1841 PyErr_Format(
1842 PyExc_TypeError,
1843 "getsockaddrarg: "
1844 "AF_TIPC address must be tuple, not %.500s",
1845 Py_TYPE(args)->tp_name);
1846 return 0;
1847 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 if (!PyArg_ParseTuple(args,
1850 "IIII|I;Invalid TIPC address format",
1851 &atype, &v1, &v2, &v3, &scope))
1852 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 addr = (struct sockaddr_tipc *) addr_ret;
1855 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 addr->family = AF_TIPC;
1858 addr->scope = scope;
1859 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 if (atype == TIPC_ADDR_NAMESEQ) {
1862 addr->addr.nameseq.type = v1;
1863 addr->addr.nameseq.lower = v2;
1864 addr->addr.nameseq.upper = v3;
1865 } else if (atype == TIPC_ADDR_NAME) {
1866 addr->addr.name.name.type = v1;
1867 addr->addr.name.name.instance = v2;
1868 } else if (atype == TIPC_ADDR_ID) {
1869 addr->addr.id.node = v1;
1870 addr->addr.id.ref = v2;
1871 } else {
1872 /* Shouldn't happen */
1873 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1874 return 0;
1875 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return 1;
1880 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001881#endif
1882
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001883#ifdef AF_CAN
1884
1885#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001886 case AF_CAN:
1887 switch (s->sock_proto) {
1888 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001889 /* fall-through */
1890 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001891 {
1892 struct sockaddr_can *addr;
1893 PyObject *interfaceName;
1894 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001895 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001896 addr = (struct sockaddr_can *)addr_ret;
1897
Charles-François Natali47413c12011-10-06 19:47:44 +02001898 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1899 &interfaceName))
1900 return 0;
1901
1902 len = PyBytes_GET_SIZE(interfaceName);
1903
1904 if (len == 0) {
1905 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001906 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001907 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1908 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001909 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1910 s->errorhandler();
1911 Py_DECREF(interfaceName);
1912 return 0;
1913 }
1914 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001915 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001916 "AF_CAN interface name too long");
1917 Py_DECREF(interfaceName);
1918 return 0;
1919 }
1920
1921 addr->can_family = AF_CAN;
1922 addr->can_ifindex = ifr.ifr_ifindex;
1923
1924 *len_ret = sizeof(*addr);
1925 Py_DECREF(interfaceName);
1926 return 1;
1927 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001928#endif
1929
1930#ifdef CAN_ISOTP
1931 case CAN_ISOTP:
1932 {
1933 struct sockaddr_can *addr;
1934 PyObject *interfaceName;
1935 struct ifreq ifr;
1936 Py_ssize_t len;
1937 unsigned long int rx_id, tx_id;
1938
1939 addr = (struct sockaddr_can *)addr_ret;
1940
1941 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1942 &interfaceName,
1943 &rx_id,
1944 &tx_id))
1945 return 0;
1946
1947 len = PyBytes_GET_SIZE(interfaceName);
1948
1949 if (len == 0) {
1950 ifr.ifr_ifindex = 0;
1951 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1952 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1953 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1954 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1955 s->errorhandler();
1956 Py_DECREF(interfaceName);
1957 return 0;
1958 }
1959 } else {
1960 PyErr_SetString(PyExc_OSError,
1961 "AF_CAN interface name too long");
1962 Py_DECREF(interfaceName);
1963 return 0;
1964 }
1965
1966 addr->can_family = AF_CAN;
1967 addr->can_ifindex = ifr.ifr_ifindex;
1968 addr->can_addr.tp.rx_id = rx_id;
1969 addr->can_addr.tp.tx_id = tx_id;
1970
1971 *len_ret = sizeof(*addr);
1972 Py_DECREF(interfaceName);
1973 return 1;
1974 }
1975#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001976 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001977 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001978 "getsockaddrarg: unsupported CAN protocol");
1979 return 0;
1980 }
1981#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001982
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001983#ifdef PF_SYSTEM
1984 case PF_SYSTEM:
1985 switch (s->sock_proto) {
1986#ifdef SYSPROTO_CONTROL
1987 case SYSPROTO_CONTROL:
1988 {
1989 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001990
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001991 addr = (struct sockaddr_ctl *)addr_ret;
1992 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001993 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001994
1995 if (PyUnicode_Check(args)) {
1996 struct ctl_info info;
1997 PyObject *ctl_name;
1998
1999 if (!PyArg_Parse(args, "O&",
2000 PyUnicode_FSConverter, &ctl_name)) {
2001 return 0;
2002 }
2003
Victor Stinnerf50e1872015-03-20 11:32:24 +01002004 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002005 PyErr_SetString(PyExc_ValueError,
2006 "provided string is too long");
2007 Py_DECREF(ctl_name);
2008 return 0;
2009 }
2010 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2011 sizeof(info.ctl_name));
2012 Py_DECREF(ctl_name);
2013
2014 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2015 PyErr_SetString(PyExc_OSError,
2016 "cannot find kernel control with provided name");
2017 return 0;
2018 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002019
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002020 addr->sc_id = info.ctl_id;
2021 addr->sc_unit = 0;
2022 } else if (!PyArg_ParseTuple(args, "II",
2023 &(addr->sc_id), &(addr->sc_unit))) {
2024 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2025 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002026
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002027 return 0;
2028 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002029
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002030 *len_ret = sizeof(*addr);
2031 return 1;
2032 }
2033#endif
2034 default:
2035 PyErr_SetString(PyExc_OSError,
2036 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2037 return 0;
2038 }
2039#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002040#ifdef HAVE_SOCKADDR_ALG
2041 case AF_ALG:
2042 {
2043 struct sockaddr_alg *sa;
2044 char *type;
2045 char *name;
2046 sa = (struct sockaddr_alg *)addr_ret;
2047
2048 memset(sa, 0, sizeof(*sa));
2049 sa->salg_family = AF_ALG;
2050
2051 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2052 &type, &name, &sa->salg_feat, &sa->salg_mask))
2053 return 0;
2054 /* sockaddr_alg has fixed-sized char arrays for type and name */
2055 if (strlen(type) > sizeof(sa->salg_type)) {
2056 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2057 return 0;
2058 }
2059 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2060 if (strlen(name) > sizeof(sa->salg_name)) {
2061 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2062 return 0;
2063 }
2064 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2065
2066 *len_ret = sizeof(*sa);
2067 return 1;
2068 }
2069#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002074 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002078}
2079
Guido van Rossum30a685f1991-06-27 15:51:29 +00002080
Guido van Rossum48a680c2001-03-02 06:34:14 +00002081/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002082 Return 1 if the family is known, 0 otherwise. The length is returned
2083 through len_ret. */
2084
2085static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002086getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002089
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002090#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 case AF_UNIX:
2092 {
2093 *len_ret = sizeof (struct sockaddr_un);
2094 return 1;
2095 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002096#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002097
Martin v. Löwis11017b12006-01-14 18:12:57 +00002098#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002099 case AF_NETLINK:
2100 {
2101 *len_ret = sizeof (struct sockaddr_nl);
2102 return 1;
2103 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002104#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002105
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002106#ifdef AF_RDS
2107 case AF_RDS:
2108 /* RDS sockets use sockaddr_in: fall-through */
2109#endif
2110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 case AF_INET:
2112 {
2113 *len_ret = sizeof (struct sockaddr_in);
2114 return 1;
2115 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002116
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002117#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 case AF_INET6:
2119 {
2120 *len_ret = sizeof (struct sockaddr_in6);
2121 return 1;
2122 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002123#endif
2124
Hye-Shik Chang81268602004-02-02 06:05:24 +00002125#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 case AF_BLUETOOTH:
2127 {
2128 switch(s->sock_proto)
2129 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 case BTPROTO_L2CAP:
2132 *len_ret = sizeof (struct sockaddr_l2);
2133 return 1;
2134 case BTPROTO_RFCOMM:
2135 *len_ret = sizeof (struct sockaddr_rc);
2136 return 1;
2137 case BTPROTO_HCI:
2138 *len_ret = sizeof (struct sockaddr_hci);
2139 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002140#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 case BTPROTO_SCO:
2142 *len_ret = sizeof (struct sockaddr_sco);
2143 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002146 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 "unknown BT protocol");
2148 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 }
2151 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002152#endif
2153
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002154#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 case AF_PACKET:
2156 {
2157 *len_ret = sizeof (struct sockaddr_ll);
2158 return 1;
2159 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002160#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002161
Christian Heimes043d6f62008-01-07 17:19:16 +00002162#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 case AF_TIPC:
2164 {
2165 *len_ret = sizeof (struct sockaddr_tipc);
2166 return 1;
2167 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002168#endif
2169
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002170#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002171 case AF_CAN:
2172 {
2173 *len_ret = sizeof (struct sockaddr_can);
2174 return 1;
2175 }
2176#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002177
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002178#ifdef PF_SYSTEM
2179 case PF_SYSTEM:
2180 switch(s->sock_proto) {
2181#ifdef SYSPROTO_CONTROL
2182 case SYSPROTO_CONTROL:
2183 *len_ret = sizeof (struct sockaddr_ctl);
2184 return 1;
2185#endif
2186 default:
2187 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2188 "unknown PF_SYSTEM protocol");
2189 return 0;
2190 }
2191#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002192#ifdef HAVE_SOCKADDR_ALG
2193 case AF_ALG:
2194 {
2195 *len_ret = sizeof (struct sockaddr_alg);
2196 return 1;
2197 }
2198#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002203 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002207}
2208
2209
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002210/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2211 Currently, these methods are only compiled if the RFC 2292/3542
2212 CMSG_LEN() macro is available. Older systems seem to have used
2213 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2214 it may be possible to define CMSG_LEN() that way if it's not
2215 provided. Some architectures might need extra padding after the
2216 cmsghdr, however, and CMSG_LEN() would have to take account of
2217 this. */
2218#ifdef CMSG_LEN
2219/* If length is in range, set *result to CMSG_LEN(length) and return
2220 true; otherwise, return false. */
2221static int
2222get_CMSG_LEN(size_t length, size_t *result)
2223{
2224 size_t tmp;
2225
2226 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2227 return 0;
2228 tmp = CMSG_LEN(length);
2229 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2230 return 0;
2231 *result = tmp;
2232 return 1;
2233}
2234
2235#ifdef CMSG_SPACE
2236/* If length is in range, set *result to CMSG_SPACE(length) and return
2237 true; otherwise, return false. */
2238static int
2239get_CMSG_SPACE(size_t length, size_t *result)
2240{
2241 size_t tmp;
2242
2243 /* Use CMSG_SPACE(1) here in order to take account of the padding
2244 necessary before *and* after the data. */
2245 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2246 return 0;
2247 tmp = CMSG_SPACE(length);
2248 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2249 return 0;
2250 *result = tmp;
2251 return 1;
2252}
2253#endif
2254
2255/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2256 pointer in msg->msg_control with at least "space" bytes after it,
2257 and its cmsg_len member inside the buffer. */
2258static int
2259cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2260{
2261 size_t cmsg_offset;
2262 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2263 sizeof(cmsgh->cmsg_len));
2264
Charles-François Natali466517d2011-08-28 18:23:43 +02002265 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002266 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002267 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002268 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2269 annoying under OS X as it's unsigned there and so it triggers a
2270 tautological comparison warning under Clang when compared against 0.
2271 Since the check is valid on other platforms, silence the warning under
2272 Clang. */
2273 #ifdef __clang__
2274 #pragma clang diagnostic push
2275 #pragma clang diagnostic ignored "-Wtautological-compare"
2276 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002277 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002278 #pragma GCC diagnostic push
2279 #pragma GCC diagnostic ignored "-Wtype-limits"
2280 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002281 if (msg->msg_controllen < 0)
2282 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002283 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002284 #pragma GCC diagnostic pop
2285 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002286 #ifdef __clang__
2287 #pragma clang diagnostic pop
2288 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002289 if (space < cmsg_len_end)
2290 space = cmsg_len_end;
2291 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2292 return (cmsg_offset <= (size_t)-1 - space &&
2293 cmsg_offset + space <= msg->msg_controllen);
2294}
2295
2296/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2297 *space to number of bytes following it in the buffer and return
2298 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2299 msg->msg_controllen are valid. */
2300static int
2301get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2302{
2303 size_t data_offset;
2304 char *data_ptr;
2305
2306 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2307 return 0;
2308 data_offset = data_ptr - (char *)msg->msg_control;
2309 if (data_offset > msg->msg_controllen)
2310 return 0;
2311 *space = msg->msg_controllen - data_offset;
2312 return 1;
2313}
2314
2315/* If cmsgh is invalid or not contained in the buffer pointed to by
2316 msg->msg_control, return -1. If cmsgh is valid and its associated
2317 data is entirely contained in the buffer, set *data_len to the
2318 length of the associated data and return 0. If only part of the
2319 associated data is contained in the buffer but cmsgh is otherwise
2320 valid, set *data_len to the length contained in the buffer and
2321 return 1. */
2322static int
2323get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2324{
2325 size_t space, cmsg_data_len;
2326
2327 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2328 cmsgh->cmsg_len < CMSG_LEN(0))
2329 return -1;
2330 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2331 if (!get_cmsg_data_space(msg, cmsgh, &space))
2332 return -1;
2333 if (space >= cmsg_data_len) {
2334 *data_len = cmsg_data_len;
2335 return 0;
2336 }
2337 *data_len = space;
2338 return 1;
2339}
2340#endif /* CMSG_LEN */
2341
2342
Victor Stinner31bf2d52015-04-01 21:57:09 +02002343struct sock_accept {
2344 socklen_t *addrlen;
2345 sock_addr_t *addrbuf;
2346 SOCKET_T result;
2347};
2348
2349#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2350/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2351static int accept4_works = -1;
2352#endif
2353
2354static int
2355sock_accept_impl(PySocketSockObject *s, void *data)
2356{
2357 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002358 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2359 socklen_t *paddrlen = ctx->addrlen;
2360#ifdef HAVE_SOCKADDR_ALG
2361 /* AF_ALG does not support accept() with addr and raises
2362 * ECONNABORTED instead. */
2363 if (s->sock_family == AF_ALG) {
2364 addr = NULL;
2365 paddrlen = NULL;
2366 *ctx->addrlen = 0;
2367 }
2368#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002369
2370#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2371 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002372 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002373 SOCK_CLOEXEC);
2374 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2375 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2376 accept4_works = (errno != ENOSYS);
2377 }
2378 }
2379 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002380 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002381#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002382 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002383#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002384
2385#ifdef MS_WINDOWS
2386 return (ctx->result != INVALID_SOCKET);
2387#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002388 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002389#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002390}
2391
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002392/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002393
Guido van Rossum73624e91994-10-10 17:59:00 +00002394static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002395sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002398 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 socklen_t addrlen;
2400 PyObject *sock = NULL;
2401 PyObject *addr = NULL;
2402 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002403 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 if (!getsockaddrlen(s, &addrlen))
2406 return NULL;
2407 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 if (!IS_SELECTABLE(s))
2410 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002411
Victor Stinner31bf2d52015-04-01 21:57:09 +02002412 ctx.addrlen = &addrlen;
2413 ctx.addrbuf = &addrbuf;
2414 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002416 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002417
Victor Stinnerdaf45552013-08-28 00:53:59 +02002418#ifdef MS_WINDOWS
2419 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2420 PyErr_SetFromWindowsErr(0);
2421 SOCKETCLOSE(newfd);
2422 goto finally;
2423 }
2424#else
2425
2426#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2427 if (!accept4_works)
2428#endif
2429 {
2430 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2431 SOCKETCLOSE(newfd);
2432 goto finally;
2433 }
2434 }
2435#endif
2436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 sock = PyLong_FromSocket_t(newfd);
2438 if (sock == NULL) {
2439 SOCKETCLOSE(newfd);
2440 goto finally;
2441 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2444 addrlen, s->sock_proto);
2445 if (addr == NULL)
2446 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002449
Guido van Rossum67f7a382002-06-06 21:08:16 +00002450finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 Py_XDECREF(sock);
2452 Py_XDECREF(addr);
2453 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002454}
2455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002456PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002457"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002458\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002459Wait for an incoming connection. Return a new socket file descriptor\n\
2460representing the connection, and the address of the client.\n\
2461For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002462
Guido van Rossum11ba0942002-06-13 15:07:44 +00002463/* s.setblocking(flag) method. Argument:
2464 False -- non-blocking mode; same as settimeout(0)
2465 True -- blocking mode; same as settimeout(None)
2466*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002467
Guido van Rossum73624e91994-10-10 17:59:00 +00002468static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002469sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002470{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002471 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 block = PyLong_AsLong(arg);
2474 if (block == -1 && PyErr_Occurred())
2475 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002476
Victor Stinner9001d802015-04-06 23:06:01 +02002477 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002478 if (internal_setblocking(s, block) == -1) {
2479 return NULL;
2480 }
2481 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002482}
Guido van Rossume4485b01994-09-07 14:32:49 +00002483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485"setblocking(flag)\n\
2486\n\
2487Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002488setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490
Victor Stinner71694d52015-03-28 01:18:54 +01002491static int
2492socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2493{
2494#ifdef MS_WINDOWS
2495 struct timeval tv;
2496#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002497#ifndef HAVE_POLL
2498 _PyTime_t ms;
2499#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002500 int overflow = 0;
2501
2502 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002503 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002504 return 0;
2505 }
2506
Victor Stinner869e1772015-03-30 03:49:14 +02002507 if (_PyTime_FromSecondsObject(timeout,
2508 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002509 return -1;
2510
2511 if (*timeout < 0) {
2512 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2513 return -1;
2514 }
2515
2516#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002517 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002518#endif
2519#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002520 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2521 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002522#endif
2523 if (overflow) {
2524 PyErr_SetString(PyExc_OverflowError,
2525 "timeout doesn't fit into C timeval");
2526 return -1;
2527 }
2528
2529 return 0;
2530}
2531
Guido van Rossum11ba0942002-06-13 15:07:44 +00002532/* s.settimeout(timeout) method. Argument:
2533 None -- no timeout, blocking mode; same as setblocking(True)
2534 0.0 -- non-blocking mode; same as setblocking(False)
2535 > 0 -- timeout mode; operations time out after timeout seconds
2536 < 0 -- illegal; raises an exception
2537*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002538static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002539sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540{
Victor Stinner71694d52015-03-28 01:18:54 +01002541 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002542
Victor Stinner71694d52015-03-28 01:18:54 +01002543 if (socket_parse_timeout(&timeout, arg) < 0)
2544 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002547 if (internal_setblocking(s, timeout < 0) == -1) {
2548 return NULL;
2549 }
2550 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002551}
2552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002553PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002554"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002555\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002556Set a timeout on socket operations. 'timeout' can be a float,\n\
2557giving in seconds, or None. Setting a timeout of None disables\n\
2558the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002559Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002560
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002561/* s.gettimeout() method.
2562 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002564sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565{
Victor Stinner71694d52015-03-28 01:18:54 +01002566 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002567 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 }
Victor Stinner71694d52015-03-28 01:18:54 +01002569 else {
2570 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2571 return PyFloat_FromDouble(seconds);
2572 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002576"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002578Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002581
Guido van Rossumaee08791992-09-08 09:05:33 +00002582/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002583 With an integer third argument, sets an integer optval with optlen=4.
2584 With None as third argument and an integer fourth argument, set
2585 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002586 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002587 use optional built-in module 'struct' to encode the string.
2588*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002589
Guido van Rossum73624e91994-10-10 17:59:00 +00002590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002591sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 int level;
2594 int optname;
2595 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002596 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002598 unsigned int optlen;
2599 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002600
Christian Heimesdffa3942016-09-05 23:54:41 +02002601 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 if (PyArg_ParseTuple(args, "iii:setsockopt",
2603 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002604 res = setsockopt(s->sock_fd, level, optname,
2605 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002606 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002608
2609 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002610 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002611 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2612 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2613 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002614 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002615 NULL, (socklen_t)optlen);
2616 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002618
2619 PyErr_Clear();
2620 /* setsockopt(level, opt, buffer) */
2621 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2622 &level, &optname, &optval))
2623 return NULL;
2624
2625#ifdef MS_WINDOWS
2626 if (optval.len > INT_MAX) {
2627 PyBuffer_Release(&optval);
2628 PyErr_Format(PyExc_OverflowError,
2629 "socket option is larger than %i bytes",
2630 INT_MAX);
2631 return NULL;
2632 }
2633 res = setsockopt(s->sock_fd, level, optname,
2634 optval.buf, (int)optval.len);
2635#else
2636 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2637#endif
2638 PyBuffer_Release(&optval);
2639
2640done:
Victor Stinnercc739322016-03-23 21:35:29 +01002641 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002643 }
2644
2645 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002646}
2647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002649"setsockopt(level, option, value: int)\n\
2650setsockopt(level, option, value: buffer)\n\
2651setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002652\n\
2653Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002654The value argument can either be an integer, a string buffer, or \n\
2655None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002656
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002657
Guido van Rossumaee08791992-09-08 09:05:33 +00002658/* s.getsockopt() method.
2659 With two arguments, retrieves an integer option.
2660 With a third integer argument, retrieves a string buffer of that size;
2661 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002662
Guido van Rossum73624e91994-10-10 17:59:00 +00002663static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002664sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 int level;
2667 int optname;
2668 int res;
2669 PyObject *buf;
2670 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2673 &level, &optname, &buflen))
2674 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 if (buflen == 0) {
2677 int flag = 0;
2678 socklen_t flagsize = sizeof flag;
2679 res = getsockopt(s->sock_fd, level, optname,
2680 (void *)&flag, &flagsize);
2681 if (res < 0)
2682 return s->errorhandler();
2683 return PyLong_FromLong(flag);
2684 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002686 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 "getsockopt buflen out of range");
2688 return NULL;
2689 }
2690 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2691 if (buf == NULL)
2692 return NULL;
2693 res = getsockopt(s->sock_fd, level, optname,
2694 (void *)PyBytes_AS_STRING(buf), &buflen);
2695 if (res < 0) {
2696 Py_DECREF(buf);
2697 return s->errorhandler();
2698 }
2699 _PyBytes_Resize(&buf, buflen);
2700 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002701}
2702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002703PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002704"getsockopt(level, option[, buffersize]) -> value\n\
2705\n\
2706Get a socket option. See the Unix manual for level and option.\n\
2707If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002710
Fred Drake728819a2000-07-01 03:40:12 +00002711/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002712
Guido van Rossum73624e91994-10-10 17:59:00 +00002713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002714sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 sock_addr_t addrbuf;
2717 int addrlen;
2718 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2721 return NULL;
2722 Py_BEGIN_ALLOW_THREADS
2723 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2724 Py_END_ALLOW_THREADS
2725 if (res < 0)
2726 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002727 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002728}
2729
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002730PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002731"bind(address)\n\
2732\n\
2733Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002734pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002735sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002736
Guido van Rossum30a685f1991-06-27 15:51:29 +00002737
2738/* s.close() method.
2739 Set the file descriptor to -1 so operations tried subsequently
2740 will surely fail. */
2741
Guido van Rossum73624e91994-10-10 17:59:00 +00002742static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002743sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002746 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002747
Victor Stinner19a8e842016-03-21 16:36:48 +01002748 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002749 if (fd != INVALID_SOCKET) {
2750 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002751
2752 /* We do not want to retry upon EINTR: see
2753 http://lwn.net/Articles/576478/ and
2754 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2755 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002757 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002759 /* bpo-30319: The peer can already have closed the connection.
2760 Python ignores ECONNRESET on close(). */
2761 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002762 return s->errorhandler();
2763 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002765 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002766}
2767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002768PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002769"close()\n\
2770\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002771Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002772
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002773static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002774sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002775{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002776 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002777 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002778 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002779}
2780
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002781PyDoc_STRVAR(detach_doc,
2782"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002783\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002784Close the socket object without closing the underlying file descriptor.\n\
2785The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002786can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002787
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002788static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002789sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002790{
Victor Stinner81c41db2015-04-02 11:50:57 +02002791 int err;
2792 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002793
Victor Stinner81c41db2015-04-02 11:50:57 +02002794 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2795 /* getsockopt() failed */
2796 return 0;
2797 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002798
Victor Stinner81c41db2015-04-02 11:50:57 +02002799 if (err == EISCONN)
2800 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002801 if (err != 0) {
2802 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2803 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002804 return 0;
2805 }
2806 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002807}
2808
2809static int
2810internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2811 int raise)
2812{
2813 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002814
2815 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002817 Py_END_ALLOW_THREADS
2818
Victor Stinner70a46f62015-03-31 22:03:59 +02002819 if (!res) {
2820 /* connect() succeeded, the socket is connected */
2821 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002823
Victor Stinner81c41db2015-04-02 11:50:57 +02002824 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002825
Victor Stinner81c41db2015-04-02 11:50:57 +02002826 /* save error, PyErr_CheckSignals() can replace it */
2827 err = GET_SOCK_ERROR;
2828 if (CHECK_ERRNO(EINTR)) {
2829 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002830 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002831
2832 /* Issue #23618: when connect() fails with EINTR, the connection is
2833 running asynchronously.
2834
2835 If the socket is blocking or has a timeout, wait until the
2836 connection completes, fails or timed out using select(), and then
2837 get the connection status using getsockopt(SO_ERROR).
2838
2839 If the socket is non-blocking, raise InterruptedError. The caller is
2840 responsible to wait until the connection completes, fails or timed
2841 out (it's the case in asyncio for example). */
2842 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2843 }
2844 else {
2845 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2846 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002847 }
2848
Victor Stinner81c41db2015-04-02 11:50:57 +02002849 if (!wait_connect) {
2850 if (raise) {
2851 /* restore error, maybe replaced by PyErr_CheckSignals() */
2852 SET_SOCK_ERROR(err);
2853 s->errorhandler();
2854 return -1;
2855 }
2856 else
2857 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002858 }
2859
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 if (raise) {
2861 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002862 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2863 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002864 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002865 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002866 else {
2867 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002868 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2869 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002870 return err;
2871 }
2872 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002873}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002874
Fred Drake728819a2000-07-01 03:40:12 +00002875/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002876
Guido van Rossum73624e91994-10-10 17:59:00 +00002877static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002878sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 sock_addr_t addrbuf;
2881 int addrlen;
2882 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2885 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002886
Victor Stinner81c41db2015-04-02 11:50:57 +02002887 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002888 if (res < 0)
2889 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002890
Victor Stinneree699e92015-03-31 21:28:42 +02002891 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002892}
2893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002894PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002895"connect(address)\n\
2896\n\
2897Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002898is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002899
Guido van Rossum30a685f1991-06-27 15:51:29 +00002900
Fred Drake728819a2000-07-01 03:40:12 +00002901/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002902
2903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002904sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002906 sock_addr_t addrbuf;
2907 int addrlen;
2908 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2911 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002912
Victor Stinner81c41db2015-04-02 11:50:57 +02002913 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002914 if (res < 0)
2915 return NULL;
2916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002918}
2919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002920PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002921"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002922\n\
2923This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002924instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002925
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002926
Guido van Rossumed233a51992-06-23 09:07:03 +00002927/* s.fileno() method */
2928
Guido van Rossum73624e91994-10-10 17:59:00 +00002929static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002930sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002933}
2934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002935PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002936"fileno() -> integer\n\
2937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002938Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002939
Guido van Rossumed233a51992-06-23 09:07:03 +00002940
Guido van Rossumc89705d1992-11-26 08:54:07 +00002941/* s.getsockname() method */
2942
Guido van Rossum73624e91994-10-10 17:59:00 +00002943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002944sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 sock_addr_t addrbuf;
2947 int res;
2948 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 if (!getsockaddrlen(s, &addrlen))
2951 return NULL;
2952 memset(&addrbuf, 0, addrlen);
2953 Py_BEGIN_ALLOW_THREADS
2954 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2955 Py_END_ALLOW_THREADS
2956 if (res < 0)
2957 return s->errorhandler();
2958 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2959 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002960}
2961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963"getsockname() -> address info\n\
2964\n\
2965Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002966info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002967
Guido van Rossumc89705d1992-11-26 08:54:07 +00002968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002970/* s.getpeername() method */
2971
Guido van Rossum73624e91994-10-10 17:59:00 +00002972static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002973sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 sock_addr_t addrbuf;
2976 int res;
2977 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 if (!getsockaddrlen(s, &addrlen))
2980 return NULL;
2981 memset(&addrbuf, 0, addrlen);
2982 Py_BEGIN_ALLOW_THREADS
2983 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2984 Py_END_ALLOW_THREADS
2985 if (res < 0)
2986 return s->errorhandler();
2987 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2988 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002989}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002991PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002992"getpeername() -> address info\n\
2993\n\
2994Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002995info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002996
Guido van Rossumb6775db1994-08-01 11:34:53 +00002997#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002998
2999
Guido van Rossum30a685f1991-06-27 15:51:29 +00003000/* s.listen(n) method */
3001
Guido van Rossum73624e91994-10-10 17:59:00 +00003002static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003003sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003004{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003005 /* We try to choose a default backlog high enough to avoid connection drops
3006 * for common workloads, yet not too high to limit resource usage. */
3007 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003009
Charles-François Natali644b8f52014-05-22 19:45:39 +01003010 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003014 /* To avoid problems on systems that don't allow a negative backlog
3015 * (which doesn't make sense anyway) we force a minimum value of 0. */
3016 if (backlog < 0)
3017 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 res = listen(s->sock_fd, backlog);
3019 Py_END_ALLOW_THREADS
3020 if (res < 0)
3021 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003022 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003023}
3024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003025PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003026"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003027\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003028Enable a server to accept connections. If backlog is specified, it must be\n\
3029at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003030unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003031connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003032
Victor Stinner31bf2d52015-04-01 21:57:09 +02003033struct sock_recv {
3034 char *cbuf;
3035 Py_ssize_t len;
3036 int flags;
3037 Py_ssize_t result;
3038};
3039
3040static int
3041sock_recv_impl(PySocketSockObject *s, void *data)
3042{
3043 struct sock_recv *ctx = data;
3044
3045#ifdef MS_WINDOWS
3046 if (ctx->len > INT_MAX)
3047 ctx->len = INT_MAX;
3048 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3049#else
3050 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3051#endif
3052 return (ctx->result >= 0);
3053}
3054
Guido van Rossum82a5c661998-07-07 20:45:43 +00003055
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003057 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003058 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003059 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003060 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003061 * also possible that we return a number of bytes smaller than the request
3062 * bytes.
3063 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003064
Antoine Pitrou19467d22010-08-17 19:33:30 +00003065static Py_ssize_t
3066sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003067{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003068 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (!IS_SELECTABLE(s)) {
3071 select_error();
3072 return -1;
3073 }
3074 if (len == 0) {
3075 /* If 0 bytes were requested, do nothing. */
3076 return 0;
3077 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003078
Victor Stinner31bf2d52015-04-01 21:57:09 +02003079 ctx.cbuf = cbuf;
3080 ctx.len = len;
3081 ctx.flags = flags;
3082 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003084
3085 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003086}
3087
Guido van Rossum48a680c2001-03-02 06:34:14 +00003088
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003089/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003090
Guido van Rossum73624e91994-10-10 17:59:00 +00003091static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003092sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003093{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003094 Py_ssize_t recvlen, outlen;
3095 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003097
Antoine Pitrou19467d22010-08-17 19:33:30 +00003098 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 if (recvlen < 0) {
3102 PyErr_SetString(PyExc_ValueError,
3103 "negative buffersize in recv");
3104 return NULL;
3105 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 /* Allocate a new string. */
3108 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3109 if (buf == NULL)
3110 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 /* Call the guts */
3113 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3114 if (outlen < 0) {
3115 /* An error occurred, release the string and return an
3116 error. */
3117 Py_DECREF(buf);
3118 return NULL;
3119 }
3120 if (outlen != recvlen) {
3121 /* We did not read as many bytes as we anticipated, resize the
3122 string if possible and be successful. */
3123 _PyBytes_Resize(&buf, outlen);
3124 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003127}
3128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003129PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003130"recv(buffersize[, flags]) -> data\n\
3131\n\
3132Receive up to buffersize bytes from the socket. For the optional flags\n\
3133argument, see the Unix manual. When no data is available, block until\n\
3134at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003135the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003136
Guido van Rossum30a685f1991-06-27 15:51:29 +00003137
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003138/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003139
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003141sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144
Antoine Pitrou19467d22010-08-17 19:33:30 +00003145 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 Py_buffer pbuf;
3147 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003148 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003151 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 &pbuf, &recvlen, &flags))
3153 return NULL;
3154 buf = pbuf.buf;
3155 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 if (recvlen < 0) {
3158 PyBuffer_Release(&pbuf);
3159 PyErr_SetString(PyExc_ValueError,
3160 "negative buffersize in recv_into");
3161 return NULL;
3162 }
3163 if (recvlen == 0) {
3164 /* If nbytes was not specified, use the buffer's length */
3165 recvlen = buflen;
3166 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 /* Check if the buffer is large enough */
3169 if (buflen < recvlen) {
3170 PyBuffer_Release(&pbuf);
3171 PyErr_SetString(PyExc_ValueError,
3172 "buffer too small for requested bytes");
3173 return NULL;
3174 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 /* Call the guts */
3177 readlen = sock_recv_guts(s, buf, recvlen, flags);
3178 if (readlen < 0) {
3179 /* Return an error. */
3180 PyBuffer_Release(&pbuf);
3181 return NULL;
3182 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 PyBuffer_Release(&pbuf);
3185 /* Return the number of bytes read. Note that we do not do anything
3186 special here in the case that readlen < recvlen. */
3187 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003188}
3189
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003190PyDoc_STRVAR(recv_into_doc,
3191"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003192\n\
3193A version of recv() that stores its data into a buffer rather than creating \n\
3194a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3195is not specified (or 0), receive up to the size available in the given buffer.\n\
3196\n\
3197See recv() for documentation about the flags.");
3198
Victor Stinner31bf2d52015-04-01 21:57:09 +02003199struct sock_recvfrom {
3200 char* cbuf;
3201 Py_ssize_t len;
3202 int flags;
3203 socklen_t *addrlen;
3204 sock_addr_t *addrbuf;
3205 Py_ssize_t result;
3206};
3207
3208static int
3209sock_recvfrom_impl(PySocketSockObject *s, void *data)
3210{
3211 struct sock_recvfrom *ctx = data;
3212
3213 memset(ctx->addrbuf, 0, *ctx->addrlen);
3214
3215#ifdef MS_WINDOWS
3216 if (ctx->len > INT_MAX)
3217 ctx->len = INT_MAX;
3218 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3219 SAS2SA(ctx->addrbuf), ctx->addrlen);
3220#else
3221 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3222 SAS2SA(ctx->addrbuf), ctx->addrlen);
3223#endif
3224 return (ctx->result >= 0);
3225}
3226
Thomas Wouters477c8d52006-05-27 19:21:47 +00003227
3228/*
Christian Heimes99170a52007-12-19 02:07:34 +00003229 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3230 * into a char buffer. If you have any inc/def ref to do to the objects that
3231 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003232 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003233 * that it is also possible that we return a number of bytes smaller than the
3234 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003235 *
3236 * 'addr' is a return value for the address object. Note that you must decref
3237 * it yourself.
3238 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003239static Py_ssize_t
3240sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003245 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 if (!getsockaddrlen(s, &addrlen))
3250 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 if (!IS_SELECTABLE(s)) {
3253 select_error();
3254 return -1;
3255 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003256
Victor Stinner31bf2d52015-04-01 21:57:09 +02003257 ctx.cbuf = cbuf;
3258 ctx.len = len;
3259 ctx.flags = flags;
3260 ctx.addrbuf = &addrbuf;
3261 ctx.addrlen = &addrlen;
3262 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264
Victor Stinner31bf2d52015-04-01 21:57:09 +02003265 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3266 s->sock_proto);
3267 if (*addr == NULL)
3268 return -1;
3269
3270 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003271}
3272
3273/* s.recvfrom(nbytes [,flags]) method */
3274
3275static PyObject *
3276sock_recvfrom(PySocketSockObject *s, PyObject *args)
3277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 PyObject *buf = NULL;
3279 PyObject *addr = NULL;
3280 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003281 int flags = 0;
3282 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003283
Antoine Pitrou19467d22010-08-17 19:33:30 +00003284 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 if (recvlen < 0) {
3288 PyErr_SetString(PyExc_ValueError,
3289 "negative buffersize in recvfrom");
3290 return NULL;
3291 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3294 if (buf == NULL)
3295 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3298 recvlen, flags, &addr);
3299 if (outlen < 0) {
3300 goto finally;
3301 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 if (outlen != recvlen) {
3304 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003305 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003307 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 goto finally;
3309 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
3313finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 Py_XDECREF(buf);
3315 Py_XDECREF(addr);
3316 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003317}
3318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003319PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003320"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3321\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003322Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003323
Thomas Wouters477c8d52006-05-27 19:21:47 +00003324
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003325/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003326
3327static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003328sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003331
Antoine Pitrou19467d22010-08-17 19:33:30 +00003332 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 Py_buffer pbuf;
3334 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003335 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003338
Antoine Pitrou19467d22010-08-17 19:33:30 +00003339 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 kwlist, &pbuf,
3341 &recvlen, &flags))
3342 return NULL;
3343 buf = pbuf.buf;
3344 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 if (recvlen < 0) {
3347 PyBuffer_Release(&pbuf);
3348 PyErr_SetString(PyExc_ValueError,
3349 "negative buffersize in recvfrom_into");
3350 return NULL;
3351 }
3352 if (recvlen == 0) {
3353 /* If nbytes was not specified, use the buffer's length */
3354 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003355 } else if (recvlen > buflen) {
3356 PyBuffer_Release(&pbuf);
3357 PyErr_SetString(PyExc_ValueError,
3358 "nbytes is greater than the length of the buffer");
3359 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3363 if (readlen < 0) {
3364 PyBuffer_Release(&pbuf);
3365 /* Return an error */
3366 Py_XDECREF(addr);
3367 return NULL;
3368 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 PyBuffer_Release(&pbuf);
3371 /* Return the number of bytes read and the address. Note that we do
3372 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003373 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003374}
3375
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003376PyDoc_STRVAR(recvfrom_into_doc,
3377"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003378\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003379Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380
Victor Stinner35bee932015-04-02 12:28:07 +02003381/* The sendmsg() and recvmsg[_into]() methods require a working
3382 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3383#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003384struct sock_recvmsg {
3385 struct msghdr *msg;
3386 int flags;
3387 ssize_t result;
3388};
3389
3390static int
3391sock_recvmsg_impl(PySocketSockObject *s, void *data)
3392{
3393 struct sock_recvmsg *ctx = data;
3394
3395 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3396 return (ctx->result >= 0);
3397}
3398
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003399/*
3400 * Call recvmsg() with the supplied iovec structures, flags, and
3401 * ancillary data buffer size (controllen). Returns the tuple return
3402 * value for recvmsg() or recvmsg_into(), with the first item provided
3403 * by the supplied makeval() function. makeval() will be called with
3404 * the length read and makeval_data as arguments, and must return a
3405 * new reference (which will be decrefed if there is a subsequent
3406 * error). On error, closes any file descriptors received via
3407 * SCM_RIGHTS.
3408 */
3409static PyObject *
3410sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3411 int flags, Py_ssize_t controllen,
3412 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3413{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003414 sock_addr_t addrbuf;
3415 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003416 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003417 PyObject *cmsg_list = NULL, *retval = NULL;
3418 void *controlbuf = NULL;
3419 struct cmsghdr *cmsgh;
3420 size_t cmsgdatalen = 0;
3421 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003422 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003423
3424 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3425 ignored" when the socket is connected (Linux fills them in
3426 anyway for AF_UNIX sockets at least). Normally msg_namelen
3427 seems to be set to 0 if there's no address, but try to
3428 initialize msg_name to something that won't be mistaken for a
3429 real address if that doesn't happen. */
3430 if (!getsockaddrlen(s, &addrbuflen))
3431 return NULL;
3432 memset(&addrbuf, 0, addrbuflen);
3433 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3434
3435 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3436 PyErr_SetString(PyExc_ValueError,
3437 "invalid ancillary data buffer length");
3438 return NULL;
3439 }
3440 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3441 return PyErr_NoMemory();
3442
3443 /* Make the system call. */
3444 if (!IS_SELECTABLE(s)) {
3445 select_error();
3446 goto finally;
3447 }
3448
Victor Stinner31bf2d52015-04-01 21:57:09 +02003449 msg.msg_name = SAS2SA(&addrbuf);
3450 msg.msg_namelen = addrbuflen;
3451 msg.msg_iov = iov;
3452 msg.msg_iovlen = iovlen;
3453 msg.msg_control = controlbuf;
3454 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003455
Victor Stinner31bf2d52015-04-01 21:57:09 +02003456 ctx.msg = &msg;
3457 ctx.flags = flags;
3458 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003459 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460
3461 /* Make list of (level, type, data) tuples from control messages. */
3462 if ((cmsg_list = PyList_New(0)) == NULL)
3463 goto err_closefds;
3464 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3465 implementations didn't do so. */
3466 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3467 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3468 PyObject *bytes, *tuple;
3469 int tmp;
3470
3471 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3472 if (cmsg_status != 0) {
3473 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3474 "received malformed or improperly-truncated "
3475 "ancillary data", 1) == -1)
3476 goto err_closefds;
3477 }
3478 if (cmsg_status < 0)
3479 break;
3480 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003481 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003482 goto err_closefds;
3483 }
3484
3485 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3486 cmsgdatalen);
3487 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3488 (int)cmsgh->cmsg_type, bytes);
3489 if (tuple == NULL)
3490 goto err_closefds;
3491 tmp = PyList_Append(cmsg_list, tuple);
3492 Py_DECREF(tuple);
3493 if (tmp != 0)
3494 goto err_closefds;
3495
3496 if (cmsg_status != 0)
3497 break;
3498 }
3499
3500 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003501 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003502 cmsg_list,
3503 (int)msg.msg_flags,
3504 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3505 ((msg.msg_namelen > addrbuflen) ?
3506 addrbuflen : msg.msg_namelen),
3507 s->sock_proto));
3508 if (retval == NULL)
3509 goto err_closefds;
3510
3511finally:
3512 Py_XDECREF(cmsg_list);
3513 PyMem_Free(controlbuf);
3514 return retval;
3515
3516err_closefds:
3517#ifdef SCM_RIGHTS
3518 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3519 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3520 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3521 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3522 if (cmsg_status < 0)
3523 break;
3524 if (cmsgh->cmsg_level == SOL_SOCKET &&
3525 cmsgh->cmsg_type == SCM_RIGHTS) {
3526 size_t numfds;
3527 int *fdp;
3528
3529 numfds = cmsgdatalen / sizeof(int);
3530 fdp = (int *)CMSG_DATA(cmsgh);
3531 while (numfds-- > 0)
3532 close(*fdp++);
3533 }
3534 if (cmsg_status != 0)
3535 break;
3536 }
3537#endif /* SCM_RIGHTS */
3538 goto finally;
3539}
3540
3541
3542static PyObject *
3543makeval_recvmsg(ssize_t received, void *data)
3544{
3545 PyObject **buf = data;
3546
3547 if (received < PyBytes_GET_SIZE(*buf))
3548 _PyBytes_Resize(buf, received);
3549 Py_XINCREF(*buf);
3550 return *buf;
3551}
3552
3553/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3554
3555static PyObject *
3556sock_recvmsg(PySocketSockObject *s, PyObject *args)
3557{
3558 Py_ssize_t bufsize, ancbufsize = 0;
3559 int flags = 0;
3560 struct iovec iov;
3561 PyObject *buf = NULL, *retval = NULL;
3562
3563 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3564 return NULL;
3565
3566 if (bufsize < 0) {
3567 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3568 return NULL;
3569 }
3570 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3571 return NULL;
3572 iov.iov_base = PyBytes_AS_STRING(buf);
3573 iov.iov_len = bufsize;
3574
3575 /* Note that we're passing a pointer to *our pointer* to the bytes
3576 object here (&buf); makeval_recvmsg() may incref the object, or
3577 deallocate it and set our pointer to NULL. */
3578 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3579 &makeval_recvmsg, &buf);
3580 Py_XDECREF(buf);
3581 return retval;
3582}
3583
3584PyDoc_STRVAR(recvmsg_doc,
3585"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3586\n\
3587Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3588socket. The ancbufsize argument sets the size in bytes of the\n\
3589internal buffer used to receive the ancillary data; it defaults to 0,\n\
3590meaning that no ancillary data will be received. Appropriate buffer\n\
3591sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3592CMSG_LEN(), and items which do not fit into the buffer might be\n\
3593truncated or discarded. The flags argument defaults to 0 and has the\n\
3594same meaning as for recv().\n\
3595\n\
3596The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3597The data item is a bytes object holding the non-ancillary data\n\
3598received. The ancdata item is a list of zero or more tuples\n\
3599(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3600(control messages) received: cmsg_level and cmsg_type are integers\n\
3601specifying the protocol level and protocol-specific type respectively,\n\
3602and cmsg_data is a bytes object holding the associated data. The\n\
3603msg_flags item is the bitwise OR of various flags indicating\n\
3604conditions on the received message; see your system documentation for\n\
3605details. If the receiving socket is unconnected, address is the\n\
3606address of the sending socket, if available; otherwise, its value is\n\
3607unspecified.\n\
3608\n\
3609If recvmsg() raises an exception after the system call returns, it\n\
3610will first attempt to close any file descriptors received via the\n\
3611SCM_RIGHTS mechanism.");
3612
3613
3614static PyObject *
3615makeval_recvmsg_into(ssize_t received, void *data)
3616{
3617 return PyLong_FromSsize_t(received);
3618}
3619
3620/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3621
3622static PyObject *
3623sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3624{
3625 Py_ssize_t ancbufsize = 0;
3626 int flags = 0;
3627 struct iovec *iovs = NULL;
3628 Py_ssize_t i, nitems, nbufs = 0;
3629 Py_buffer *bufs = NULL;
3630 PyObject *buffers_arg, *fast, *retval = NULL;
3631
3632 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3633 &buffers_arg, &ancbufsize, &flags))
3634 return NULL;
3635
3636 if ((fast = PySequence_Fast(buffers_arg,
3637 "recvmsg_into() argument 1 must be an "
3638 "iterable")) == NULL)
3639 return NULL;
3640 nitems = PySequence_Fast_GET_SIZE(fast);
3641 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003642 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003643 goto finally;
3644 }
3645
3646 /* Fill in an iovec for each item, and save the Py_buffer
3647 structs to release afterwards. */
3648 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3649 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3650 PyErr_NoMemory();
3651 goto finally;
3652 }
3653 for (; nbufs < nitems; nbufs++) {
3654 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3655 "w*;recvmsg_into() argument 1 must be an iterable "
3656 "of single-segment read-write buffers",
3657 &bufs[nbufs]))
3658 goto finally;
3659 iovs[nbufs].iov_base = bufs[nbufs].buf;
3660 iovs[nbufs].iov_len = bufs[nbufs].len;
3661 }
3662
3663 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3664 &makeval_recvmsg_into, NULL);
3665finally:
3666 for (i = 0; i < nbufs; i++)
3667 PyBuffer_Release(&bufs[i]);
3668 PyMem_Free(bufs);
3669 PyMem_Free(iovs);
3670 Py_DECREF(fast);
3671 return retval;
3672}
3673
3674PyDoc_STRVAR(recvmsg_into_doc,
3675"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3676\n\
3677Receive normal data and ancillary data from the socket, scattering the\n\
3678non-ancillary data into a series of buffers. The buffers argument\n\
3679must be an iterable of objects that export writable buffers\n\
3680(e.g. bytearray objects); these will be filled with successive chunks\n\
3681of the non-ancillary data until it has all been written or there are\n\
3682no more buffers. The ancbufsize argument sets the size in bytes of\n\
3683the internal buffer used to receive the ancillary data; it defaults to\n\
36840, meaning that no ancillary data will be received. Appropriate\n\
3685buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3686or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3687truncated or discarded. The flags argument defaults to 0 and has the\n\
3688same meaning as for recv().\n\
3689\n\
3690The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3691The nbytes item is the total number of bytes of non-ancillary data\n\
3692written into the buffers. The ancdata item is a list of zero or more\n\
3693tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3694data (control messages) received: cmsg_level and cmsg_type are\n\
3695integers specifying the protocol level and protocol-specific type\n\
3696respectively, and cmsg_data is a bytes object holding the associated\n\
3697data. The msg_flags item is the bitwise OR of various flags\n\
3698indicating conditions on the received message; see your system\n\
3699documentation for details. If the receiving socket is unconnected,\n\
3700address is the address of the sending socket, if available; otherwise,\n\
3701its value is unspecified.\n\
3702\n\
3703If recvmsg_into() raises an exception after the system call returns,\n\
3704it will first attempt to close any file descriptors received via the\n\
3705SCM_RIGHTS mechanism.");
3706#endif /* CMSG_LEN */
3707
3708
Victor Stinner31bf2d52015-04-01 21:57:09 +02003709struct sock_send {
3710 char *buf;
3711 Py_ssize_t len;
3712 int flags;
3713 Py_ssize_t result;
3714};
3715
3716static int
3717sock_send_impl(PySocketSockObject *s, void *data)
3718{
3719 struct sock_send *ctx = data;
3720
3721#ifdef MS_WINDOWS
3722 if (ctx->len > INT_MAX)
3723 ctx->len = INT_MAX;
3724 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3725#else
3726 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3727#endif
3728 return (ctx->result >= 0);
3729}
3730
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003731/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003732
Guido van Rossum73624e91994-10-10 17:59:00 +00003733static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003734sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003735{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003736 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003738 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3741 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 if (!IS_SELECTABLE(s)) {
3744 PyBuffer_Release(&pbuf);
3745 return select_error();
3746 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003747 ctx.buf = pbuf.buf;
3748 ctx.len = pbuf.len;
3749 ctx.flags = flags;
3750 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003751 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 return NULL;
3753 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003754 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003755
3756 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003757}
3758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003759PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003760"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003761\n\
3762Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003763argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003764sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003765
3766
3767/* s.sendall(data [,flags]) method */
3768
3769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003770sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003773 Py_ssize_t len, n;
3774 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003776 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003777 int has_timeout = (s->sock_timeout > 0);
3778 _PyTime_t interval = s->sock_timeout;
3779 _PyTime_t deadline = 0;
3780 int deadline_initialized = 0;
3781 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3784 return NULL;
3785 buf = pbuf.buf;
3786 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 if (!IS_SELECTABLE(s)) {
3789 PyBuffer_Release(&pbuf);
3790 return select_error();
3791 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003794 if (has_timeout) {
3795 if (deadline_initialized) {
3796 /* recompute the timeout */
3797 interval = deadline - _PyTime_GetMonotonicClock();
3798 }
3799 else {
3800 deadline_initialized = 1;
3801 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3802 }
3803
3804 if (interval <= 0) {
3805 PyErr_SetString(socket_timeout, "timed out");
3806 goto done;
3807 }
3808 }
3809
Victor Stinner02f32ab2015-04-01 22:53:26 +02003810 ctx.buf = buf;
3811 ctx.len = len;
3812 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003813 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3814 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003815 n = ctx.result;
3816 assert(n >= 0);
3817
3818 buf += n;
3819 len -= n;
3820
3821 /* We must run our signal handlers before looping again.
3822 send() can return a successful partial write when it is
3823 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003824 if (PyErr_CheckSignals())
3825 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003826 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003828
Victor Stinner8912d142015-04-06 23:16:34 +02003829 Py_INCREF(Py_None);
3830 res = Py_None;
3831
3832done:
3833 PyBuffer_Release(&pbuf);
3834 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003835}
3836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003837PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003838"sendall(data[, flags])\n\
3839\n\
3840Send a data string to the socket. For the optional flags\n\
3841argument, see the Unix manual. This calls send() repeatedly\n\
3842until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003843to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003844
Guido van Rossum30a685f1991-06-27 15:51:29 +00003845
Victor Stinner31bf2d52015-04-01 21:57:09 +02003846struct sock_sendto {
3847 char *buf;
3848 Py_ssize_t len;
3849 int flags;
3850 int addrlen;
3851 sock_addr_t *addrbuf;
3852 Py_ssize_t result;
3853};
3854
3855static int
3856sock_sendto_impl(PySocketSockObject *s, void *data)
3857{
3858 struct sock_sendto *ctx = data;
3859
3860#ifdef MS_WINDOWS
3861 if (ctx->len > INT_MAX)
3862 ctx->len = INT_MAX;
3863 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3864 SAS2SA(ctx->addrbuf), ctx->addrlen);
3865#else
3866 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3867 SAS2SA(ctx->addrbuf), ctx->addrlen);
3868#endif
3869 return (ctx->result >= 0);
3870}
3871
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003872/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003873
Guido van Rossum73624e91994-10-10 17:59:00 +00003874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003875sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 Py_buffer pbuf;
3878 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003879 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003880 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003881 int addrlen, flags;
3882 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003884 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003885 arglen = PyTuple_Size(args);
3886 switch (arglen) {
3887 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003888 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3889 return NULL;
3890 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003891 break;
3892 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003893 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3894 &pbuf, &flags, &addro)) {
3895 return NULL;
3896 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003897 break;
3898 default:
3899 PyErr_Format(PyExc_TypeError,
3900 "sendto() takes 2 or 3 arguments (%d given)",
3901 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003902 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 if (!IS_SELECTABLE(s)) {
3906 PyBuffer_Release(&pbuf);
3907 return select_error();
3908 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003910 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3911 PyBuffer_Release(&pbuf);
3912 return NULL;
3913 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003914
Victor Stinner31bf2d52015-04-01 21:57:09 +02003915 ctx.buf = pbuf.buf;
3916 ctx.len = pbuf.len;
3917 ctx.flags = flags;
3918 ctx.addrlen = addrlen;
3919 ctx.addrbuf = &addrbuf;
3920 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003921 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 return NULL;
3923 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003924 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003925
3926 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003927}
3928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003929PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003930"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003931\n\
3932Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003933For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003934
Guido van Rossum30a685f1991-06-27 15:51:29 +00003935
Victor Stinner35bee932015-04-02 12:28:07 +02003936/* The sendmsg() and recvmsg[_into]() methods require a working
3937 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3938#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003939struct sock_sendmsg {
3940 struct msghdr *msg;
3941 int flags;
3942 ssize_t result;
3943};
3944
3945static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003946sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3947 struct msghdr *msg,
3948 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3949 Py_ssize_t ndataparts, ndatabufs = 0;
3950 int result = -1;
3951 struct iovec *iovs = NULL;
3952 PyObject *data_fast = NULL;
3953 Py_buffer *databufs = NULL;
3954
3955 /* Fill in an iovec for each message part, and save the Py_buffer
3956 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003957 data_fast = PySequence_Fast(data_arg,
3958 "sendmsg() argument 1 must be an "
3959 "iterable");
3960 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003961 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003962 }
3963
Christian Heimesdffa3942016-09-05 23:54:41 +02003964 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3965 if (ndataparts > INT_MAX) {
3966 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3967 goto finally;
3968 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003969
Christian Heimesdffa3942016-09-05 23:54:41 +02003970 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003971 if (ndataparts > 0) {
3972 iovs = PyMem_New(struct iovec, ndataparts);
3973 if (iovs == NULL) {
3974 PyErr_NoMemory();
3975 goto finally;
3976 }
3977 msg->msg_iov = iovs;
3978
3979 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003980 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003981 PyErr_NoMemory();
3982 goto finally;
3983 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003984 }
3985 for (; ndatabufs < ndataparts; ndatabufs++) {
3986 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3987 "y*;sendmsg() argument 1 must be an iterable of "
3988 "bytes-like objects",
3989 &databufs[ndatabufs]))
3990 goto finally;
3991 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3992 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3993 }
3994 result = 0;
3995 finally:
3996 *databufsout = databufs;
3997 *ndatabufsout = ndatabufs;
3998 Py_XDECREF(data_fast);
3999 return result;
4000}
4001
4002static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004003sock_sendmsg_impl(PySocketSockObject *s, void *data)
4004{
4005 struct sock_sendmsg *ctx = data;
4006
4007 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4008 return (ctx->result >= 0);
4009}
4010
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004011/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4012
4013static PyObject *
4014sock_sendmsg(PySocketSockObject *s, PyObject *args)
4015{
Christian Heimesdffa3942016-09-05 23:54:41 +02004016 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004017 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004018 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004019 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004020 struct cmsginfo {
4021 int level;
4022 int type;
4023 Py_buffer data;
4024 } *cmsgs = NULL;
4025 void *controlbuf = NULL;
4026 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004027 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004028 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004029 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004030 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004031
4032 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004033 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004034 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004035 }
4036
4037 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004039 /* Parse destination address. */
4040 if (addr_arg != NULL && addr_arg != Py_None) {
4041 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4042 goto finally;
4043 msg.msg_name = &addrbuf;
4044 msg.msg_namelen = addrlen;
4045 }
4046
4047 /* Fill in an iovec for each message part, and save the Py_buffer
4048 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004049 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004050 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051 }
4052
4053 if (cmsg_arg == NULL)
4054 ncmsgs = 0;
4055 else {
4056 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4057 "sendmsg() argument 2 must be an "
4058 "iterable")) == NULL)
4059 goto finally;
4060 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4061 }
4062
4063#ifndef CMSG_SPACE
4064 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004065 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004066 "sending multiple control messages is not supported "
4067 "on this system");
4068 goto finally;
4069 }
4070#endif
4071 /* Save level, type and Py_buffer for each control message,
4072 and calculate total size. */
4073 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4074 PyErr_NoMemory();
4075 goto finally;
4076 }
4077 controllen = controllen_last = 0;
4078 while (ncmsgbufs < ncmsgs) {
4079 size_t bufsize, space;
4080
4081 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4082 "(iiy*):[sendmsg() ancillary data items]",
4083 &cmsgs[ncmsgbufs].level,
4084 &cmsgs[ncmsgbufs].type,
4085 &cmsgs[ncmsgbufs].data))
4086 goto finally;
4087 bufsize = cmsgs[ncmsgbufs++].data.len;
4088
4089#ifdef CMSG_SPACE
4090 if (!get_CMSG_SPACE(bufsize, &space)) {
4091#else
4092 if (!get_CMSG_LEN(bufsize, &space)) {
4093#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004094 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095 goto finally;
4096 }
4097 controllen += space;
4098 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004099 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100 goto finally;
4101 }
4102 controllen_last = controllen;
4103 }
4104
4105 /* Construct ancillary data block from control message info. */
4106 if (ncmsgbufs > 0) {
4107 struct cmsghdr *cmsgh = NULL;
4108
Victor Stinner52d61e42016-09-12 11:41:58 +02004109 controlbuf = PyMem_Malloc(controllen);
4110 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111 PyErr_NoMemory();
4112 goto finally;
4113 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004114 msg.msg_control = controlbuf;
4115
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116 msg.msg_controllen = controllen;
4117
4118 /* Need to zero out the buffer as a workaround for glibc's
4119 CMSG_NXTHDR() implementation. After getting the pointer to
4120 the next header, it checks its (uninitialized) cmsg_len
4121 member to see if the "message" fits in the buffer, and
4122 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004123 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124 memset(controlbuf, 0, controllen);
4125
4126 for (i = 0; i < ncmsgbufs; i++) {
4127 size_t msg_len, data_len = cmsgs[i].data.len;
4128 int enough_space = 0;
4129
4130 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4131 if (cmsgh == NULL) {
4132 PyErr_Format(PyExc_RuntimeError,
4133 "unexpected NULL result from %s()",
4134 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4135 goto finally;
4136 }
4137 if (!get_CMSG_LEN(data_len, &msg_len)) {
4138 PyErr_SetString(PyExc_RuntimeError,
4139 "item size out of range for CMSG_LEN()");
4140 goto finally;
4141 }
4142 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4143 size_t space;
4144
4145 cmsgh->cmsg_len = msg_len;
4146 if (get_cmsg_data_space(&msg, cmsgh, &space))
4147 enough_space = (space >= data_len);
4148 }
4149 if (!enough_space) {
4150 PyErr_SetString(PyExc_RuntimeError,
4151 "ancillary data does not fit in calculated "
4152 "space");
4153 goto finally;
4154 }
4155 cmsgh->cmsg_level = cmsgs[i].level;
4156 cmsgh->cmsg_type = cmsgs[i].type;
4157 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4158 }
4159 }
4160
4161 /* Make the system call. */
4162 if (!IS_SELECTABLE(s)) {
4163 select_error();
4164 goto finally;
4165 }
4166
Victor Stinner31bf2d52015-04-01 21:57:09 +02004167 ctx.msg = &msg;
4168 ctx.flags = flags;
4169 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004170 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004171
4172 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173
4174finally:
4175 PyMem_Free(controlbuf);
4176 for (i = 0; i < ncmsgbufs; i++)
4177 PyBuffer_Release(&cmsgs[i].data);
4178 PyMem_Free(cmsgs);
4179 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004180 PyMem_Free(msg.msg_iov);
4181 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004182 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004183 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185 return retval;
4186}
4187
4188PyDoc_STRVAR(sendmsg_doc,
4189"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4190\n\
4191Send normal and ancillary data to the socket, gathering the\n\
4192non-ancillary data from a series of buffers and concatenating it into\n\
4193a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004194data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004195The ancdata argument specifies the ancillary data (control messages)\n\
4196as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4197cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4198protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004199is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004200argument defaults to 0 and has the same meaning as for send(). If\n\
4201address is supplied and not None, it sets a destination address for\n\
4202the message. The return value is the number of bytes of non-ancillary\n\
4203data sent.");
4204#endif /* CMSG_LEN */
4205
Christian Heimesdffa3942016-09-05 23:54:41 +02004206#ifdef HAVE_SOCKADDR_ALG
4207static PyObject*
4208sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4209{
4210 PyObject *retval = NULL;
4211
4212 Py_ssize_t i, ndatabufs = 0;
4213 Py_buffer *databufs = NULL;
4214 PyObject *data_arg = NULL;
4215
4216 Py_buffer iv = {NULL, NULL};
4217
4218 PyObject *opobj = NULL;
4219 int op = -1;
4220
4221 PyObject *assoclenobj = NULL;
4222 int assoclen = -1;
4223
4224 unsigned int *uiptr;
4225 int flags = 0;
4226
4227 struct msghdr msg;
4228 struct cmsghdr *header = NULL;
4229 struct af_alg_iv *alg_iv = NULL;
4230 struct sock_sendmsg ctx;
4231 Py_ssize_t controllen;
4232 void *controlbuf = NULL;
4233 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4234
4235 if (self->sock_family != AF_ALG) {
4236 PyErr_SetString(PyExc_OSError,
4237 "algset is only supported for AF_ALG");
4238 return NULL;
4239 }
4240
4241 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4242 "|O$O!y*O!i:sendmsg_afalg", keywords,
4243 &data_arg,
4244 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004245 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004246 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004247 }
4248
4249 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004250
4251 /* op is a required, keyword-only argument >= 0 */
4252 if (opobj != NULL) {
4253 op = _PyLong_AsInt(opobj);
4254 }
4255 if (op < 0) {
4256 /* override exception from _PyLong_AsInt() */
4257 PyErr_SetString(PyExc_TypeError,
4258 "Invalid or missing argument 'op'");
4259 goto finally;
4260 }
4261 /* assoclen is optional but must be >= 0 */
4262 if (assoclenobj != NULL) {
4263 assoclen = _PyLong_AsInt(assoclenobj);
4264 if (assoclen == -1 && PyErr_Occurred()) {
4265 goto finally;
4266 }
4267 if (assoclen < 0) {
4268 PyErr_SetString(PyExc_TypeError,
4269 "assoclen must be positive");
4270 goto finally;
4271 }
4272 }
4273
4274 controllen = CMSG_SPACE(4);
4275 if (iv.buf != NULL) {
4276 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4277 }
4278 if (assoclen >= 0) {
4279 controllen += CMSG_SPACE(4);
4280 }
4281
4282 controlbuf = PyMem_Malloc(controllen);
4283 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004284 PyErr_NoMemory();
4285 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004286 }
4287 memset(controlbuf, 0, controllen);
4288
Christian Heimesdffa3942016-09-05 23:54:41 +02004289 msg.msg_controllen = controllen;
4290 msg.msg_control = controlbuf;
4291
4292 /* Fill in an iovec for each message part, and save the Py_buffer
4293 structs to release afterwards. */
4294 if (data_arg != NULL) {
4295 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4296 goto finally;
4297 }
4298 }
4299
4300 /* set operation to encrypt or decrypt */
4301 header = CMSG_FIRSTHDR(&msg);
4302 if (header == NULL) {
4303 PyErr_SetString(PyExc_RuntimeError,
4304 "unexpected NULL result from CMSG_FIRSTHDR");
4305 goto finally;
4306 }
4307 header->cmsg_level = SOL_ALG;
4308 header->cmsg_type = ALG_SET_OP;
4309 header->cmsg_len = CMSG_LEN(4);
4310 uiptr = (void*)CMSG_DATA(header);
4311 *uiptr = (unsigned int)op;
4312
4313 /* set initialization vector */
4314 if (iv.buf != NULL) {
4315 header = CMSG_NXTHDR(&msg, header);
4316 if (header == NULL) {
4317 PyErr_SetString(PyExc_RuntimeError,
4318 "unexpected NULL result from CMSG_NXTHDR(iv)");
4319 goto finally;
4320 }
4321 header->cmsg_level = SOL_ALG;
4322 header->cmsg_type = ALG_SET_IV;
4323 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4324 alg_iv = (void*)CMSG_DATA(header);
4325 alg_iv->ivlen = iv.len;
4326 memcpy(alg_iv->iv, iv.buf, iv.len);
4327 }
4328
4329 /* set length of associated data for AEAD */
4330 if (assoclen >= 0) {
4331 header = CMSG_NXTHDR(&msg, header);
4332 if (header == NULL) {
4333 PyErr_SetString(PyExc_RuntimeError,
4334 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4335 goto finally;
4336 }
4337 header->cmsg_level = SOL_ALG;
4338 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4339 header->cmsg_len = CMSG_LEN(4);
4340 uiptr = (void*)CMSG_DATA(header);
4341 *uiptr = (unsigned int)assoclen;
4342 }
4343
4344 ctx.msg = &msg;
4345 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004346 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004347 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004348 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004349
4350 retval = PyLong_FromSsize_t(ctx.result);
4351
4352 finally:
4353 PyMem_Free(controlbuf);
4354 if (iv.buf != NULL) {
4355 PyBuffer_Release(&iv);
4356 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004357 PyMem_Free(msg.msg_iov);
4358 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004359 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004360 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004361 PyMem_Free(databufs);
4362 return retval;
4363}
4364
4365PyDoc_STRVAR(sendmsg_afalg_doc,
4366"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4367\n\
4368Set operation mode, IV and length of associated data for an AF_ALG\n\
4369operation socket.");
4370#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371
Guido van Rossum30a685f1991-06-27 15:51:29 +00004372/* s.shutdown(how) method */
4373
Guido van Rossum73624e91994-10-10 17:59:00 +00004374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004375sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 int how;
4378 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004379
Serhiy Storchaka78980432013-01-15 01:12:17 +02004380 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 if (how == -1 && PyErr_Occurred())
4382 return NULL;
4383 Py_BEGIN_ALLOW_THREADS
4384 res = shutdown(s->sock_fd, how);
4385 Py_END_ALLOW_THREADS
4386 if (res < 0)
4387 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004388 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004389}
4390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004391PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004392"shutdown(flag)\n\
4393\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004394Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4395of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004396
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004397#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004398static PyObject*
4399sock_ioctl(PySocketSockObject *s, PyObject *arg)
4400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 unsigned long cmd = SIO_RCVALL;
4402 PyObject *argO;
4403 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4406 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 switch (cmd) {
4409 case SIO_RCVALL: {
4410 unsigned int option = RCVALL_ON;
4411 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4412 return NULL;
4413 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4414 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4415 return set_error();
4416 }
4417 return PyLong_FromUnsignedLong(recv); }
4418 case SIO_KEEPALIVE_VALS: {
4419 struct tcp_keepalive ka;
4420 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4421 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4422 return NULL;
4423 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4424 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4425 return set_error();
4426 }
4427 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004428#if defined(SIO_LOOPBACK_FAST_PATH)
4429 case SIO_LOOPBACK_FAST_PATH: {
4430 unsigned int option;
4431 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4432 return NULL;
4433 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4434 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4435 return set_error();
4436 }
4437 return PyLong_FromUnsignedLong(recv); }
4438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 default:
4440 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4441 return NULL;
4442 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004443}
4444PyDoc_STRVAR(sock_ioctl_doc,
4445"ioctl(cmd, option) -> long\n\
4446\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004447Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4448SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004449SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4450SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004451#endif
4452
4453#if defined(MS_WINDOWS)
4454static PyObject*
4455sock_share(PySocketSockObject *s, PyObject *arg)
4456{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004457 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004458 DWORD processId;
4459 int result;
4460
4461 if (!PyArg_ParseTuple(arg, "I", &processId))
4462 return NULL;
4463
4464 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004465 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004466 Py_END_ALLOW_THREADS
4467 if (result == SOCKET_ERROR)
4468 return set_error();
4469 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4470}
4471PyDoc_STRVAR(sock_share_doc,
4472"share(process_id) -> bytes\n\
4473\n\
4474Share the socket with another process. The target process id\n\
4475must be provided and the resulting bytes object passed to the target\n\
4476process. There the shared socket can be instantiated by calling\n\
4477socket.fromshare().");
4478
Christian Heimesfaf2f632008-01-06 16:59:19 +00004479
4480#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004481
4482/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004483
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004484static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4486 accept_doc},
4487 {"bind", (PyCFunction)sock_bind, METH_O,
4488 bind_doc},
4489 {"close", (PyCFunction)sock_close, METH_NOARGS,
4490 close_doc},
4491 {"connect", (PyCFunction)sock_connect, METH_O,
4492 connect_doc},
4493 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4494 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004495 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4496 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4498 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004499#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 {"getpeername", (PyCFunction)sock_getpeername,
4501 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 {"getsockname", (PyCFunction)sock_getsockname,
4504 METH_NOARGS, getsockname_doc},
4505 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4506 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004507#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4509 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004510#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004511#if defined(MS_WINDOWS)
4512 {"share", (PyCFunction)sock_share, METH_VARARGS,
4513 sock_share_doc},
4514#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004515 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 listen_doc},
4517 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4518 recv_doc},
4519 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4520 recv_into_doc},
4521 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4522 recvfrom_doc},
4523 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4524 recvfrom_into_doc},
4525 {"send", (PyCFunction)sock_send, METH_VARARGS,
4526 send_doc},
4527 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4528 sendall_doc},
4529 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4530 sendto_doc},
4531 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4532 setblocking_doc},
4533 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4534 settimeout_doc},
4535 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4536 gettimeout_doc},
4537 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4538 setsockopt_doc},
4539 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4540 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004541#ifdef CMSG_LEN
4542 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4543 recvmsg_doc},
4544 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4545 recvmsg_into_doc,},
4546 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4547 sendmsg_doc},
4548#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004549#ifdef HAVE_SOCKADDR_ALG
4550 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4551 sendmsg_afalg_doc},
4552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004554};
4555
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004556/* SockObject members */
4557static PyMemberDef sock_memberlist[] = {
4558 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4559 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4560 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004561 {0},
4562};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004563
Victor Stinner71694d52015-03-28 01:18:54 +01004564static PyGetSetDef sock_getsetlist[] = {
4565 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4566 {NULL} /* sentinel */
4567};
4568
Guido van Rossum73624e91994-10-10 17:59:00 +00004569/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004570 First close the file description. */
4571
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004572static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004573sock_finalize(PySocketSockObject *s)
4574{
4575 SOCKET_T fd;
4576 PyObject *error_type, *error_value, *error_traceback;
4577
4578 /* Save the current exception, if any. */
4579 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4580
Victor Stinnerd3afb622016-07-22 17:47:09 +02004581 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004582 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4583 /* Spurious errors can appear at shutdown */
4584 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4585 PyErr_WriteUnraisable((PyObject *)s);
4586 }
4587 }
4588
4589 /* Only close the socket *after* logging the ResourceWarning warning
4590 to allow the logger to call socket methods like
4591 socket.getsockname(). If the socket is closed before, socket
4592 methods fails with the EBADF error. */
4593 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004594 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004595
4596 /* We do not want to retry upon EINTR: see sock_close() */
4597 Py_BEGIN_ALLOW_THREADS
4598 (void) SOCKETCLOSE(fd);
4599 Py_END_ALLOW_THREADS
4600 }
4601
4602 /* Restore the saved exception. */
4603 PyErr_Restore(error_type, error_value, error_traceback);
4604}
4605
4606static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004607sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004608{
Victor Stinner19a8e842016-03-21 16:36:48 +01004609 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4610 return;
4611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004613}
4614
Guido van Rossum30a685f1991-06-27 15:51:29 +00004615
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004616static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004617sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004618{
Victor Stinnere254e532014-07-26 14:36:55 +02004619 long sock_fd;
4620 /* On Windows, this test is needed because SOCKET_T is unsigned */
4621 if (s->sock_fd == INVALID_SOCKET) {
4622 sock_fd = -1;
4623 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004624#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004625 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 /* this can occur on Win64, and actually there is a special
4627 ugly printf formatter for decimal pointer length integer
4628 printing, only bother if necessary*/
4629 PyErr_SetString(PyExc_OverflowError,
4630 "no printf formatter to display "
4631 "the socket descriptor in decimal");
4632 return NULL;
4633 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004634#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004635 else
4636 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 return PyUnicode_FromFormat(
4638 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004639 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 s->sock_type,
4641 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004642}
4643
4644
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004645/* Create a new, uninitialized socket object. */
4646
4647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004648sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 new = type->tp_alloc(type, 0);
4653 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004654 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004655 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 ((PySocketSockObject *)new)->errorhandler = &set_error;
4657 }
4658 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004659}
4660
4661
4662/* Initialize a new socket object. */
4663
Victor Stinnerdaf45552013-08-28 00:53:59 +02004664#ifdef SOCK_CLOEXEC
4665/* socket() and socketpair() fail with EINVAL on Linux kernel older
4666 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4667static int sock_cloexec_works = -1;
4668#endif
4669
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004670/*ARGSUSED*/
4671static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004672sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 PySocketSockObject *s = (PySocketSockObject *)self;
4675 PyObject *fdobj = NULL;
4676 SOCKET_T fd = INVALID_SOCKET;
4677 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4678 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004679#ifndef MS_WINDOWS
4680#ifdef SOCK_CLOEXEC
4681 int *atomic_flag_works = &sock_cloexec_works;
4682#else
4683 int *atomic_flag_works = NULL;
4684#endif
4685#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4688 "|iiiO:socket", keywords,
4689 &family, &type, &proto, &fdobj))
4690 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004693#ifdef MS_WINDOWS
4694 /* recreate a socket that was duplicated */
4695 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004696 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004697 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4698 PyErr_Format(PyExc_ValueError,
4699 "socket descriptor string has wrong size, "
4700 "should be %zu bytes.", sizeof(info));
4701 return -1;
4702 }
4703 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4704 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004705 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004706 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4707 Py_END_ALLOW_THREADS
4708 if (fd == INVALID_SOCKET) {
4709 set_error();
4710 return -1;
4711 }
4712 family = info.iAddressFamily;
4713 type = info.iSocketType;
4714 proto = info.iProtocol;
4715 }
4716 else
4717#endif
4718 {
4719 fd = PyLong_AsSocket_t(fdobj);
4720 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4721 return -1;
4722 if (fd == INVALID_SOCKET) {
4723 PyErr_SetString(PyExc_ValueError,
4724 "can't use invalid socket value");
4725 return -1;
4726 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 }
4728 }
4729 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004730#ifdef MS_WINDOWS
4731 /* Windows implementation */
4732#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4733#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4734#endif
4735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004737 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004738 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004739 NULL, 0,
4740 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4741 if (fd == INVALID_SOCKET) {
4742 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4743 support_wsa_no_inherit = 0;
4744 fd = socket(family, type, proto);
4745 }
4746 }
4747 else {
4748 fd = socket(family, type, proto);
4749 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 if (fd == INVALID_SOCKET) {
4753 set_error();
4754 return -1;
4755 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004756
4757 if (!support_wsa_no_inherit) {
4758 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4759 closesocket(fd);
4760 PyErr_SetFromWindowsErr(0);
4761 return -1;
4762 }
4763 }
4764#else
4765 /* UNIX */
4766 Py_BEGIN_ALLOW_THREADS
4767#ifdef SOCK_CLOEXEC
4768 if (sock_cloexec_works != 0) {
4769 fd = socket(family, type | SOCK_CLOEXEC, proto);
4770 if (sock_cloexec_works == -1) {
4771 if (fd >= 0) {
4772 sock_cloexec_works = 1;
4773 }
4774 else if (errno == EINVAL) {
4775 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4776 sock_cloexec_works = 0;
4777 fd = socket(family, type, proto);
4778 }
4779 }
4780 }
4781 else
4782#endif
4783 {
4784 fd = socket(family, type, proto);
4785 }
4786 Py_END_ALLOW_THREADS
4787
4788 if (fd == INVALID_SOCKET) {
4789 set_error();
4790 return -1;
4791 }
4792
4793 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4794 SOCKETCLOSE(fd);
4795 return -1;
4796 }
4797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004799 if (init_sockobject(s, fd, family, type, proto) == -1) {
4800 SOCKETCLOSE(fd);
4801 return -1;
4802 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004805
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004806}
4807
4808
Guido van Rossumb6775db1994-08-01 11:34:53 +00004809/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004810
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004811static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4813 "_socket.socket", /* tp_name */
4814 sizeof(PySocketSockObject), /* tp_basicsize */
4815 0, /* tp_itemsize */
4816 (destructor)sock_dealloc, /* tp_dealloc */
4817 0, /* tp_print */
4818 0, /* tp_getattr */
4819 0, /* tp_setattr */
4820 0, /* tp_reserved */
4821 (reprfunc)sock_repr, /* tp_repr */
4822 0, /* tp_as_number */
4823 0, /* tp_as_sequence */
4824 0, /* tp_as_mapping */
4825 0, /* tp_hash */
4826 0, /* tp_call */
4827 0, /* tp_str */
4828 PyObject_GenericGetAttr, /* tp_getattro */
4829 0, /* tp_setattro */
4830 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004831 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4832 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 sock_doc, /* tp_doc */
4834 0, /* tp_traverse */
4835 0, /* tp_clear */
4836 0, /* tp_richcompare */
4837 0, /* tp_weaklistoffset */
4838 0, /* tp_iter */
4839 0, /* tp_iternext */
4840 sock_methods, /* tp_methods */
4841 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004842 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 0, /* tp_base */
4844 0, /* tp_dict */
4845 0, /* tp_descr_get */
4846 0, /* tp_descr_set */
4847 0, /* tp_dictoffset */
4848 sock_initobj, /* tp_init */
4849 PyType_GenericAlloc, /* tp_alloc */
4850 sock_new, /* tp_new */
4851 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004852 0, /* tp_is_gc */
4853 0, /* tp_bases */
4854 0, /* tp_mro */
4855 0, /* tp_cache */
4856 0, /* tp_subclasses */
4857 0, /* tp_weaklist */
4858 0, /* tp_del */
4859 0, /* tp_version_tag */
4860 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004861};
4862
Guido van Rossum30a685f1991-06-27 15:51:29 +00004863
Guido van Rossum81194471991-07-27 21:42:02 +00004864/* Python interface to gethostname(). */
4865
4866/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004867static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004868socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004869{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004870#ifdef MS_WINDOWS
4871 /* Don't use winsock's gethostname, as this returns the ANSI
4872 version of the hostname, whereas we need a Unicode string.
4873 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004874 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004875 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004876 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004877 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004878
4879 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004880 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004881
4882 if (GetLastError() != ERROR_MORE_DATA)
4883 return PyErr_SetFromWindowsErr(0);
4884
4885 if (size == 0)
4886 return PyUnicode_New(0, 0);
4887
4888 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4889 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004890 name = PyMem_New(wchar_t, size);
4891 if (!name) {
4892 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004893 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004894 }
Victor Stinner74168972011-11-17 01:11:36 +01004895 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4896 name,
4897 &size))
4898 {
4899 PyMem_Free(name);
4900 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004901 }
Victor Stinner74168972011-11-17 01:11:36 +01004902
4903 result = PyUnicode_FromWideChar(name, size);
4904 PyMem_Free(name);
4905 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004906#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 char buf[1024];
4908 int res;
4909 Py_BEGIN_ALLOW_THREADS
4910 res = gethostname(buf, (int) sizeof buf - 1);
4911 Py_END_ALLOW_THREADS
4912 if (res < 0)
4913 return set_error();
4914 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004915 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004916#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004917}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004918
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004919PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004920"gethostname() -> string\n\
4921\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004922Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004923
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004924#ifdef HAVE_SETHOSTNAME
4925PyDoc_STRVAR(sethostname_doc,
4926"sethostname(name)\n\n\
4927Sets the hostname to name.");
4928
4929static PyObject *
4930socket_sethostname(PyObject *self, PyObject *args)
4931{
4932 PyObject *hnobj;
4933 Py_buffer buf;
4934 int res, flag = 0;
4935
Christian Heimesd2774c72013-06-19 02:06:29 +02004936#ifdef _AIX
4937/* issue #18259, not declared in any useful header file */
4938extern int sethostname(const char *, size_t);
4939#endif
4940
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004941 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4942 PyErr_Clear();
4943 if (!PyArg_ParseTuple(args, "O&:sethostname",
4944 PyUnicode_FSConverter, &hnobj))
4945 return NULL;
4946 flag = 1;
4947 }
4948 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4949 if (!res) {
4950 res = sethostname(buf.buf, buf.len);
4951 PyBuffer_Release(&buf);
4952 }
4953 if (flag)
4954 Py_DECREF(hnobj);
4955 if (res)
4956 return set_error();
4957 Py_RETURN_NONE;
4958}
4959#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004960
Guido van Rossum30a685f1991-06-27 15:51:29 +00004961/* Python interface to gethostbyname(name). */
4962
4963/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004964static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004965socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 char *name;
4968 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004969 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004970
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004971 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 return NULL;
4973 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004974 goto finally;
4975 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4976finally:
4977 PyMem_Free(name);
4978 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004979}
4980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004981PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004982"gethostbyname(host) -> address\n\
4983\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004984Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004985
4986
Victor Stinner72400302016-01-28 15:41:01 +01004987static PyObject*
4988sock_decode_hostname(const char *name)
4989{
4990#ifdef MS_WINDOWS
4991 /* Issue #26227: gethostbyaddr() returns a string encoded
4992 * to the ANSI code page */
4993 return PyUnicode_DecodeFSDefault(name);
4994#else
4995 /* Decode from UTF-8 */
4996 return PyUnicode_FromString(name);
4997#endif
4998}
4999
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005000/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5001
5002static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005003gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 char **pch;
5006 PyObject *rtn_tuple = (PyObject *)NULL;
5007 PyObject *name_list = (PyObject *)NULL;
5008 PyObject *addr_list = (PyObject *)NULL;
5009 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005010 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 if (h == NULL) {
5013 /* Let's get real error message to return */
5014 set_herror(h_errno);
5015 return NULL;
5016 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (h->h_addrtype != af) {
5019 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005020 errno = EAFNOSUPPORT;
5021 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 return NULL;
5023 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 case AF_INET:
5028 if (alen < sizeof(struct sockaddr_in))
5029 return NULL;
5030 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005031
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005032#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 case AF_INET6:
5034 if (alen < sizeof(struct sockaddr_in6))
5035 return NULL;
5036 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005037#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 if ((name_list = PyList_New(0)) == NULL)
5042 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 if ((addr_list = PyList_New(0)) == NULL)
5045 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 /* SF #1511317: h_aliases can be NULL */
5048 if (h->h_aliases) {
5049 for (pch = h->h_aliases; *pch != NULL; pch++) {
5050 int status;
5051 tmp = PyUnicode_FromString(*pch);
5052 if (tmp == NULL)
5053 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 status = PyList_Append(name_list, tmp);
5056 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if (status)
5059 goto err;
5060 }
5061 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5064 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 case AF_INET:
5069 {
5070 struct sockaddr_in sin;
5071 memset(&sin, 0, sizeof(sin));
5072 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005073#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005075#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5077 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 if (pch == h->h_addr_list && alen >= sizeof(sin))
5080 memcpy((char *) addr, &sin, sizeof(sin));
5081 break;
5082 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005083
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005084#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 case AF_INET6:
5086 {
5087 struct sockaddr_in6 sin6;
5088 memset(&sin6, 0, sizeof(sin6));
5089 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005090#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5094 tmp = makeipaddr((struct sockaddr *)&sin6,
5095 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5098 memcpy((char *) addr, &sin6, sizeof(sin6));
5099 break;
5100 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005101#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005104 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 "unsupported address family");
5106 return NULL;
5107 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 if (tmp == NULL)
5110 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 status = PyList_Append(addr_list, tmp);
5113 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 if (status)
5116 goto err;
5117 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005118
Victor Stinner72400302016-01-28 15:41:01 +01005119 name = sock_decode_hostname(h->h_name);
5120 if (name == NULL)
5121 goto err;
5122 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005123
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005124 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 Py_XDECREF(name_list);
5126 Py_XDECREF(addr_list);
5127 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005128}
5129
5130
5131/* Python interface to gethostbyname_ex(name). */
5132
5133/*ARGSUSED*/
5134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005135socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 char *name;
5138 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005139 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005141 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005142#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005144#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 char buf[16384];
5148 int buf_len = (sizeof buf) - 1;
5149 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005150#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005151#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005153#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005154#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005155
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005156 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005158 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005159 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005161#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005162#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005163 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005165#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005167#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 memset((void *) &data, '\0', sizeof(data));
5169 result = gethostbyname_r(name, &hp_allocated, &data);
5170 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005171#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005172#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005173#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005175#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005176 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005178#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 Py_END_ALLOW_THREADS
5180 /* Some C libraries would require addr.__ss_family instead of
5181 addr.ss_family.
5182 Therefore, we cast the sockaddr_storage into sockaddr to
5183 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005184 sa = SAS2SA(&addr);
5185 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005187#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005189#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005190finally:
5191 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005193}
5194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005195PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005196"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5197\n\
5198Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005199for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005200
5201
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005202/* Python interface to gethostbyaddr(IP). */
5203
5204/*ARGSUSED*/
5205static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005206socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005207{
Charles-François Natali8b759652011-12-23 16:44:51 +01005208 sock_addr_t addr;
5209 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 char *ip_num;
5211 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005212 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005213#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005215#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005217#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 /* glibcs up to 2.10 assume that the buf argument to
5219 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5220 does not ensure. The attribute below instructs the compiler
5221 to maintain this alignment. */
5222 char buf[16384] Py_ALIGNED(8);
5223 int buf_len = (sizeof buf) - 1;
5224 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005225#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005226#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005228#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005229#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 char *ap;
5231 int al;
5232 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005233
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005234 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 return NULL;
5236 af = AF_UNSPEC;
5237 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005238 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 af = sa->sa_family;
5240 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005241 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 switch (af) {
5243 case AF_INET:
5244 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5245 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5246 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005247#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 case AF_INET6:
5249 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5250 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5251 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005254 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005255 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 }
5257 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005258#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005259#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005260 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 &hp_allocated, buf, buf_len,
5262 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005263#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 h = gethostbyaddr_r(ap, al, af,
5265 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005266#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 memset((void *) &data, '\0', sizeof(data));
5268 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5269 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005270#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005271#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005272#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005274#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005275 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005277#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005279 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005280#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005282#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005283finally:
5284 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005286}
5287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005288PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005289"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5290\n\
5291Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005292for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005293
Guido van Rossum30a685f1991-06-27 15:51:29 +00005294
5295/* Python interface to getservbyname(name).
5296 This only returns the port number, since the other info is already
5297 known or not useful (like the list of aliases). */
5298
5299/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005301socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 char *name, *proto=NULL;
5304 struct servent *sp;
5305 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5306 return NULL;
5307 Py_BEGIN_ALLOW_THREADS
5308 sp = getservbyname(name, proto);
5309 Py_END_ALLOW_THREADS
5310 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005311 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 return NULL;
5313 }
5314 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005315}
5316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005317PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005318"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005319\n\
5320Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005321The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5322otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005323
Guido van Rossum30a685f1991-06-27 15:51:29 +00005324
Barry Warsaw11b91a02004-06-28 00:50:43 +00005325/* Python interface to getservbyport(port).
5326 This only returns the service name, since the other info is already
5327 known or not useful (like the list of aliases). */
5328
5329/*ARGSUSED*/
5330static PyObject *
5331socket_getservbyport(PyObject *self, PyObject *args)
5332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 int port;
5334 char *proto=NULL;
5335 struct servent *sp;
5336 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5337 return NULL;
5338 if (port < 0 || port > 0xffff) {
5339 PyErr_SetString(
5340 PyExc_OverflowError,
5341 "getservbyport: port must be 0-65535.");
5342 return NULL;
5343 }
5344 Py_BEGIN_ALLOW_THREADS
5345 sp = getservbyport(htons((short)port), proto);
5346 Py_END_ALLOW_THREADS
5347 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005348 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 return NULL;
5350 }
5351 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005352}
5353
5354PyDoc_STRVAR(getservbyport_doc,
5355"getservbyport(port[, protocolname]) -> string\n\
5356\n\
5357Return the service name from a port number and protocol name.\n\
5358The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5359otherwise any protocol will match.");
5360
Guido van Rossum3901d851996-12-19 16:35:04 +00005361/* Python interface to getprotobyname(name).
5362 This only returns the protocol number, since the other info is
5363 already known or not useful (like the list of aliases). */
5364
5365/*ARGSUSED*/
5366static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005367socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 char *name;
5370 struct protoent *sp;
5371 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5372 return NULL;
5373 Py_BEGIN_ALLOW_THREADS
5374 sp = getprotobyname(name);
5375 Py_END_ALLOW_THREADS
5376 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005377 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 return NULL;
5379 }
5380 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005381}
5382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005383PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005384"getprotobyname(name) -> integer\n\
5385\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005386Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005387
Guido van Rossum3901d851996-12-19 16:35:04 +00005388
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005389#ifndef NO_DUP
5390/* dup() function for socket fds */
5391
5392static PyObject *
5393socket_dup(PyObject *self, PyObject *fdobj)
5394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 SOCKET_T fd, newfd;
5396 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005397#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005398 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005399#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 fd = PyLong_AsSocket_t(fdobj);
5402 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5403 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005404
Victor Stinnerdaf45552013-08-28 00:53:59 +02005405#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005406 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005407 return set_error();
5408
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005409 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005410 FROM_PROTOCOL_INFO,
5411 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 if (newfd == INVALID_SOCKET)
5413 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005414
Victor Stinnerdaf45552013-08-28 00:53:59 +02005415 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5416 closesocket(newfd);
5417 PyErr_SetFromWindowsErr(0);
5418 return NULL;
5419 }
5420#else
5421 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5422 newfd = _Py_dup(fd);
5423 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005424 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005425#endif
5426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 newfdobj = PyLong_FromSocket_t(newfd);
5428 if (newfdobj == NULL)
5429 SOCKETCLOSE(newfd);
5430 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005431}
5432
5433PyDoc_STRVAR(dup_doc,
5434"dup(integer) -> integer\n\
5435\n\
5436Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5437sockets; on some platforms os.dup() won't work for socket file descriptors.");
5438#endif
5439
5440
Dave Cole331708b2004-08-09 04:51:41 +00005441#ifdef HAVE_SOCKETPAIR
5442/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005443 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005444 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005445
5446/*ARGSUSED*/
5447static PyObject *
5448socket_socketpair(PyObject *self, PyObject *args)
5449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 PySocketSockObject *s0 = NULL, *s1 = NULL;
5451 SOCKET_T sv[2];
5452 int family, type = SOCK_STREAM, proto = 0;
5453 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005454#ifdef SOCK_CLOEXEC
5455 int *atomic_flag_works = &sock_cloexec_works;
5456#else
5457 int *atomic_flag_works = NULL;
5458#endif
5459 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005460
5461#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5467 &family, &type, &proto))
5468 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005471 Py_BEGIN_ALLOW_THREADS
5472#ifdef SOCK_CLOEXEC
5473 if (sock_cloexec_works != 0) {
5474 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5475 if (sock_cloexec_works == -1) {
5476 if (ret >= 0) {
5477 sock_cloexec_works = 1;
5478 }
5479 else if (errno == EINVAL) {
5480 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5481 sock_cloexec_works = 0;
5482 ret = socketpair(family, type, proto, sv);
5483 }
5484 }
5485 }
5486 else
5487#endif
5488 {
5489 ret = socketpair(family, type, proto, sv);
5490 }
5491 Py_END_ALLOW_THREADS
5492
5493 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005495
5496 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5497 goto finally;
5498 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5499 goto finally;
5500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 s0 = new_sockobject(sv[0], family, type, proto);
5502 if (s0 == NULL)
5503 goto finally;
5504 s1 = new_sockobject(sv[1], family, type, proto);
5505 if (s1 == NULL)
5506 goto finally;
5507 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005508
5509finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 if (res == NULL) {
5511 if (s0 == NULL)
5512 SOCKETCLOSE(sv[0]);
5513 if (s1 == NULL)
5514 SOCKETCLOSE(sv[1]);
5515 }
5516 Py_XDECREF(s0);
5517 Py_XDECREF(s1);
5518 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005519}
5520
5521PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005522"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005523\n\
5524Create a pair of socket objects from the sockets returned by the platform\n\
5525socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005526The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005527AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005528
5529#endif /* HAVE_SOCKETPAIR */
5530
5531
Guido van Rossum006bf911996-06-12 04:04:55 +00005532static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005533socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005534{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005535 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005536
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005537 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 return NULL;
5539 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005540 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005542 "ntohs: can't convert negative Python int to C "
5543 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 return NULL;
5545 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005546 if (x > 0xffff) {
5547 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5548 "ntohs: Python int too large to convert to C "
5549 "16-bit unsigned integer (The silent truncation "
5550 "is deprecated)",
5551 1)) {
5552 return NULL;
5553 }
5554 }
5555 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005556}
5557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005558PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005559"ntohs(integer) -> integer\n\
5560\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005561Convert a 16-bit unsigned integer from network to host byte order.\n\
5562Note that in case the received integer does not fit in 16-bit unsigned\n\
5563integer, but does fit in a positive C int, it is silently truncated to\n\
556416-bit unsigned integer.\n\
5565However, this silent truncation feature is deprecated, and will raise an \n\
5566exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005567
5568
Guido van Rossum006bf911996-06-12 04:04:55 +00005569static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005570socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 if (PyLong_Check(arg)) {
5575 x = PyLong_AsUnsignedLong(arg);
5576 if (x == (unsigned long) -1 && PyErr_Occurred())
5577 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005578#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 {
5580 unsigned long y;
5581 /* only want the trailing 32 bits */
5582 y = x & 0xFFFFFFFFUL;
5583 if (y ^ x)
5584 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005585 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 x = y;
5587 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 }
5590 else
5591 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005592 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005595}
5596
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005597PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005598"ntohl(integer) -> integer\n\
5599\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005600Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005601
5602
Guido van Rossum006bf911996-06-12 04:04:55 +00005603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005604socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005605{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005606 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005607
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005608 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 return NULL;
5610 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005611 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005613 "htons: can't convert negative Python int to C "
5614 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 return NULL;
5616 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005617 if (x > 0xffff) {
5618 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5619 "htons: Python int too large to convert to C "
5620 "16-bit unsigned integer (The silent truncation "
5621 "is deprecated)",
5622 1)) {
5623 return NULL;
5624 }
5625 }
5626 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005627}
5628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005629PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005630"htons(integer) -> integer\n\
5631\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005632Convert a 16-bit unsigned integer from host to network byte order.\n\
5633Note that in case the received integer does not fit in 16-bit unsigned\n\
5634integer, but does fit in a positive C int, it is silently truncated to\n\
563516-bit unsigned integer.\n\
5636However, this silent truncation feature is deprecated, and will raise an \n\
5637exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005638
5639
Guido van Rossum006bf911996-06-12 04:04:55 +00005640static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005641socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 if (PyLong_Check(arg)) {
5646 x = PyLong_AsUnsignedLong(arg);
5647 if (x == (unsigned long) -1 && PyErr_Occurred())
5648 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005649#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 {
5651 unsigned long y;
5652 /* only want the trailing 32 bits */
5653 y = x & 0xFFFFFFFFUL;
5654 if (y ^ x)
5655 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005656 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 x = y;
5658 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 }
5661 else
5662 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005663 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 Py_TYPE(arg)->tp_name);
5665 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005666}
5667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005668PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005669"htonl(integer) -> integer\n\
5670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005671Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005672
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005673/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005674
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005675PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005676"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005677\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005678Convert 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 +00005679binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005680
5681static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005682socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005683{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005684#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005686#endif
5687
5688#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005689#if (SIZEOF_INT != 4)
5690#error "Not sure if in_addr_t exists and int is not 32-bits."
5691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 /* Have to use inet_addr() instead */
5693 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5698 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005699
Tim Peters1df9fdd2003-02-13 03:13:40 +00005700
5701#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005702
5703#ifdef USE_INET_ATON_WEAKLINK
5704 if (inet_aton != NULL) {
5705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 if (inet_aton(ip_addr, &buf))
5707 return PyBytes_FromStringAndSize((char *)(&buf),
5708 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005709
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005710 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 "illegal IP address string passed to inet_aton");
5712 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005713
Thomas Wouters477c8d52006-05-27 19:21:47 +00005714#ifdef USE_INET_ATON_WEAKLINK
5715 } else {
5716#endif
5717
5718#endif
5719
5720#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 /* special-case this address as inet_addr might return INADDR_NONE
5723 * for this */
5724 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005725 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005727
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005728 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005732 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 "illegal IP address string passed to inet_aton");
5734 return NULL;
5735 }
5736 }
5737 return PyBytes_FromStringAndSize((char *) &packed_addr,
5738 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005739
5740#ifdef USE_INET_ATON_WEAKLINK
5741 }
5742#endif
5743
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005744#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005745}
5746
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005747PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005748"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005749\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005750Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005751
5752static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005753socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005754{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005755 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005757
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005758 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 return NULL;
5760 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005761
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005762 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005763 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005765 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 return NULL;
5767 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005768
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005769 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5770 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005771
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005772 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005774}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005775
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005776#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005777
5778PyDoc_STRVAR(inet_pton_doc,
5779"inet_pton(af, ip) -> packed IP address string\n\
5780\n\
5781Convert an IP address from string format to a packed string suitable\n\
5782for use with low-level network functions.");
5783
5784static PyObject *
5785socket_inet_pton(PyObject *self, PyObject *args)
5786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 int af;
5788 char* ip;
5789 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005790#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005791 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005792#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5796 return NULL;
5797 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005798
Martin v. Löwis04697e82004-06-02 12:35:29 +00005799#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005801 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 "can't use AF_INET6, IPv6 is disabled");
5803 return NULL;
5804 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005805#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 retval = inet_pton(af, ip, packed);
5808 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005809 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 return NULL;
5811 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005812 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 "illegal IP address string passed to inet_pton");
5814 return NULL;
5815 } else if (af == AF_INET) {
5816 return PyBytes_FromStringAndSize(packed,
5817 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005818#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819 } else if (af == AF_INET6) {
5820 return PyBytes_FromStringAndSize(packed,
5821 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005824 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 return NULL;
5826 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005827}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005828
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005829PyDoc_STRVAR(inet_ntop_doc,
5830"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5831\n\
5832Convert a packed IP address of the given family to string format.");
5833
5834static PyObject *
5835socket_inet_ntop(PyObject *self, PyObject *args)
5836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005838 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005840#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005841 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005842#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005843 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005844#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5847 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005848
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005849 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850 return NULL;
5851 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005854 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 PyErr_SetString(PyExc_ValueError,
5856 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005857 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 return NULL;
5859 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005860#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005862 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 PyErr_SetString(PyExc_ValueError,
5864 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005865 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 return NULL;
5867 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 } else {
5870 PyErr_Format(PyExc_ValueError,
5871 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005872 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 return NULL;
5874 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005875
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005876 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5877 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005879 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 return NULL;
5881 } else {
5882 return PyUnicode_FromString(retval);
5883 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005884}
5885
5886#endif /* HAVE_INET_PTON */
5887
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005888/* Python interface to getaddrinfo(host, port). */
5889
5890/*ARGSUSED*/
5891static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005892socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005893{
Victor Stinner77af1722011-05-26 14:05:59 +02005894 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005895 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 struct addrinfo hints, *res;
5897 struct addrinfo *res0 = NULL;
5898 PyObject *hobj = NULL;
5899 PyObject *pobj = (PyObject *)NULL;
5900 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005901 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 int family, socktype, protocol, flags;
5903 int error;
5904 PyObject *all = (PyObject *)NULL;
5905 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005906
Georg Brandl6083a4b2013-10-14 06:51:46 +02005907 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005909 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005910 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 &protocol, &flags)) {
5912 return NULL;
5913 }
5914 if (hobj == Py_None) {
5915 hptr = NULL;
5916 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005917 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 if (!idna)
5919 return NULL;
5920 assert(PyBytes_Check(idna));
5921 hptr = PyBytes_AS_STRING(idna);
5922 } else if (PyBytes_Check(hobj)) {
5923 hptr = PyBytes_AsString(hobj);
5924 } else {
5925 PyErr_SetString(PyExc_TypeError,
5926 "getaddrinfo() argument 1 must be string or None");
5927 return NULL;
5928 }
5929 if (PyLong_CheckExact(pobj)) {
5930 long value = PyLong_AsLong(pobj);
5931 if (value == -1 && PyErr_Occurred())
5932 goto err;
5933 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5934 pptr = pbuf;
5935 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005936 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005937 if (pptr == NULL)
5938 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005940 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 } else if (pobj == Py_None) {
5942 pptr = (char *)NULL;
5943 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005944 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 goto err;
5946 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005947#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005948 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5949 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005950 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5951 * This workaround avoids a segfault in libsystem.
5952 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005953 pptr = "00";
5954 }
5955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 memset(&hints, 0, sizeof(hints));
5957 hints.ai_family = family;
5958 hints.ai_socktype = socktype;
5959 hints.ai_protocol = protocol;
5960 hints.ai_flags = flags;
5961 Py_BEGIN_ALLOW_THREADS
5962 ACQUIRE_GETADDRINFO_LOCK
5963 error = getaddrinfo(hptr, pptr, &hints, &res0);
5964 Py_END_ALLOW_THREADS
5965 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5966 if (error) {
5967 set_gaierror(error);
5968 goto err;
5969 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005970
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005971 all = PyList_New(0);
5972 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 goto err;
5974 for (res = res0; res; res = res->ai_next) {
5975 PyObject *single;
5976 PyObject *addr =
5977 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5978 if (addr == NULL)
5979 goto err;
5980 single = Py_BuildValue("iiisO", res->ai_family,
5981 res->ai_socktype, res->ai_protocol,
5982 res->ai_canonname ? res->ai_canonname : "",
5983 addr);
5984 Py_DECREF(addr);
5985 if (single == NULL)
5986 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 if (PyList_Append(all, single))
5989 goto err;
5990 Py_XDECREF(single);
5991 }
5992 Py_XDECREF(idna);
5993 if (res0)
5994 freeaddrinfo(res0);
5995 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005996 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 Py_XDECREF(all);
5998 Py_XDECREF(idna);
5999 if (res0)
6000 freeaddrinfo(res0);
6001 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006002}
6003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006004PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006005"getaddrinfo(host, port [, family, type, proto, flags])\n\
6006 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006007\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006008Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006009
6010/* Python interface to getnameinfo(sa, flags). */
6011
6012/*ARGSUSED*/
6013static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006014socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 PyObject *sa = (PyObject *)NULL;
6017 int flags;
6018 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006019 int port;
6020 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6022 struct addrinfo hints, *res = NULL;
6023 int error;
6024 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006025 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 flags = flowinfo = scope_id = 0;
6028 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6029 return NULL;
6030 if (!PyTuple_Check(sa)) {
6031 PyErr_SetString(PyExc_TypeError,
6032 "getnameinfo() argument 1 must be a tuple");
6033 return NULL;
6034 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006035 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006037 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006039 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006040 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006041 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006042 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006043 return NULL;
6044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6046 memset(&hints, 0, sizeof(hints));
6047 hints.ai_family = AF_UNSPEC;
6048 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006049 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 Py_BEGIN_ALLOW_THREADS
6051 ACQUIRE_GETADDRINFO_LOCK
6052 error = getaddrinfo(hostp, pbuf, &hints, &res);
6053 Py_END_ALLOW_THREADS
6054 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6055 if (error) {
6056 set_gaierror(error);
6057 goto fail;
6058 }
6059 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006060 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 "sockaddr resolved to multiple addresses");
6062 goto fail;
6063 }
6064 switch (res->ai_family) {
6065 case AF_INET:
6066 {
6067 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006068 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 "IPv4 sockaddr must be 2 tuple");
6070 goto fail;
6071 }
6072 break;
6073 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006074#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 case AF_INET6:
6076 {
6077 struct sockaddr_in6 *sin6;
6078 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006079 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 sin6->sin6_scope_id = scope_id;
6081 break;
6082 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006085 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6087 if (error) {
6088 set_gaierror(error);
6089 goto fail;
6090 }
Victor Stinner72400302016-01-28 15:41:01 +01006091
6092 name = sock_decode_hostname(hbuf);
6093 if (name == NULL)
6094 goto fail;
6095 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006096
6097fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 if (res)
6099 freeaddrinfo(res);
6100 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006101}
6102
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006103PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006104"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006106Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006107
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006108
6109/* Python API to getting and setting the default timeout value. */
6110
6111static PyObject *
6112socket_getdefaulttimeout(PyObject *self)
6113{
Victor Stinner71694d52015-03-28 01:18:54 +01006114 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006115 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 }
Victor Stinner71694d52015-03-28 01:18:54 +01006117 else {
6118 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6119 return PyFloat_FromDouble(seconds);
6120 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006121}
6122
6123PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006124"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006125\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006126Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006127A value of None indicates that new socket objects have no timeout.\n\
6128When the socket module is first imported, the default is None.");
6129
6130static PyObject *
6131socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6132{
Victor Stinner71694d52015-03-28 01:18:54 +01006133 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006134
Victor Stinner71694d52015-03-28 01:18:54 +01006135 if (socket_parse_timeout(&timeout, arg) < 0)
6136 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006139
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006140 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006141}
6142
6143PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006144"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006145\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006146Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006147A value of None indicates that new socket objects have no timeout.\n\
6148When the socket module is first imported, the default is None.");
6149
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006150#ifdef HAVE_IF_NAMEINDEX
6151/* Python API for getting interface indices and names */
6152
6153static PyObject *
6154socket_if_nameindex(PyObject *self, PyObject *arg)
6155{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006156 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006157 int i;
6158 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006159
Charles-François Natali60713592011-05-20 16:55:06 +02006160 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006161 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006162 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006163 return NULL;
6164 }
6165
6166 list = PyList_New(0);
6167 if (list == NULL) {
6168 if_freenameindex(ni);
6169 return NULL;
6170 }
6171
Charles-François Natali60713592011-05-20 16:55:06 +02006172 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6173 PyObject *ni_tuple = Py_BuildValue("IO&",
6174 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006175
6176 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6177 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006178 Py_DECREF(list);
6179 if_freenameindex(ni);
6180 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006181 }
6182 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006183 }
6184
6185 if_freenameindex(ni);
6186 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006187}
6188
6189PyDoc_STRVAR(if_nameindex_doc,
6190"if_nameindex()\n\
6191\n\
6192Returns a list of network interface information (index, name) tuples.");
6193
Charles-François Natali60713592011-05-20 16:55:06 +02006194static PyObject *
6195socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006196{
Charles-François Natali60713592011-05-20 16:55:06 +02006197 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006198 unsigned long index;
6199
Charles-François Natali60713592011-05-20 16:55:06 +02006200 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6201 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006202 return NULL;
6203
Charles-François Natali60713592011-05-20 16:55:06 +02006204 index = if_nametoindex(PyBytes_AS_STRING(oname));
6205 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006206 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006207 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006208 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006209 return NULL;
6210 }
6211
6212 return PyLong_FromUnsignedLong(index);
6213}
6214
6215PyDoc_STRVAR(if_nametoindex_doc,
6216"if_nametoindex(if_name)\n\
6217\n\
6218Returns the interface index corresponding to the interface name if_name.");
6219
Charles-François Natali60713592011-05-20 16:55:06 +02006220static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006221socket_if_indextoname(PyObject *self, PyObject *arg)
6222{
Charles-François Natali60713592011-05-20 16:55:06 +02006223 unsigned long index;
6224 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006225
Charles-François Natali60713592011-05-20 16:55:06 +02006226 index = PyLong_AsUnsignedLong(arg);
6227 if (index == (unsigned long) -1)
6228 return NULL;
6229
6230 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006231 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006232 return NULL;
6233 }
6234
Charles-François Natali60713592011-05-20 16:55:06 +02006235 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236}
6237
6238PyDoc_STRVAR(if_indextoname_doc,
6239"if_indextoname(if_index)\n\
6240\n\
6241Returns the interface name corresponding to the interface index if_index.");
6242
6243#endif /* HAVE_IF_NAMEINDEX */
6244
6245
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006246#ifdef CMSG_LEN
6247/* Python interface to CMSG_LEN(length). */
6248
6249static PyObject *
6250socket_CMSG_LEN(PyObject *self, PyObject *args)
6251{
6252 Py_ssize_t length;
6253 size_t result;
6254
6255 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6256 return NULL;
6257 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6258 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6259 return NULL;
6260 }
6261 return PyLong_FromSize_t(result);
6262}
6263
6264PyDoc_STRVAR(CMSG_LEN_doc,
6265"CMSG_LEN(length) -> control message length\n\
6266\n\
6267Return the total length, without trailing padding, of an ancillary\n\
6268data item with associated data of the given length. This value can\n\
6269often be used as the buffer size for recvmsg() to receive a single\n\
6270item of ancillary data, but RFC 3542 requires portable applications to\n\
6271use CMSG_SPACE() and thus include space for padding, even when the\n\
6272item will be the last in the buffer. Raises OverflowError if length\n\
6273is outside the permissible range of values.");
6274
6275
6276#ifdef CMSG_SPACE
6277/* Python interface to CMSG_SPACE(length). */
6278
6279static PyObject *
6280socket_CMSG_SPACE(PyObject *self, PyObject *args)
6281{
6282 Py_ssize_t length;
6283 size_t result;
6284
6285 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6286 return NULL;
6287 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6288 PyErr_SetString(PyExc_OverflowError,
6289 "CMSG_SPACE() argument out of range");
6290 return NULL;
6291 }
6292 return PyLong_FromSize_t(result);
6293}
6294
6295PyDoc_STRVAR(CMSG_SPACE_doc,
6296"CMSG_SPACE(length) -> buffer size\n\
6297\n\
6298Return the buffer size needed for recvmsg() to receive an ancillary\n\
6299data item with associated data of the given length, along with any\n\
6300trailing padding. The buffer space needed to receive multiple items\n\
6301is the sum of the CMSG_SPACE() values for their associated data\n\
6302lengths. Raises OverflowError if length is outside the permissible\n\
6303range of values.");
6304#endif /* CMSG_SPACE */
6305#endif /* CMSG_LEN */
6306
6307
Guido van Rossum30a685f1991-06-27 15:51:29 +00006308/* List of functions exported by this module. */
6309
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006310static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 {"gethostbyname", socket_gethostbyname,
6312 METH_VARARGS, gethostbyname_doc},
6313 {"gethostbyname_ex", socket_gethostbyname_ex,
6314 METH_VARARGS, ghbn_ex_doc},
6315 {"gethostbyaddr", socket_gethostbyaddr,
6316 METH_VARARGS, gethostbyaddr_doc},
6317 {"gethostname", socket_gethostname,
6318 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006319#ifdef HAVE_SETHOSTNAME
6320 {"sethostname", socket_sethostname,
6321 METH_VARARGS, sethostname_doc},
6322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 {"getservbyname", socket_getservbyname,
6324 METH_VARARGS, getservbyname_doc},
6325 {"getservbyport", socket_getservbyport,
6326 METH_VARARGS, getservbyport_doc},
6327 {"getprotobyname", socket_getprotobyname,
6328 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006329#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 {"dup", socket_dup,
6331 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006332#endif
Dave Cole331708b2004-08-09 04:51:41 +00006333#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 {"socketpair", socket_socketpair,
6335 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 {"ntohs", socket_ntohs,
6338 METH_VARARGS, ntohs_doc},
6339 {"ntohl", socket_ntohl,
6340 METH_O, ntohl_doc},
6341 {"htons", socket_htons,
6342 METH_VARARGS, htons_doc},
6343 {"htonl", socket_htonl,
6344 METH_O, htonl_doc},
6345 {"inet_aton", socket_inet_aton,
6346 METH_VARARGS, inet_aton_doc},
6347 {"inet_ntoa", socket_inet_ntoa,
6348 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006349#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 {"inet_pton", socket_inet_pton,
6351 METH_VARARGS, inet_pton_doc},
6352 {"inet_ntop", socket_inet_ntop,
6353 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006354#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006355 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6356 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 {"getnameinfo", socket_getnameinfo,
6358 METH_VARARGS, getnameinfo_doc},
6359 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6360 METH_NOARGS, getdefaulttimeout_doc},
6361 {"setdefaulttimeout", socket_setdefaulttimeout,
6362 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006363#ifdef HAVE_IF_NAMEINDEX
6364 {"if_nameindex", socket_if_nameindex,
6365 METH_NOARGS, if_nameindex_doc},
6366 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006367 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006368 {"if_indextoname", socket_if_indextoname,
6369 METH_O, if_indextoname_doc},
6370#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006371#ifdef CMSG_LEN
6372 {"CMSG_LEN", socket_CMSG_LEN,
6373 METH_VARARGS, CMSG_LEN_doc},
6374#ifdef CMSG_SPACE
6375 {"CMSG_SPACE", socket_CMSG_SPACE,
6376 METH_VARARGS, CMSG_SPACE_doc},
6377#endif
6378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006380};
6381
Guido van Rossum30a685f1991-06-27 15:51:29 +00006382
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006383#ifdef MS_WINDOWS
6384#define OS_INIT_DEFINED
6385
6386/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006387
6388static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006389os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006392}
6393
6394static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006395os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 WSADATA WSAData;
6398 int ret;
6399 ret = WSAStartup(0x0101, &WSAData);
6400 switch (ret) {
6401 case 0: /* No error */
6402 Py_AtExit(os_cleanup);
6403 return 1; /* Success */
6404 case WSASYSNOTREADY:
6405 PyErr_SetString(PyExc_ImportError,
6406 "WSAStartup failed: network not ready");
6407 break;
6408 case WSAVERNOTSUPPORTED:
6409 case WSAEINVAL:
6410 PyErr_SetString(
6411 PyExc_ImportError,
6412 "WSAStartup failed: requested version not supported");
6413 break;
6414 default:
6415 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6416 break;
6417 }
6418 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006419}
6420
Guido van Rossum8d665e61996-06-26 18:22:49 +00006421#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006422
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006423
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006424
6425#ifndef OS_INIT_DEFINED
6426static int
6427os_init(void)
6428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006430}
6431#endif
6432
6433
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006434/* C API table - always add new things to the end for binary
6435 compatibility. */
6436static
6437PySocketModule_APIObject PySocketModuleAPI =
6438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006440 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006442};
6443
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006445/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006447 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006448 "socket.py" which implements some additional functionality.
6449 The import of "_socket" may fail with an ImportError exception if
6450 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006451 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006452 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006453*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006455PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006456"Implementation module for socket operations.\n\
6457\n\
6458See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006459
Martin v. Löwis1a214512008-06-11 05:26:20 +00006460static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModuleDef_HEAD_INIT,
6462 PySocket_MODULE_NAME,
6463 socket_doc,
6464 -1,
6465 socket_methods,
6466 NULL,
6467 NULL,
6468 NULL,
6469 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006470};
6471
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006472PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006473PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 if (!os_init())
6478 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006479
Victor Stinnerdaf45552013-08-28 00:53:59 +02006480#ifdef MS_WINDOWS
6481 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006482#if defined(_MSC_VER) && _MSC_VER >= 1800
6483 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6484#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006485 DWORD version = GetVersion();
6486 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6487 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6488 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006489 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6490#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006491 }
6492#endif
6493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 Py_TYPE(&sock_type) = &PyType_Type;
6495 m = PyModule_Create(&socketmodule);
6496 if (m == NULL)
6497 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006498
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006499 Py_INCREF(PyExc_OSError);
6500 PySocketModuleAPI.error = PyExc_OSError;
6501 Py_INCREF(PyExc_OSError);
6502 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006504 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 if (socket_herror == NULL)
6506 return NULL;
6507 Py_INCREF(socket_herror);
6508 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006509 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510 NULL);
6511 if (socket_gaierror == NULL)
6512 return NULL;
6513 Py_INCREF(socket_gaierror);
6514 PyModule_AddObject(m, "gaierror", socket_gaierror);
6515 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006516 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 if (socket_timeout == NULL)
6518 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006519 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 Py_INCREF(socket_timeout);
6521 PyModule_AddObject(m, "timeout", socket_timeout);
6522 Py_INCREF((PyObject *)&sock_type);
6523 if (PyModule_AddObject(m, "SocketType",
6524 (PyObject *)&sock_type) != 0)
6525 return NULL;
6526 Py_INCREF((PyObject *)&sock_type);
6527 if (PyModule_AddObject(m, "socket",
6528 (PyObject *)&sock_type) != 0)
6529 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006530
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006531#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006533#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 Py_INCREF(has_ipv6);
6537 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 /* Export C API */
6540 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6541 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6542 ) != 0)
6543 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006546#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006548#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006550#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006551 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006552#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006553#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006556#endif
6557#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006559#endif
6560#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006563#endif
6564#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006567#endif
6568#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006571#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006572#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006575#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006576#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006579#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006580#ifdef HAVE_SOCKADDR_ALG
6581 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6582#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006583#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006585 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006586#endif
6587#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006589#endif
6590#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006593#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006594#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006597#endif
6598#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006601#endif
6602#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006605#endif
6606#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006609#endif
6610#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, AF_NETLINK);
6613 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006614#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006616#endif
6617#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006619#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6621 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006622#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006624#endif
6625#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006627#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006628#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006630#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006631#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006633#endif
6634#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006636#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006638#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006640#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006641#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006643#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006644#ifdef NETLINK_CRYPTO
6645 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6646#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006647#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006648#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006651#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006652#ifdef AF_LINK
6653 PyModule_AddIntMacro(m, AF_LINK);
6654#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006655#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006658#endif
6659#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006662#endif
6663#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006666#endif
6667#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#endif
6671#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006674#endif
6675#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006678#endif
6679#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006682#endif
6683#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006686#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006687
Hye-Shik Chang81268602004-02-02 06:05:24 +00006688#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6690 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6691 PyModule_AddIntMacro(m, BTPROTO_HCI);
6692 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006693#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006695#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006696#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006697#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006699#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6701 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006702#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6705 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006706#endif
6707
Charles-François Natali47413c12011-10-06 19:47:44 +02006708#ifdef AF_CAN
6709 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006711#endif
6712#ifdef PF_CAN
6713 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006715#endif
6716
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006717/* Reliable Datagram Sockets */
6718#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006720#endif
6721#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006723#endif
6724
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006725/* Kernel event messages */
6726#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006728#endif
6729#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006731#endif
6732
Antoine Pitroub156a462010-10-27 20:13:57 +00006733#ifdef AF_PACKET
6734 PyModule_AddIntMacro(m, AF_PACKET);
6735#endif
6736#ifdef PF_PACKET
6737 PyModule_AddIntMacro(m, PF_PACKET);
6738#endif
6739#ifdef PACKET_HOST
6740 PyModule_AddIntMacro(m, PACKET_HOST);
6741#endif
6742#ifdef PACKET_BROADCAST
6743 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6744#endif
6745#ifdef PACKET_MULTICAST
6746 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6747#endif
6748#ifdef PACKET_OTHERHOST
6749 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6750#endif
6751#ifdef PACKET_OUTGOING
6752 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6753#endif
6754#ifdef PACKET_LOOPBACK
6755 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6756#endif
6757#ifdef PACKET_FASTROUTE
6758 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006759#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006760
Christian Heimes043d6f62008-01-07 17:19:16 +00006761#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6766 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6767 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006768
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6770 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6771 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, SOL_TIPC);
6775 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6776 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6777 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6778 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006779
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6781 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6782 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6783 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6787 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006788#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006791#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6793 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6794 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6795 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6796 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6797 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006798#endif
6799
Christian Heimesdffa3942016-09-05 23:54:41 +02006800#ifdef HAVE_SOCKADDR_ALG
6801 /* Socket options */
6802 PyModule_AddIntMacro(m, ALG_SET_KEY);
6803 PyModule_AddIntMacro(m, ALG_SET_IV);
6804 PyModule_AddIntMacro(m, ALG_SET_OP);
6805 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6806 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6807 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6808
6809 /* Operations */
6810 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6811 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6812 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6813 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6814#endif
6815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, SOCK_STREAM);
6818 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006819/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006820#ifdef SOCK_RAW
6821 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006823#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006825#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006827#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006828#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006830#endif
6831#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006833#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006843#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006844#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006846#endif
6847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006851#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006865#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006866#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006869#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006897#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006898#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006900#endif
6901#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006903#endif
6904#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006906#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006907#ifdef SO_PASSSEC
6908 PyModule_AddIntMacro(m, SO_PASSSEC);
6909#endif
6910#ifdef SO_PEERSEC
6911 PyModule_AddIntMacro(m, SO_PEERSEC);
6912#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006913#ifdef SO_BINDTODEVICE
6914 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6915#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006916#ifdef SO_PRIORITY
6917 PyModule_AddIntMacro(m, SO_PRIORITY);
6918#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006919#ifdef SO_MARK
6920 PyModule_AddIntMacro(m, SO_MARK);
6921#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006922#ifdef SO_DOMAIN
6923 PyModule_AddIntMacro(m, SO_DOMAIN);
6924#endif
6925#ifdef SO_PROTOCOL
6926 PyModule_AddIntMacro(m, SO_PROTOCOL);
6927#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 /* Maximum number of connections for "listen" */
6930#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#endif
6935
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006936 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006937#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006939#endif
6940#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006942#endif
6943#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006945#endif
6946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947 /* Flags for send, recv */
6948#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006978#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#endif
6981#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006983#endif
6984#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006986#endif
6987#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#endif
6990#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006992#endif
6993#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006995#endif
6996#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006998#endif
6999#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007001#endif
7002#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007004#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007005#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007007#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 /* Protocol level and numbers, usable for [gs]etsockopt */
7010#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007014 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007015#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007016 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007035#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007040#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007042#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007043#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007045#endif
7046#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7048 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007049#endif
7050#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7052 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7053 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007054
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7056 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7057 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007058#ifdef CAN_ISOTP
7059 PyModule_AddIntMacro(m, CAN_ISOTP);
7060#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007061#endif
7062#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7064 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7065 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7066 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007067#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007068#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7069 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7070#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007071#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007073 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7074 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7075 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7076 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7077 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7078 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7079 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7080 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7081 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7082 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7083 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7084 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7085#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007086#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007088#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007089#ifdef HAVE_SOCKADDR_ALG
7090 PyModule_AddIntMacro(m, SOL_ALG);
7091#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007092#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007094#endif
7095#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007097#endif
7098#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007100#endif
7101#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007103#endif
7104#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007106#endif
7107#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007112#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007120#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007121 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007135#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007169#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007210#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007211#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007216#endif
7217/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007220#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
7226
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007227#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007229#endif
7230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231 /* Some port configuration */
7232#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
7242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243 /* Some reserved IP v.4 addresses */
7244#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007246#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007251#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007256#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef INADDR_ALLHOSTS_GROUP
7265 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7266 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007267#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007277#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007279#endif
7280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281 /* IPv4 [gs]etsockopt options */
7282#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007329#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007330#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007332#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7335#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007354#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007358#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007359 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007360#endif
7361#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007363#endif
7364#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007366#endif
7367#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007369#endif
7370#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007372#endif
7373#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007375#endif
7376#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007378#endif
7379#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007381#endif
7382#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007384#endif
7385#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007387#endif
7388#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007390#endif
7391#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007393#endif
7394#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007396#endif
7397#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007399#endif
7400#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007402#endif
7403#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007405#endif
7406#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007408#endif
7409#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007411#endif
7412#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007414#endif
7415#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007417#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419 /* TCP options */
7420#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007441#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007455#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007456#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007458#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007459#ifdef TCP_CONGESTION
7460 PyModule_AddIntMacro(m, TCP_CONGESTION);
7461#endif
7462#ifdef TCP_USER_TIMEOUT
7463 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7464#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007465#ifdef TCP_NOTSENT_LOWAT
7466 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7467#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469 /* IPX options */
7470#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007472#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007473
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007474/* Reliable Datagram Sockets */
7475#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007477#endif
7478#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007480#endif
7481#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007483#endif
7484#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007486#endif
7487#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007489#endif
7490#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007492#endif
7493#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007495#endif
7496#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007498#endif
7499#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007501#endif
7502#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007504#endif
7505#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007507#endif
7508#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007510#endif
7511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007513#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007515#endif
7516#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007518#endif
7519#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007521#endif
7522#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007524#endif
7525#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007527#endif
7528#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007530#endif
7531#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007533#endif
7534#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007536#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007537#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007539#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007540#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007542#endif
7543#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007545#endif
7546#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007548#endif
7549#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007551#endif
7552#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007554#endif
7555#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007557#endif
7558#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007560#endif
7561#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007563#endif
7564#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007566#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007567#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007569#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007570#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007572#endif
7573#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007575#endif
7576#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007578#endif
7579#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007581#endif
7582#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007584#endif
7585#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#endif
7588#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
7603#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007605#endif
7606#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007610 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007611#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007613#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007614 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007615#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007617#endif
7618#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007620#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007623 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007624#endif
7625#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007627#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007628 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007630 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007631#endif
7632
Christian Heimesfaf2f632008-01-06 16:59:19 +00007633#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007634 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007635 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7636#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007637 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007638#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007639 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007640 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7641#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007642 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007643#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007644 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007646 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647 PyObject *tmp;
7648 tmp = PyLong_FromUnsignedLong(codes[i]);
7649 if (tmp == NULL)
7650 return NULL;
7651 PyModule_AddObject(m, names[i], tmp);
7652 }
7653 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, RCVALL_OFF);
7655 PyModule_AddIntMacro(m, RCVALL_ON);
7656 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007657#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007659#endif
7660#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007662#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007663#endif /* _MSTCPIP_ */
7664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007666#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007670}