blob: a431e254d57c2a39ca0832b07869d211f3191752 [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
caaveryeffc12f2017-09-06 18:18:10 -04001228#if defined(AF_VSOCK)
1229 case AF_VSOCK:
1230 {
1231 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1232 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1233 }
1234#endif /* AF_VSOCK */
1235
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001236#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 case AF_INET6:
1238 {
1239 struct sockaddr_in6 *a;
1240 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1241 PyObject *ret = NULL;
1242 if (addrobj) {
1243 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001244 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 addrobj,
1246 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001247 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 a->sin6_scope_id);
1249 Py_DECREF(addrobj);
1250 }
1251 return ret;
1252 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001253#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 case AF_BLUETOOTH:
1257 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 case BTPROTO_L2CAP:
1260 {
1261 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1262 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1263 PyObject *ret = NULL;
1264 if (addrobj) {
1265 ret = Py_BuildValue("Oi",
1266 addrobj,
1267 _BT_L2_MEMB(a, psm));
1268 Py_DECREF(addrobj);
1269 }
1270 return ret;
1271 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case BTPROTO_RFCOMM:
1274 {
1275 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1276 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1277 PyObject *ret = NULL;
1278 if (addrobj) {
1279 ret = Py_BuildValue("Oi",
1280 addrobj,
1281 _BT_RC_MEMB(a, channel));
1282 Py_DECREF(addrobj);
1283 }
1284 return ret;
1285 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 case BTPROTO_HCI:
1288 {
1289 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001290#if defined(__NetBSD__) || defined(__DragonFly__)
1291 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1292#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 PyObject *ret = NULL;
1294 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1295 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001298
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 case BTPROTO_SCO:
1301 {
1302 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1303 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1304 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001305#endif
1306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 default:
1308 PyErr_SetString(PyExc_ValueError,
1309 "Unknown Bluetooth protocol");
1310 return NULL;
1311 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001312#endif
1313
Antoine Pitroub156a462010-10-27 20:13:57 +00001314#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 case AF_PACKET:
1316 {
1317 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1318 char *ifname = "";
1319 struct ifreq ifr;
1320 /* need to look up interface name give index */
1321 if (a->sll_ifindex) {
1322 ifr.ifr_ifindex = a->sll_ifindex;
1323 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1324 ifname = ifr.ifr_name;
1325 }
1326 return Py_BuildValue("shbhy#",
1327 ifname,
1328 ntohs(a->sll_protocol),
1329 a->sll_pkttype,
1330 a->sll_hatype,
1331 a->sll_addr,
1332 a->sll_halen);
1333 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001334#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001335
Christian Heimes043d6f62008-01-07 17:19:16 +00001336#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 case AF_TIPC:
1338 {
1339 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1340 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1341 return Py_BuildValue("IIIII",
1342 a->addrtype,
1343 a->addr.nameseq.type,
1344 a->addr.nameseq.lower,
1345 a->addr.nameseq.upper,
1346 a->scope);
1347 } else if (a->addrtype == TIPC_ADDR_NAME) {
1348 return Py_BuildValue("IIIII",
1349 a->addrtype,
1350 a->addr.name.name.type,
1351 a->addr.name.name.instance,
1352 a->addr.name.name.instance,
1353 a->scope);
1354 } else if (a->addrtype == TIPC_ADDR_ID) {
1355 return Py_BuildValue("IIIII",
1356 a->addrtype,
1357 a->addr.id.node,
1358 a->addr.id.ref,
1359 0,
1360 a->scope);
1361 } else {
1362 PyErr_SetString(PyExc_ValueError,
1363 "Invalid address type");
1364 return NULL;
1365 }
1366 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001367#endif
1368
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001369#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001370 case AF_CAN:
1371 {
1372 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1373 char *ifname = "";
1374 struct ifreq ifr;
1375 /* need to look up interface name given index */
1376 if (a->can_ifindex) {
1377 ifr.ifr_ifindex = a->can_ifindex;
1378 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1379 ifname = ifr.ifr_name;
1380 }
1381
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001382 switch (proto) {
1383#ifdef CAN_ISOTP
1384 case CAN_ISOTP:
1385 {
1386 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1387 ifname,
1388 a->can_addr.tp.rx_id,
1389 a->can_addr.tp.tx_id);
1390 }
1391#endif
1392 default:
1393 {
1394 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1395 ifname);
1396 }
1397 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001398 }
1399#endif
1400
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001401#ifdef PF_SYSTEM
1402 case PF_SYSTEM:
1403 switch(proto) {
1404#ifdef SYSPROTO_CONTROL
1405 case SYSPROTO_CONTROL:
1406 {
1407 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1408 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1409 }
1410#endif
1411 default:
1412 PyErr_SetString(PyExc_ValueError,
1413 "Invalid address type");
1414 return 0;
1415 }
1416#endif
1417
Christian Heimesdffa3942016-09-05 23:54:41 +02001418#ifdef HAVE_SOCKADDR_ALG
1419 case AF_ALG:
1420 {
1421 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1422 return Py_BuildValue("s#s#HH",
1423 a->salg_type,
1424 strnlen((const char*)a->salg_type,
1425 sizeof(a->salg_type)),
1426 a->salg_name,
1427 strnlen((const char*)a->salg_name,
1428 sizeof(a->salg_name)),
1429 a->salg_feat,
1430 a->salg_mask);
1431 }
1432#endif
1433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 default:
1437 /* If we don't know the address family, don't raise an
1438 exception -- return it as an (int, bytes) tuple. */
1439 return Py_BuildValue("iy#",
1440 addr->sa_family,
1441 addr->sa_data,
1442 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001445}
1446
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001447/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1448 (in particular, numeric IP addresses). */
1449struct maybe_idna {
1450 PyObject *obj;
1451 char *buf;
1452};
1453
1454static void
1455idna_cleanup(struct maybe_idna *data)
1456{
1457 Py_CLEAR(data->obj);
1458}
1459
1460static int
1461idna_converter(PyObject *obj, struct maybe_idna *data)
1462{
1463 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001464 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001465 if (obj == NULL) {
1466 idna_cleanup(data);
1467 return 1;
1468 }
1469 data->obj = NULL;
1470 len = -1;
1471 if (PyBytes_Check(obj)) {
1472 data->buf = PyBytes_AsString(obj);
1473 len = PyBytes_Size(obj);
1474 }
1475 else if (PyByteArray_Check(obj)) {
1476 data->buf = PyByteArray_AsString(obj);
1477 len = PyByteArray_Size(obj);
1478 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001479 else if (PyUnicode_Check(obj)) {
1480 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1481 data->buf = PyUnicode_DATA(obj);
1482 len = PyUnicode_GET_LENGTH(obj);
1483 }
1484 else {
1485 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1486 if (!obj2) {
1487 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1488 return 0;
1489 }
1490 assert(PyBytes_Check(obj2));
1491 data->obj = obj2;
1492 data->buf = PyBytes_AS_STRING(obj2);
1493 len = PyBytes_GET_SIZE(obj2);
1494 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001495 }
1496 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001497 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1498 obj->ob_type->tp_name);
1499 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001500 }
1501 if (strlen(data->buf) != len) {
1502 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001503 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001504 return 0;
1505 }
1506 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001507}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001508
1509/* Parse a socket address argument according to the socket object's
1510 address family. Return 1 if the address was in the proper format,
1511 0 of not. The address is returned through addr_ret, its length
1512 through len_ret. */
1513
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001515getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001519
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001520#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 case AF_UNIX:
1522 {
1523 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001524 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001525 int retval = 0;
1526
1527 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1528 allow embedded nulls on Linux. */
1529 if (PyUnicode_Check(args)) {
1530 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1531 return 0;
1532 }
1533 else
1534 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if (!PyArg_Parse(args, "y*", &path)) {
1536 Py_DECREF(args);
1537 return retval;
1538 }
1539 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001542#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001543 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001545 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001546 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001548 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 }
1550 }
1551 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001552#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 {
1554 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001555 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001556 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001558 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001560 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 }
1562 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001563 memcpy(addr->sun_path, path.buf, path.len);
1564 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001565 retval = 1;
1566 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001567 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001568 Py_DECREF(args);
1569 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001571#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001572
Martin v. Löwis11017b12006-01-14 18:12:57 +00001573#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 case AF_NETLINK:
1575 {
1576 struct sockaddr_nl* addr;
1577 int pid, groups;
1578 addr = (struct sockaddr_nl *)addr_ret;
1579 if (!PyTuple_Check(args)) {
1580 PyErr_Format(
1581 PyExc_TypeError,
1582 "getsockaddrarg: "
1583 "AF_NETLINK address must be tuple, not %.500s",
1584 Py_TYPE(args)->tp_name);
1585 return 0;
1586 }
1587 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1588 return 0;
1589 addr->nl_family = AF_NETLINK;
1590 addr->nl_pid = pid;
1591 addr->nl_groups = groups;
1592 *len_ret = sizeof(*addr);
1593 return 1;
1594 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001595#endif
1596
caaveryeffc12f2017-09-06 18:18:10 -04001597#if defined(AF_VSOCK)
1598 case AF_VSOCK:
1599 {
1600 struct sockaddr_vm* addr;
1601 int port, cid;
1602 addr = (struct sockaddr_vm *)addr_ret;
1603 memset(addr, 0, sizeof(struct sockaddr_vm));
1604 if (!PyTuple_Check(args)) {
1605 PyErr_Format(
1606 PyExc_TypeError,
1607 "getsockaddrarg: "
1608 "AF_VSOCK address must be tuple, not %.500s",
1609 Py_TYPE(args)->tp_name);
1610 return 0;
1611 }
1612 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1613 return 0;
1614 addr->svm_family = s->sock_family;
1615 addr->svm_port = port;
1616 addr->svm_cid = cid;
1617 *len_ret = sizeof(*addr);
1618 return 1;
1619 }
1620#endif
1621
1622
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001623#ifdef AF_RDS
1624 case AF_RDS:
1625 /* RDS sockets use sockaddr_in: fall-through */
1626#endif
1627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 case AF_INET:
1629 {
1630 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001631 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 int port, result;
1633 if (!PyTuple_Check(args)) {
1634 PyErr_Format(
1635 PyExc_TypeError,
1636 "getsockaddrarg: "
1637 "AF_INET address must be tuple, not %.500s",
1638 Py_TYPE(args)->tp_name);
1639 return 0;
1640 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001641 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1642 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 return 0;
1644 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001645 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001647 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 if (result < 0)
1649 return 0;
1650 if (port < 0 || port > 0xffff) {
1651 PyErr_SetString(
1652 PyExc_OverflowError,
1653 "getsockaddrarg: port must be 0-65535.");
1654 return 0;
1655 }
1656 addr->sin_family = AF_INET;
1657 addr->sin_port = htons((short)port);
1658 *len_ret = sizeof *addr;
1659 return 1;
1660 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001661
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001662#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 case AF_INET6:
1664 {
1665 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001666 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001667 int port, result;
1668 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 flowinfo = scope_id = 0;
1670 if (!PyTuple_Check(args)) {
1671 PyErr_Format(
1672 PyExc_TypeError,
1673 "getsockaddrarg: "
1674 "AF_INET6 address must be tuple, not %.500s",
1675 Py_TYPE(args)->tp_name);
1676 return 0;
1677 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001678 if (!PyArg_ParseTuple(args, "O&i|II",
1679 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 &scope_id)) {
1681 return 0;
1682 }
1683 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001684 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001686 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 if (result < 0)
1688 return 0;
1689 if (port < 0 || port > 0xffff) {
1690 PyErr_SetString(
1691 PyExc_OverflowError,
1692 "getsockaddrarg: port must be 0-65535.");
1693 return 0;
1694 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001695 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001696 PyErr_SetString(
1697 PyExc_OverflowError,
1698 "getsockaddrarg: flowinfo must be 0-1048575.");
1699 return 0;
1700 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 addr->sin6_family = s->sock_family;
1702 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001703 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 addr->sin6_scope_id = scope_id;
1705 *len_ret = sizeof *addr;
1706 return 1;
1707 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001708#endif
1709
Hye-Shik Chang81268602004-02-02 06:05:24 +00001710#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 case AF_BLUETOOTH:
1712 {
1713 switch (s->sock_proto) {
1714 case BTPROTO_L2CAP:
1715 {
1716 struct sockaddr_l2 *addr;
1717 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 addr = (struct sockaddr_l2 *)addr_ret;
1720 memset(addr, 0, sizeof(struct sockaddr_l2));
1721 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1722 if (!PyArg_ParseTuple(args, "si", &straddr,
1723 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001724 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 "wrong format");
1726 return 0;
1727 }
1728 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1729 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 *len_ret = sizeof *addr;
1732 return 1;
1733 }
1734 case BTPROTO_RFCOMM:
1735 {
1736 struct sockaddr_rc *addr;
1737 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 addr = (struct sockaddr_rc *)addr_ret;
1740 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1741 if (!PyArg_ParseTuple(args, "si", &straddr,
1742 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001743 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 "wrong format");
1745 return 0;
1746 }
1747 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1748 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 *len_ret = sizeof *addr;
1751 return 1;
1752 }
1753 case BTPROTO_HCI:
1754 {
1755 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001756#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001757 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001758
Alexander Belopolskye239d232010-12-08 23:31:48 +00001759 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001760 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001761 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001762 "wrong format");
1763 return 0;
1764 }
1765 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1766 return 0;
1767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1769 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001770 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 "wrong format");
1772 return 0;
1773 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 *len_ret = sizeof *addr;
1776 return 1;
1777 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001778#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 case BTPROTO_SCO:
1780 {
1781 struct sockaddr_sco *addr;
1782 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 addr = (struct sockaddr_sco *)addr_ret;
1785 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1786 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001787 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 "wrong format");
1789 return 0;
1790 }
1791 straddr = PyBytes_AS_STRING(args);
1792 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1793 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 *len_ret = sizeof *addr;
1796 return 1;
1797 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001800 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 return 0;
1802 }
1803 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001804#endif
1805
Antoine Pitroub156a462010-10-27 20:13:57 +00001806#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 case AF_PACKET:
1808 {
1809 struct sockaddr_ll* addr;
1810 struct ifreq ifr;
1811 char *interfaceName;
1812 int protoNumber;
1813 int hatype = 0;
1814 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if (!PyTuple_Check(args)) {
1818 PyErr_Format(
1819 PyExc_TypeError,
1820 "getsockaddrarg: "
1821 "AF_PACKET address must be tuple, not %.500s",
1822 Py_TYPE(args)->tp_name);
1823 return 0;
1824 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001825 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001827 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 return 0;
1829 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1830 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1831 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1832 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001833 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 return 0;
1835 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001836 if (haddr.buf && haddr.len > 8) {
1837 PyErr_SetString(PyExc_ValueError,
1838 "Hardware address must be 8 bytes or less");
1839 PyBuffer_Release(&haddr);
1840 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 }
1842 if (protoNumber < 0 || protoNumber > 0xffff) {
1843 PyErr_SetString(
1844 PyExc_OverflowError,
1845 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001846 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 return 0;
1848 }
1849 addr = (struct sockaddr_ll*)addr_ret;
1850 addr->sll_family = AF_PACKET;
1851 addr->sll_protocol = htons((short)protoNumber);
1852 addr->sll_ifindex = ifr.ifr_ifindex;
1853 addr->sll_pkttype = pkttype;
1854 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001855 if (haddr.buf) {
1856 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1857 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001859 else
1860 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001862 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 return 1;
1864 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001865#endif
1866
Christian Heimes043d6f62008-01-07 17:19:16 +00001867#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 case AF_TIPC:
1869 {
1870 unsigned int atype, v1, v2, v3;
1871 unsigned int scope = TIPC_CLUSTER_SCOPE;
1872 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 if (!PyTuple_Check(args)) {
1875 PyErr_Format(
1876 PyExc_TypeError,
1877 "getsockaddrarg: "
1878 "AF_TIPC address must be tuple, not %.500s",
1879 Py_TYPE(args)->tp_name);
1880 return 0;
1881 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 if (!PyArg_ParseTuple(args,
1884 "IIII|I;Invalid TIPC address format",
1885 &atype, &v1, &v2, &v3, &scope))
1886 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 addr = (struct sockaddr_tipc *) addr_ret;
1889 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 addr->family = AF_TIPC;
1892 addr->scope = scope;
1893 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 if (atype == TIPC_ADDR_NAMESEQ) {
1896 addr->addr.nameseq.type = v1;
1897 addr->addr.nameseq.lower = v2;
1898 addr->addr.nameseq.upper = v3;
1899 } else if (atype == TIPC_ADDR_NAME) {
1900 addr->addr.name.name.type = v1;
1901 addr->addr.name.name.instance = v2;
1902 } else if (atype == TIPC_ADDR_ID) {
1903 addr->addr.id.node = v1;
1904 addr->addr.id.ref = v2;
1905 } else {
1906 /* Shouldn't happen */
1907 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1908 return 0;
1909 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 return 1;
1914 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001915#endif
1916
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001917#ifdef AF_CAN
1918
1919#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001920 case AF_CAN:
1921 switch (s->sock_proto) {
1922 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001923 /* fall-through */
1924 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001925 {
1926 struct sockaddr_can *addr;
1927 PyObject *interfaceName;
1928 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001929 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001930 addr = (struct sockaddr_can *)addr_ret;
1931
Charles-François Natali47413c12011-10-06 19:47:44 +02001932 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1933 &interfaceName))
1934 return 0;
1935
1936 len = PyBytes_GET_SIZE(interfaceName);
1937
1938 if (len == 0) {
1939 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001940 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001941 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1942 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001943 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1944 s->errorhandler();
1945 Py_DECREF(interfaceName);
1946 return 0;
1947 }
1948 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001949 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001950 "AF_CAN interface name too long");
1951 Py_DECREF(interfaceName);
1952 return 0;
1953 }
1954
1955 addr->can_family = AF_CAN;
1956 addr->can_ifindex = ifr.ifr_ifindex;
1957
1958 *len_ret = sizeof(*addr);
1959 Py_DECREF(interfaceName);
1960 return 1;
1961 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001962#endif
1963
1964#ifdef CAN_ISOTP
1965 case CAN_ISOTP:
1966 {
1967 struct sockaddr_can *addr;
1968 PyObject *interfaceName;
1969 struct ifreq ifr;
1970 Py_ssize_t len;
1971 unsigned long int rx_id, tx_id;
1972
1973 addr = (struct sockaddr_can *)addr_ret;
1974
1975 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1976 &interfaceName,
1977 &rx_id,
1978 &tx_id))
1979 return 0;
1980
1981 len = PyBytes_GET_SIZE(interfaceName);
1982
1983 if (len == 0) {
1984 ifr.ifr_ifindex = 0;
1985 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1986 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1987 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1988 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1989 s->errorhandler();
1990 Py_DECREF(interfaceName);
1991 return 0;
1992 }
1993 } else {
1994 PyErr_SetString(PyExc_OSError,
1995 "AF_CAN interface name too long");
1996 Py_DECREF(interfaceName);
1997 return 0;
1998 }
1999
2000 addr->can_family = AF_CAN;
2001 addr->can_ifindex = ifr.ifr_ifindex;
2002 addr->can_addr.tp.rx_id = rx_id;
2003 addr->can_addr.tp.tx_id = tx_id;
2004
2005 *len_ret = sizeof(*addr);
2006 Py_DECREF(interfaceName);
2007 return 1;
2008 }
2009#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002010 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002011 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002012 "getsockaddrarg: unsupported CAN protocol");
2013 return 0;
2014 }
2015#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002016
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002017#ifdef PF_SYSTEM
2018 case PF_SYSTEM:
2019 switch (s->sock_proto) {
2020#ifdef SYSPROTO_CONTROL
2021 case SYSPROTO_CONTROL:
2022 {
2023 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002024
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002025 addr = (struct sockaddr_ctl *)addr_ret;
2026 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002027 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002028
2029 if (PyUnicode_Check(args)) {
2030 struct ctl_info info;
2031 PyObject *ctl_name;
2032
2033 if (!PyArg_Parse(args, "O&",
2034 PyUnicode_FSConverter, &ctl_name)) {
2035 return 0;
2036 }
2037
Victor Stinnerf50e1872015-03-20 11:32:24 +01002038 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002039 PyErr_SetString(PyExc_ValueError,
2040 "provided string is too long");
2041 Py_DECREF(ctl_name);
2042 return 0;
2043 }
2044 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2045 sizeof(info.ctl_name));
2046 Py_DECREF(ctl_name);
2047
2048 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2049 PyErr_SetString(PyExc_OSError,
2050 "cannot find kernel control with provided name");
2051 return 0;
2052 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002053
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002054 addr->sc_id = info.ctl_id;
2055 addr->sc_unit = 0;
2056 } else if (!PyArg_ParseTuple(args, "II",
2057 &(addr->sc_id), &(addr->sc_unit))) {
2058 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2059 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002060
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002061 return 0;
2062 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002063
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002064 *len_ret = sizeof(*addr);
2065 return 1;
2066 }
2067#endif
2068 default:
2069 PyErr_SetString(PyExc_OSError,
2070 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2071 return 0;
2072 }
2073#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002074#ifdef HAVE_SOCKADDR_ALG
2075 case AF_ALG:
2076 {
2077 struct sockaddr_alg *sa;
2078 char *type;
2079 char *name;
2080 sa = (struct sockaddr_alg *)addr_ret;
2081
2082 memset(sa, 0, sizeof(*sa));
2083 sa->salg_family = AF_ALG;
2084
2085 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2086 &type, &name, &sa->salg_feat, &sa->salg_mask))
2087 return 0;
2088 /* sockaddr_alg has fixed-sized char arrays for type and name */
2089 if (strlen(type) > sizeof(sa->salg_type)) {
2090 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2091 return 0;
2092 }
2093 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2094 if (strlen(name) > sizeof(sa->salg_name)) {
2095 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2096 return 0;
2097 }
2098 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2099
2100 *len_ret = sizeof(*sa);
2101 return 1;
2102 }
2103#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002108 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002112}
2113
Guido van Rossum30a685f1991-06-27 15:51:29 +00002114
Guido van Rossum48a680c2001-03-02 06:34:14 +00002115/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002116 Return 1 if the family is known, 0 otherwise. The length is returned
2117 through len_ret. */
2118
2119static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002120getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002123
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002124#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 case AF_UNIX:
2126 {
2127 *len_ret = sizeof (struct sockaddr_un);
2128 return 1;
2129 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002130#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002131
Martin v. Löwis11017b12006-01-14 18:12:57 +00002132#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002133 case AF_NETLINK:
2134 {
2135 *len_ret = sizeof (struct sockaddr_nl);
2136 return 1;
2137 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002138#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002139
caaveryeffc12f2017-09-06 18:18:10 -04002140#if defined(AF_VSOCK)
2141 case AF_VSOCK:
2142 {
2143 *len_ret = sizeof (struct sockaddr_vm);
2144 return 1;
2145 }
2146#endif
2147
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002148#ifdef AF_RDS
2149 case AF_RDS:
2150 /* RDS sockets use sockaddr_in: fall-through */
2151#endif
2152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 case AF_INET:
2154 {
2155 *len_ret = sizeof (struct sockaddr_in);
2156 return 1;
2157 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002158
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002159#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 case AF_INET6:
2161 {
2162 *len_ret = sizeof (struct sockaddr_in6);
2163 return 1;
2164 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002165#endif
2166
Hye-Shik Chang81268602004-02-02 06:05:24 +00002167#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 case AF_BLUETOOTH:
2169 {
2170 switch(s->sock_proto)
2171 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 case BTPROTO_L2CAP:
2174 *len_ret = sizeof (struct sockaddr_l2);
2175 return 1;
2176 case BTPROTO_RFCOMM:
2177 *len_ret = sizeof (struct sockaddr_rc);
2178 return 1;
2179 case BTPROTO_HCI:
2180 *len_ret = sizeof (struct sockaddr_hci);
2181 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002182#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 case BTPROTO_SCO:
2184 *len_ret = sizeof (struct sockaddr_sco);
2185 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002188 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 "unknown BT protocol");
2190 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 }
2193 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002194#endif
2195
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002196#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 case AF_PACKET:
2198 {
2199 *len_ret = sizeof (struct sockaddr_ll);
2200 return 1;
2201 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002202#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002203
Christian Heimes043d6f62008-01-07 17:19:16 +00002204#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 case AF_TIPC:
2206 {
2207 *len_ret = sizeof (struct sockaddr_tipc);
2208 return 1;
2209 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002210#endif
2211
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002212#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002213 case AF_CAN:
2214 {
2215 *len_ret = sizeof (struct sockaddr_can);
2216 return 1;
2217 }
2218#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002219
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002220#ifdef PF_SYSTEM
2221 case PF_SYSTEM:
2222 switch(s->sock_proto) {
2223#ifdef SYSPROTO_CONTROL
2224 case SYSPROTO_CONTROL:
2225 *len_ret = sizeof (struct sockaddr_ctl);
2226 return 1;
2227#endif
2228 default:
2229 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2230 "unknown PF_SYSTEM protocol");
2231 return 0;
2232 }
2233#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002234#ifdef HAVE_SOCKADDR_ALG
2235 case AF_ALG:
2236 {
2237 *len_ret = sizeof (struct sockaddr_alg);
2238 return 1;
2239 }
2240#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002245 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002249}
2250
2251
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002252/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2253 Currently, these methods are only compiled if the RFC 2292/3542
2254 CMSG_LEN() macro is available. Older systems seem to have used
2255 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2256 it may be possible to define CMSG_LEN() that way if it's not
2257 provided. Some architectures might need extra padding after the
2258 cmsghdr, however, and CMSG_LEN() would have to take account of
2259 this. */
2260#ifdef CMSG_LEN
2261/* If length is in range, set *result to CMSG_LEN(length) and return
2262 true; otherwise, return false. */
2263static int
2264get_CMSG_LEN(size_t length, size_t *result)
2265{
2266 size_t tmp;
2267
2268 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2269 return 0;
2270 tmp = CMSG_LEN(length);
2271 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2272 return 0;
2273 *result = tmp;
2274 return 1;
2275}
2276
2277#ifdef CMSG_SPACE
2278/* If length is in range, set *result to CMSG_SPACE(length) and return
2279 true; otherwise, return false. */
2280static int
2281get_CMSG_SPACE(size_t length, size_t *result)
2282{
2283 size_t tmp;
2284
2285 /* Use CMSG_SPACE(1) here in order to take account of the padding
2286 necessary before *and* after the data. */
2287 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2288 return 0;
2289 tmp = CMSG_SPACE(length);
2290 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2291 return 0;
2292 *result = tmp;
2293 return 1;
2294}
2295#endif
2296
2297/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2298 pointer in msg->msg_control with at least "space" bytes after it,
2299 and its cmsg_len member inside the buffer. */
2300static int
2301cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2302{
2303 size_t cmsg_offset;
2304 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2305 sizeof(cmsgh->cmsg_len));
2306
Charles-François Natali466517d2011-08-28 18:23:43 +02002307 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002308 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002309 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002310 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2311 annoying under OS X as it's unsigned there and so it triggers a
2312 tautological comparison warning under Clang when compared against 0.
2313 Since the check is valid on other platforms, silence the warning under
2314 Clang. */
2315 #ifdef __clang__
2316 #pragma clang diagnostic push
2317 #pragma clang diagnostic ignored "-Wtautological-compare"
2318 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002319 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002320 #pragma GCC diagnostic push
2321 #pragma GCC diagnostic ignored "-Wtype-limits"
2322 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002323 if (msg->msg_controllen < 0)
2324 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002325 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002326 #pragma GCC diagnostic pop
2327 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002328 #ifdef __clang__
2329 #pragma clang diagnostic pop
2330 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002331 if (space < cmsg_len_end)
2332 space = cmsg_len_end;
2333 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2334 return (cmsg_offset <= (size_t)-1 - space &&
2335 cmsg_offset + space <= msg->msg_controllen);
2336}
2337
2338/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2339 *space to number of bytes following it in the buffer and return
2340 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2341 msg->msg_controllen are valid. */
2342static int
2343get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2344{
2345 size_t data_offset;
2346 char *data_ptr;
2347
2348 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2349 return 0;
2350 data_offset = data_ptr - (char *)msg->msg_control;
2351 if (data_offset > msg->msg_controllen)
2352 return 0;
2353 *space = msg->msg_controllen - data_offset;
2354 return 1;
2355}
2356
2357/* If cmsgh is invalid or not contained in the buffer pointed to by
2358 msg->msg_control, return -1. If cmsgh is valid and its associated
2359 data is entirely contained in the buffer, set *data_len to the
2360 length of the associated data and return 0. If only part of the
2361 associated data is contained in the buffer but cmsgh is otherwise
2362 valid, set *data_len to the length contained in the buffer and
2363 return 1. */
2364static int
2365get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2366{
2367 size_t space, cmsg_data_len;
2368
2369 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2370 cmsgh->cmsg_len < CMSG_LEN(0))
2371 return -1;
2372 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2373 if (!get_cmsg_data_space(msg, cmsgh, &space))
2374 return -1;
2375 if (space >= cmsg_data_len) {
2376 *data_len = cmsg_data_len;
2377 return 0;
2378 }
2379 *data_len = space;
2380 return 1;
2381}
2382#endif /* CMSG_LEN */
2383
2384
Victor Stinner31bf2d52015-04-01 21:57:09 +02002385struct sock_accept {
2386 socklen_t *addrlen;
2387 sock_addr_t *addrbuf;
2388 SOCKET_T result;
2389};
2390
2391#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2392/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2393static int accept4_works = -1;
2394#endif
2395
2396static int
2397sock_accept_impl(PySocketSockObject *s, void *data)
2398{
2399 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002400 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2401 socklen_t *paddrlen = ctx->addrlen;
2402#ifdef HAVE_SOCKADDR_ALG
2403 /* AF_ALG does not support accept() with addr and raises
2404 * ECONNABORTED instead. */
2405 if (s->sock_family == AF_ALG) {
2406 addr = NULL;
2407 paddrlen = NULL;
2408 *ctx->addrlen = 0;
2409 }
2410#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002411
2412#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2413 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002414 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002415 SOCK_CLOEXEC);
2416 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2417 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2418 accept4_works = (errno != ENOSYS);
2419 }
2420 }
2421 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002422 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002423#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002424 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002425#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002426
2427#ifdef MS_WINDOWS
2428 return (ctx->result != INVALID_SOCKET);
2429#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002430 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002431#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002432}
2433
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002434/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002435
Guido van Rossum73624e91994-10-10 17:59:00 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002440 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 socklen_t addrlen;
2442 PyObject *sock = NULL;
2443 PyObject *addr = NULL;
2444 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002445 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (!getsockaddrlen(s, &addrlen))
2448 return NULL;
2449 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (!IS_SELECTABLE(s))
2452 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002453
Victor Stinner31bf2d52015-04-01 21:57:09 +02002454 ctx.addrlen = &addrlen;
2455 ctx.addrbuf = &addrbuf;
2456 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002458 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002459
Victor Stinnerdaf45552013-08-28 00:53:59 +02002460#ifdef MS_WINDOWS
2461 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2462 PyErr_SetFromWindowsErr(0);
2463 SOCKETCLOSE(newfd);
2464 goto finally;
2465 }
2466#else
2467
2468#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2469 if (!accept4_works)
2470#endif
2471 {
2472 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2473 SOCKETCLOSE(newfd);
2474 goto finally;
2475 }
2476 }
2477#endif
2478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 sock = PyLong_FromSocket_t(newfd);
2480 if (sock == NULL) {
2481 SOCKETCLOSE(newfd);
2482 goto finally;
2483 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2486 addrlen, s->sock_proto);
2487 if (addr == NULL)
2488 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002491
Guido van Rossum67f7a382002-06-06 21:08:16 +00002492finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 Py_XDECREF(sock);
2494 Py_XDECREF(addr);
2495 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002496}
2497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002498PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002499"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002500\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002501Wait for an incoming connection. Return a new socket file descriptor\n\
2502representing the connection, and the address of the client.\n\
2503For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002504
Guido van Rossum11ba0942002-06-13 15:07:44 +00002505/* s.setblocking(flag) method. Argument:
2506 False -- non-blocking mode; same as settimeout(0)
2507 True -- blocking mode; same as settimeout(None)
2508*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002509
Guido van Rossum73624e91994-10-10 17:59:00 +00002510static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002511sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002512{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002513 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 block = PyLong_AsLong(arg);
2516 if (block == -1 && PyErr_Occurred())
2517 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Victor Stinner9001d802015-04-06 23:06:01 +02002519 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002520 if (internal_setblocking(s, block) == -1) {
2521 return NULL;
2522 }
2523 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002524}
Guido van Rossume4485b01994-09-07 14:32:49 +00002525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002526PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002527"setblocking(flag)\n\
2528\n\
2529Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002530setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002531setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002532
Victor Stinner71694d52015-03-28 01:18:54 +01002533static int
2534socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2535{
2536#ifdef MS_WINDOWS
2537 struct timeval tv;
2538#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002539#ifndef HAVE_POLL
2540 _PyTime_t ms;
2541#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002542 int overflow = 0;
2543
2544 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002545 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002546 return 0;
2547 }
2548
Victor Stinner869e1772015-03-30 03:49:14 +02002549 if (_PyTime_FromSecondsObject(timeout,
2550 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002551 return -1;
2552
2553 if (*timeout < 0) {
2554 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2555 return -1;
2556 }
2557
2558#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002559 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002560#endif
2561#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002562 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2563 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002564#endif
2565 if (overflow) {
2566 PyErr_SetString(PyExc_OverflowError,
2567 "timeout doesn't fit into C timeval");
2568 return -1;
2569 }
2570
2571 return 0;
2572}
2573
Guido van Rossum11ba0942002-06-13 15:07:44 +00002574/* s.settimeout(timeout) method. Argument:
2575 None -- no timeout, blocking mode; same as setblocking(True)
2576 0.0 -- non-blocking mode; same as setblocking(False)
2577 > 0 -- timeout mode; operations time out after timeout seconds
2578 < 0 -- illegal; raises an exception
2579*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002581sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582{
Victor Stinner71694d52015-03-28 01:18:54 +01002583 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002584
Victor Stinner71694d52015-03-28 01:18:54 +01002585 if (socket_parse_timeout(&timeout, arg) < 0)
2586 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002589 if (internal_setblocking(s, timeout < 0) == -1) {
2590 return NULL;
2591 }
2592 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593}
2594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002595PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002596"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002598Set a timeout on socket operations. 'timeout' can be a float,\n\
2599giving in seconds, or None. Setting a timeout of None disables\n\
2600the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002601Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002602
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002603/* s.gettimeout() method.
2604 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002605static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002606sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002607{
Victor Stinner71694d52015-03-28 01:18:54 +01002608 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002609 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 }
Victor Stinner71694d52015-03-28 01:18:54 +01002611 else {
2612 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2613 return PyFloat_FromDouble(seconds);
2614 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002615}
2616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002617PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002618"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002619\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002620Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002621operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002622operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002623
Guido van Rossumaee08791992-09-08 09:05:33 +00002624/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002625 With an integer third argument, sets an integer optval with optlen=4.
2626 With None as third argument and an integer fourth argument, set
2627 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002628 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002629 use optional built-in module 'struct' to encode the string.
2630*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002631
Guido van Rossum73624e91994-10-10 17:59:00 +00002632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002633sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 int level;
2636 int optname;
2637 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002638 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002640 unsigned int optlen;
2641 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002642
caaveryeffc12f2017-09-06 18:18:10 -04002643#ifdef AF_VSOCK
2644 if (s->sock_family == AF_VSOCK) {
2645 uint64_t vflag; // Must be set width of 64 bits
2646 /* setsockopt(level, opt, flag) */
2647 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2648 &level, &optname, &vflag)) {
2649 // level should always be set to AF_VSOCK
2650 res = setsockopt(s->sock_fd, level, optname,
2651 (void*)&vflag, sizeof vflag);
2652 goto done;
2653 }
2654 return NULL;
2655 }
2656#endif
2657
Christian Heimesdffa3942016-09-05 23:54:41 +02002658 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 if (PyArg_ParseTuple(args, "iii:setsockopt",
2660 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002661 res = setsockopt(s->sock_fd, level, optname,
2662 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002663 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002665
2666 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002667 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002668 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2669 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2670 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002671 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002672 NULL, (socklen_t)optlen);
2673 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002675
2676 PyErr_Clear();
2677 /* setsockopt(level, opt, buffer) */
2678 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2679 &level, &optname, &optval))
2680 return NULL;
2681
2682#ifdef MS_WINDOWS
2683 if (optval.len > INT_MAX) {
2684 PyBuffer_Release(&optval);
2685 PyErr_Format(PyExc_OverflowError,
2686 "socket option is larger than %i bytes",
2687 INT_MAX);
2688 return NULL;
2689 }
2690 res = setsockopt(s->sock_fd, level, optname,
2691 optval.buf, (int)optval.len);
2692#else
2693 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2694#endif
2695 PyBuffer_Release(&optval);
2696
2697done:
Victor Stinnercc739322016-03-23 21:35:29 +01002698 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002700 }
2701
2702 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002703}
2704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002705PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002706"setsockopt(level, option, value: int)\n\
2707setsockopt(level, option, value: buffer)\n\
2708setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709\n\
2710Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002711The value argument can either be an integer, a string buffer, or \n\
2712None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002713
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002714
Guido van Rossumaee08791992-09-08 09:05:33 +00002715/* s.getsockopt() method.
2716 With two arguments, retrieves an integer option.
2717 With a third integer argument, retrieves a string buffer of that size;
2718 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002719
Guido van Rossum73624e91994-10-10 17:59:00 +00002720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002721sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 int level;
2724 int optname;
2725 int res;
2726 PyObject *buf;
2727 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002728 int flag = 0;
2729 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2732 &level, &optname, &buflen))
2733 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002736#ifdef AF_VSOCK
2737 if (s->sock_family == AF_VSOCK) {
2738 uint64_t vflag = 0; // Must be set width of 64 bits
2739 flagsize = sizeof vflag;
2740 res = getsockopt(s->sock_fd, level, optname,
2741 (void *)&vflag, &flagsize);
2742 if (res < 0)
2743 return s->errorhandler();
2744 return PyLong_FromUnsignedLong(vflag);
2745 }
2746#endif
2747 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 res = getsockopt(s->sock_fd, level, optname,
2749 (void *)&flag, &flagsize);
2750 if (res < 0)
2751 return s->errorhandler();
2752 return PyLong_FromLong(flag);
2753 }
caaveryeffc12f2017-09-06 18:18:10 -04002754#ifdef AF_VSOCK
2755 if (s->sock_family == AF_VSOCK) {
2756 PyErr_SetString(PyExc_OSError,
2757 "getsockopt string buffer not allowed");
2758 return NULL;
2759 }
2760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002762 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 "getsockopt buflen out of range");
2764 return NULL;
2765 }
2766 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2767 if (buf == NULL)
2768 return NULL;
2769 res = getsockopt(s->sock_fd, level, optname,
2770 (void *)PyBytes_AS_STRING(buf), &buflen);
2771 if (res < 0) {
2772 Py_DECREF(buf);
2773 return s->errorhandler();
2774 }
2775 _PyBytes_Resize(&buf, buflen);
2776 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002777}
2778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002779PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002780"getsockopt(level, option[, buffersize]) -> value\n\
2781\n\
2782Get a socket option. See the Unix manual for level and option.\n\
2783If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002784string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002785
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002786
Fred Drake728819a2000-07-01 03:40:12 +00002787/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002788
Guido van Rossum73624e91994-10-10 17:59:00 +00002789static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002790sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 sock_addr_t addrbuf;
2793 int addrlen;
2794 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2797 return NULL;
2798 Py_BEGIN_ALLOW_THREADS
2799 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2800 Py_END_ALLOW_THREADS
2801 if (res < 0)
2802 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002803 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002804}
2805
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002807"bind(address)\n\
2808\n\
2809Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002810pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002811sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002812
Guido van Rossum30a685f1991-06-27 15:51:29 +00002813
2814/* s.close() method.
2815 Set the file descriptor to -1 so operations tried subsequently
2816 will surely fail. */
2817
Guido van Rossum73624e91994-10-10 17:59:00 +00002818static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002819sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002820{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002822 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002823
Victor Stinner19a8e842016-03-21 16:36:48 +01002824 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002825 if (fd != INVALID_SOCKET) {
2826 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002827
2828 /* We do not want to retry upon EINTR: see
2829 http://lwn.net/Articles/576478/ and
2830 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2831 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002833 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002835 /* bpo-30319: The peer can already have closed the connection.
2836 Python ignores ECONNRESET on close(). */
2837 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002838 return s->errorhandler();
2839 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002841 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002842}
2843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002844PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002845"close()\n\
2846\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002847Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002848
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002849static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002850sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002851{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002852 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002853 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002854 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002855}
2856
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002857PyDoc_STRVAR(detach_doc,
2858"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002859\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002860Close the socket object without closing the underlying file descriptor.\n\
2861The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002862can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002863
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002864static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002865sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002866{
Victor Stinner81c41db2015-04-02 11:50:57 +02002867 int err;
2868 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002869
Victor Stinner81c41db2015-04-02 11:50:57 +02002870 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2871 /* getsockopt() failed */
2872 return 0;
2873 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002874
Victor Stinner81c41db2015-04-02 11:50:57 +02002875 if (err == EISCONN)
2876 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002877 if (err != 0) {
2878 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2879 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002880 return 0;
2881 }
2882 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002883}
2884
2885static int
2886internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2887 int raise)
2888{
2889 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002890
2891 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002893 Py_END_ALLOW_THREADS
2894
Victor Stinner70a46f62015-03-31 22:03:59 +02002895 if (!res) {
2896 /* connect() succeeded, the socket is connected */
2897 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002899
Victor Stinner81c41db2015-04-02 11:50:57 +02002900 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002901
Victor Stinner81c41db2015-04-02 11:50:57 +02002902 /* save error, PyErr_CheckSignals() can replace it */
2903 err = GET_SOCK_ERROR;
2904 if (CHECK_ERRNO(EINTR)) {
2905 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002906 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002907
2908 /* Issue #23618: when connect() fails with EINTR, the connection is
2909 running asynchronously.
2910
2911 If the socket is blocking or has a timeout, wait until the
2912 connection completes, fails or timed out using select(), and then
2913 get the connection status using getsockopt(SO_ERROR).
2914
2915 If the socket is non-blocking, raise InterruptedError. The caller is
2916 responsible to wait until the connection completes, fails or timed
2917 out (it's the case in asyncio for example). */
2918 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2919 }
2920 else {
2921 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2922 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002923 }
2924
Victor Stinner81c41db2015-04-02 11:50:57 +02002925 if (!wait_connect) {
2926 if (raise) {
2927 /* restore error, maybe replaced by PyErr_CheckSignals() */
2928 SET_SOCK_ERROR(err);
2929 s->errorhandler();
2930 return -1;
2931 }
2932 else
2933 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002934 }
2935
Victor Stinner81c41db2015-04-02 11:50:57 +02002936 if (raise) {
2937 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002938 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2939 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002940 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002941 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002942 else {
2943 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002944 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2945 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002946 return err;
2947 }
2948 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002949}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002950
Fred Drake728819a2000-07-01 03:40:12 +00002951/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002952
Guido van Rossum73624e91994-10-10 17:59:00 +00002953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002954sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 sock_addr_t addrbuf;
2957 int addrlen;
2958 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2961 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002962
Victor Stinner81c41db2015-04-02 11:50:57 +02002963 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002964 if (res < 0)
2965 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002966
Victor Stinneree699e92015-03-31 21:28:42 +02002967 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002968}
2969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002970PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002971"connect(address)\n\
2972\n\
2973Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002974is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002975
Guido van Rossum30a685f1991-06-27 15:51:29 +00002976
Fred Drake728819a2000-07-01 03:40:12 +00002977/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002978
2979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 sock_addr_t addrbuf;
2983 int addrlen;
2984 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2987 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002988
Victor Stinner81c41db2015-04-02 11:50:57 +02002989 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002990 if (res < 0)
2991 return NULL;
2992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002994}
2995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002996PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002997"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998\n\
2999This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003000instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003001
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003002
Guido van Rossumed233a51992-06-23 09:07:03 +00003003/* s.fileno() method */
3004
Guido van Rossum73624e91994-10-10 17:59:00 +00003005static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003006sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003009}
3010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003011PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003012"fileno() -> integer\n\
3013\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003014Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003015
Guido van Rossumed233a51992-06-23 09:07:03 +00003016
Guido van Rossumc89705d1992-11-26 08:54:07 +00003017/* s.getsockname() method */
3018
Guido van Rossum73624e91994-10-10 17:59:00 +00003019static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003020sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 sock_addr_t addrbuf;
3023 int res;
3024 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 if (!getsockaddrlen(s, &addrlen))
3027 return NULL;
3028 memset(&addrbuf, 0, addrlen);
3029 Py_BEGIN_ALLOW_THREADS
3030 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3031 Py_END_ALLOW_THREADS
3032 if (res < 0)
3033 return s->errorhandler();
3034 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3035 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003036}
3037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003038PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003039"getsockname() -> address info\n\
3040\n\
3041Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003042info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003043
Guido van Rossumc89705d1992-11-26 08:54:07 +00003044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003046/* s.getpeername() method */
3047
Guido van Rossum73624e91994-10-10 17:59:00 +00003048static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003049sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 sock_addr_t addrbuf;
3052 int res;
3053 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 if (!getsockaddrlen(s, &addrlen))
3056 return NULL;
3057 memset(&addrbuf, 0, addrlen);
3058 Py_BEGIN_ALLOW_THREADS
3059 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3060 Py_END_ALLOW_THREADS
3061 if (res < 0)
3062 return s->errorhandler();
3063 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3064 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003065}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003066
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003067PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003068"getpeername() -> address info\n\
3069\n\
3070Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003071info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003072
Guido van Rossumb6775db1994-08-01 11:34:53 +00003073#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003074
3075
Guido van Rossum30a685f1991-06-27 15:51:29 +00003076/* s.listen(n) method */
3077
Guido van Rossum73624e91994-10-10 17:59:00 +00003078static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003079sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003080{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003081 /* We try to choose a default backlog high enough to avoid connection drops
3082 * for common workloads, yet not too high to limit resource usage. */
3083 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003085
Charles-François Natali644b8f52014-05-22 19:45:39 +01003086 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003090 /* To avoid problems on systems that don't allow a negative backlog
3091 * (which doesn't make sense anyway) we force a minimum value of 0. */
3092 if (backlog < 0)
3093 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 res = listen(s->sock_fd, backlog);
3095 Py_END_ALLOW_THREADS
3096 if (res < 0)
3097 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003098 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003099}
3100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003101PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003102"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003103\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003104Enable a server to accept connections. If backlog is specified, it must be\n\
3105at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003106unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003107connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108
Victor Stinner31bf2d52015-04-01 21:57:09 +02003109struct sock_recv {
3110 char *cbuf;
3111 Py_ssize_t len;
3112 int flags;
3113 Py_ssize_t result;
3114};
3115
3116static int
3117sock_recv_impl(PySocketSockObject *s, void *data)
3118{
3119 struct sock_recv *ctx = data;
3120
3121#ifdef MS_WINDOWS
3122 if (ctx->len > INT_MAX)
3123 ctx->len = INT_MAX;
3124 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3125#else
3126 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3127#endif
3128 return (ctx->result >= 0);
3129}
3130
Guido van Rossum82a5c661998-07-07 20:45:43 +00003131
Thomas Wouters477c8d52006-05-27 19:21:47 +00003132/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003133 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003134 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003136 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003137 * also possible that we return a number of bytes smaller than the request
3138 * bytes.
3139 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003140
Antoine Pitrou19467d22010-08-17 19:33:30 +00003141static Py_ssize_t
3142sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003143{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003144 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 if (!IS_SELECTABLE(s)) {
3147 select_error();
3148 return -1;
3149 }
3150 if (len == 0) {
3151 /* If 0 bytes were requested, do nothing. */
3152 return 0;
3153 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003154
Victor Stinner31bf2d52015-04-01 21:57:09 +02003155 ctx.cbuf = cbuf;
3156 ctx.len = len;
3157 ctx.flags = flags;
3158 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003160
3161 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003162}
3163
Guido van Rossum48a680c2001-03-02 06:34:14 +00003164
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003165/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003166
Guido van Rossum73624e91994-10-10 17:59:00 +00003167static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003168sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003169{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003170 Py_ssize_t recvlen, outlen;
3171 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003173
Antoine Pitrou19467d22010-08-17 19:33:30 +00003174 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 if (recvlen < 0) {
3178 PyErr_SetString(PyExc_ValueError,
3179 "negative buffersize in recv");
3180 return NULL;
3181 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 /* Allocate a new string. */
3184 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3185 if (buf == NULL)
3186 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 /* Call the guts */
3189 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3190 if (outlen < 0) {
3191 /* An error occurred, release the string and return an
3192 error. */
3193 Py_DECREF(buf);
3194 return NULL;
3195 }
3196 if (outlen != recvlen) {
3197 /* We did not read as many bytes as we anticipated, resize the
3198 string if possible and be successful. */
3199 _PyBytes_Resize(&buf, outlen);
3200 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003203}
3204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003205PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003206"recv(buffersize[, flags]) -> data\n\
3207\n\
3208Receive up to buffersize bytes from the socket. For the optional flags\n\
3209argument, see the Unix manual. When no data is available, block until\n\
3210at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003211the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003212
Guido van Rossum30a685f1991-06-27 15:51:29 +00003213
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003214/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003215
Thomas Wouters477c8d52006-05-27 19:21:47 +00003216static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003217sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003220
Antoine Pitrou19467d22010-08-17 19:33:30 +00003221 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 Py_buffer pbuf;
3223 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003224 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003227 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 &pbuf, &recvlen, &flags))
3229 return NULL;
3230 buf = pbuf.buf;
3231 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 if (recvlen < 0) {
3234 PyBuffer_Release(&pbuf);
3235 PyErr_SetString(PyExc_ValueError,
3236 "negative buffersize in recv_into");
3237 return NULL;
3238 }
3239 if (recvlen == 0) {
3240 /* If nbytes was not specified, use the buffer's length */
3241 recvlen = buflen;
3242 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 /* Check if the buffer is large enough */
3245 if (buflen < recvlen) {
3246 PyBuffer_Release(&pbuf);
3247 PyErr_SetString(PyExc_ValueError,
3248 "buffer too small for requested bytes");
3249 return NULL;
3250 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 /* Call the guts */
3253 readlen = sock_recv_guts(s, buf, recvlen, flags);
3254 if (readlen < 0) {
3255 /* Return an error. */
3256 PyBuffer_Release(&pbuf);
3257 return NULL;
3258 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 PyBuffer_Release(&pbuf);
3261 /* Return the number of bytes read. Note that we do not do anything
3262 special here in the case that readlen < recvlen. */
3263 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264}
3265
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003266PyDoc_STRVAR(recv_into_doc,
3267"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003268\n\
3269A version of recv() that stores its data into a buffer rather than creating \n\
3270a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3271is not specified (or 0), receive up to the size available in the given buffer.\n\
3272\n\
3273See recv() for documentation about the flags.");
3274
Victor Stinner31bf2d52015-04-01 21:57:09 +02003275struct sock_recvfrom {
3276 char* cbuf;
3277 Py_ssize_t len;
3278 int flags;
3279 socklen_t *addrlen;
3280 sock_addr_t *addrbuf;
3281 Py_ssize_t result;
3282};
3283
3284static int
3285sock_recvfrom_impl(PySocketSockObject *s, void *data)
3286{
3287 struct sock_recvfrom *ctx = data;
3288
3289 memset(ctx->addrbuf, 0, *ctx->addrlen);
3290
3291#ifdef MS_WINDOWS
3292 if (ctx->len > INT_MAX)
3293 ctx->len = INT_MAX;
3294 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3295 SAS2SA(ctx->addrbuf), ctx->addrlen);
3296#else
3297 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3298 SAS2SA(ctx->addrbuf), ctx->addrlen);
3299#endif
3300 return (ctx->result >= 0);
3301}
3302
Thomas Wouters477c8d52006-05-27 19:21:47 +00003303
3304/*
Christian Heimes99170a52007-12-19 02:07:34 +00003305 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3306 * into a char buffer. If you have any inc/def ref to do to the objects that
3307 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003308 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003309 * that it is also possible that we return a number of bytes smaller than the
3310 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003311 *
3312 * 'addr' is a return value for the address object. Note that you must decref
3313 * it yourself.
3314 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003315static Py_ssize_t
3316sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003321 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (!getsockaddrlen(s, &addrlen))
3326 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (!IS_SELECTABLE(s)) {
3329 select_error();
3330 return -1;
3331 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003332
Victor Stinner31bf2d52015-04-01 21:57:09 +02003333 ctx.cbuf = cbuf;
3334 ctx.len = len;
3335 ctx.flags = flags;
3336 ctx.addrbuf = &addrbuf;
3337 ctx.addrlen = &addrlen;
3338 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003340
Victor Stinner31bf2d52015-04-01 21:57:09 +02003341 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3342 s->sock_proto);
3343 if (*addr == NULL)
3344 return -1;
3345
3346 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347}
3348
3349/* s.recvfrom(nbytes [,flags]) method */
3350
3351static PyObject *
3352sock_recvfrom(PySocketSockObject *s, PyObject *args)
3353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 PyObject *buf = NULL;
3355 PyObject *addr = NULL;
3356 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003357 int flags = 0;
3358 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003359
Antoine Pitrou19467d22010-08-17 19:33:30 +00003360 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 if (recvlen < 0) {
3364 PyErr_SetString(PyExc_ValueError,
3365 "negative buffersize in recvfrom");
3366 return NULL;
3367 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3370 if (buf == NULL)
3371 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3374 recvlen, flags, &addr);
3375 if (outlen < 0) {
3376 goto finally;
3377 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 if (outlen != recvlen) {
3380 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003381 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003383 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 goto finally;
3385 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003388
3389finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 Py_XDECREF(buf);
3391 Py_XDECREF(addr);
3392 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003393}
3394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003395PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003396"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3397\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003398Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003399
Thomas Wouters477c8d52006-05-27 19:21:47 +00003400
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003401/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003402
3403static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003404sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003407
Antoine Pitrou19467d22010-08-17 19:33:30 +00003408 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 Py_buffer pbuf;
3410 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003411 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003414
Antoine Pitrou19467d22010-08-17 19:33:30 +00003415 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 kwlist, &pbuf,
3417 &recvlen, &flags))
3418 return NULL;
3419 buf = pbuf.buf;
3420 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 if (recvlen < 0) {
3423 PyBuffer_Release(&pbuf);
3424 PyErr_SetString(PyExc_ValueError,
3425 "negative buffersize in recvfrom_into");
3426 return NULL;
3427 }
3428 if (recvlen == 0) {
3429 /* If nbytes was not specified, use the buffer's length */
3430 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003431 } else if (recvlen > buflen) {
3432 PyBuffer_Release(&pbuf);
3433 PyErr_SetString(PyExc_ValueError,
3434 "nbytes is greater than the length of the buffer");
3435 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3439 if (readlen < 0) {
3440 PyBuffer_Release(&pbuf);
3441 /* Return an error */
3442 Py_XDECREF(addr);
3443 return NULL;
3444 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 PyBuffer_Release(&pbuf);
3447 /* Return the number of bytes read and the address. Note that we do
3448 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003449 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003450}
3451
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003452PyDoc_STRVAR(recvfrom_into_doc,
3453"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003454\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003455Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003456
Victor Stinner35bee932015-04-02 12:28:07 +02003457/* The sendmsg() and recvmsg[_into]() methods require a working
3458 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3459#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003460struct sock_recvmsg {
3461 struct msghdr *msg;
3462 int flags;
3463 ssize_t result;
3464};
3465
3466static int
3467sock_recvmsg_impl(PySocketSockObject *s, void *data)
3468{
3469 struct sock_recvmsg *ctx = data;
3470
3471 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3472 return (ctx->result >= 0);
3473}
3474
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003475/*
3476 * Call recvmsg() with the supplied iovec structures, flags, and
3477 * ancillary data buffer size (controllen). Returns the tuple return
3478 * value for recvmsg() or recvmsg_into(), with the first item provided
3479 * by the supplied makeval() function. makeval() will be called with
3480 * the length read and makeval_data as arguments, and must return a
3481 * new reference (which will be decrefed if there is a subsequent
3482 * error). On error, closes any file descriptors received via
3483 * SCM_RIGHTS.
3484 */
3485static PyObject *
3486sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3487 int flags, Py_ssize_t controllen,
3488 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3489{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003490 sock_addr_t addrbuf;
3491 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003492 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003493 PyObject *cmsg_list = NULL, *retval = NULL;
3494 void *controlbuf = NULL;
3495 struct cmsghdr *cmsgh;
3496 size_t cmsgdatalen = 0;
3497 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003498 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003499
3500 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3501 ignored" when the socket is connected (Linux fills them in
3502 anyway for AF_UNIX sockets at least). Normally msg_namelen
3503 seems to be set to 0 if there's no address, but try to
3504 initialize msg_name to something that won't be mistaken for a
3505 real address if that doesn't happen. */
3506 if (!getsockaddrlen(s, &addrbuflen))
3507 return NULL;
3508 memset(&addrbuf, 0, addrbuflen);
3509 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3510
3511 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3512 PyErr_SetString(PyExc_ValueError,
3513 "invalid ancillary data buffer length");
3514 return NULL;
3515 }
3516 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3517 return PyErr_NoMemory();
3518
3519 /* Make the system call. */
3520 if (!IS_SELECTABLE(s)) {
3521 select_error();
3522 goto finally;
3523 }
3524
Victor Stinner31bf2d52015-04-01 21:57:09 +02003525 msg.msg_name = SAS2SA(&addrbuf);
3526 msg.msg_namelen = addrbuflen;
3527 msg.msg_iov = iov;
3528 msg.msg_iovlen = iovlen;
3529 msg.msg_control = controlbuf;
3530 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003531
Victor Stinner31bf2d52015-04-01 21:57:09 +02003532 ctx.msg = &msg;
3533 ctx.flags = flags;
3534 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003535 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003536
3537 /* Make list of (level, type, data) tuples from control messages. */
3538 if ((cmsg_list = PyList_New(0)) == NULL)
3539 goto err_closefds;
3540 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3541 implementations didn't do so. */
3542 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3543 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3544 PyObject *bytes, *tuple;
3545 int tmp;
3546
3547 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3548 if (cmsg_status != 0) {
3549 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3550 "received malformed or improperly-truncated "
3551 "ancillary data", 1) == -1)
3552 goto err_closefds;
3553 }
3554 if (cmsg_status < 0)
3555 break;
3556 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003557 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003558 goto err_closefds;
3559 }
3560
3561 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3562 cmsgdatalen);
3563 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3564 (int)cmsgh->cmsg_type, bytes);
3565 if (tuple == NULL)
3566 goto err_closefds;
3567 tmp = PyList_Append(cmsg_list, tuple);
3568 Py_DECREF(tuple);
3569 if (tmp != 0)
3570 goto err_closefds;
3571
3572 if (cmsg_status != 0)
3573 break;
3574 }
3575
3576 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003577 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003578 cmsg_list,
3579 (int)msg.msg_flags,
3580 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3581 ((msg.msg_namelen > addrbuflen) ?
3582 addrbuflen : msg.msg_namelen),
3583 s->sock_proto));
3584 if (retval == NULL)
3585 goto err_closefds;
3586
3587finally:
3588 Py_XDECREF(cmsg_list);
3589 PyMem_Free(controlbuf);
3590 return retval;
3591
3592err_closefds:
3593#ifdef SCM_RIGHTS
3594 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3595 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3596 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3597 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3598 if (cmsg_status < 0)
3599 break;
3600 if (cmsgh->cmsg_level == SOL_SOCKET &&
3601 cmsgh->cmsg_type == SCM_RIGHTS) {
3602 size_t numfds;
3603 int *fdp;
3604
3605 numfds = cmsgdatalen / sizeof(int);
3606 fdp = (int *)CMSG_DATA(cmsgh);
3607 while (numfds-- > 0)
3608 close(*fdp++);
3609 }
3610 if (cmsg_status != 0)
3611 break;
3612 }
3613#endif /* SCM_RIGHTS */
3614 goto finally;
3615}
3616
3617
3618static PyObject *
3619makeval_recvmsg(ssize_t received, void *data)
3620{
3621 PyObject **buf = data;
3622
3623 if (received < PyBytes_GET_SIZE(*buf))
3624 _PyBytes_Resize(buf, received);
3625 Py_XINCREF(*buf);
3626 return *buf;
3627}
3628
3629/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3630
3631static PyObject *
3632sock_recvmsg(PySocketSockObject *s, PyObject *args)
3633{
3634 Py_ssize_t bufsize, ancbufsize = 0;
3635 int flags = 0;
3636 struct iovec iov;
3637 PyObject *buf = NULL, *retval = NULL;
3638
3639 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3640 return NULL;
3641
3642 if (bufsize < 0) {
3643 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3644 return NULL;
3645 }
3646 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3647 return NULL;
3648 iov.iov_base = PyBytes_AS_STRING(buf);
3649 iov.iov_len = bufsize;
3650
3651 /* Note that we're passing a pointer to *our pointer* to the bytes
3652 object here (&buf); makeval_recvmsg() may incref the object, or
3653 deallocate it and set our pointer to NULL. */
3654 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3655 &makeval_recvmsg, &buf);
3656 Py_XDECREF(buf);
3657 return retval;
3658}
3659
3660PyDoc_STRVAR(recvmsg_doc,
3661"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3662\n\
3663Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3664socket. The ancbufsize argument sets the size in bytes of the\n\
3665internal buffer used to receive the ancillary data; it defaults to 0,\n\
3666meaning that no ancillary data will be received. Appropriate buffer\n\
3667sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3668CMSG_LEN(), and items which do not fit into the buffer might be\n\
3669truncated or discarded. The flags argument defaults to 0 and has the\n\
3670same meaning as for recv().\n\
3671\n\
3672The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3673The data item is a bytes object holding the non-ancillary data\n\
3674received. The ancdata item is a list of zero or more tuples\n\
3675(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3676(control messages) received: cmsg_level and cmsg_type are integers\n\
3677specifying the protocol level and protocol-specific type respectively,\n\
3678and cmsg_data is a bytes object holding the associated data. The\n\
3679msg_flags item is the bitwise OR of various flags indicating\n\
3680conditions on the received message; see your system documentation for\n\
3681details. If the receiving socket is unconnected, address is the\n\
3682address of the sending socket, if available; otherwise, its value is\n\
3683unspecified.\n\
3684\n\
3685If recvmsg() raises an exception after the system call returns, it\n\
3686will first attempt to close any file descriptors received via the\n\
3687SCM_RIGHTS mechanism.");
3688
3689
3690static PyObject *
3691makeval_recvmsg_into(ssize_t received, void *data)
3692{
3693 return PyLong_FromSsize_t(received);
3694}
3695
3696/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3697
3698static PyObject *
3699sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3700{
3701 Py_ssize_t ancbufsize = 0;
3702 int flags = 0;
3703 struct iovec *iovs = NULL;
3704 Py_ssize_t i, nitems, nbufs = 0;
3705 Py_buffer *bufs = NULL;
3706 PyObject *buffers_arg, *fast, *retval = NULL;
3707
3708 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3709 &buffers_arg, &ancbufsize, &flags))
3710 return NULL;
3711
3712 if ((fast = PySequence_Fast(buffers_arg,
3713 "recvmsg_into() argument 1 must be an "
3714 "iterable")) == NULL)
3715 return NULL;
3716 nitems = PySequence_Fast_GET_SIZE(fast);
3717 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003718 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003719 goto finally;
3720 }
3721
3722 /* Fill in an iovec for each item, and save the Py_buffer
3723 structs to release afterwards. */
3724 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3725 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3726 PyErr_NoMemory();
3727 goto finally;
3728 }
3729 for (; nbufs < nitems; nbufs++) {
3730 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3731 "w*;recvmsg_into() argument 1 must be an iterable "
3732 "of single-segment read-write buffers",
3733 &bufs[nbufs]))
3734 goto finally;
3735 iovs[nbufs].iov_base = bufs[nbufs].buf;
3736 iovs[nbufs].iov_len = bufs[nbufs].len;
3737 }
3738
3739 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3740 &makeval_recvmsg_into, NULL);
3741finally:
3742 for (i = 0; i < nbufs; i++)
3743 PyBuffer_Release(&bufs[i]);
3744 PyMem_Free(bufs);
3745 PyMem_Free(iovs);
3746 Py_DECREF(fast);
3747 return retval;
3748}
3749
3750PyDoc_STRVAR(recvmsg_into_doc,
3751"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3752\n\
3753Receive normal data and ancillary data from the socket, scattering the\n\
3754non-ancillary data into a series of buffers. The buffers argument\n\
3755must be an iterable of objects that export writable buffers\n\
3756(e.g. bytearray objects); these will be filled with successive chunks\n\
3757of the non-ancillary data until it has all been written or there are\n\
3758no more buffers. The ancbufsize argument sets the size in bytes of\n\
3759the internal buffer used to receive the ancillary data; it defaults to\n\
37600, meaning that no ancillary data will be received. Appropriate\n\
3761buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3762or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3763truncated or discarded. The flags argument defaults to 0 and has the\n\
3764same meaning as for recv().\n\
3765\n\
3766The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3767The nbytes item is the total number of bytes of non-ancillary data\n\
3768written into the buffers. The ancdata item is a list of zero or more\n\
3769tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3770data (control messages) received: cmsg_level and cmsg_type are\n\
3771integers specifying the protocol level and protocol-specific type\n\
3772respectively, and cmsg_data is a bytes object holding the associated\n\
3773data. The msg_flags item is the bitwise OR of various flags\n\
3774indicating conditions on the received message; see your system\n\
3775documentation for details. If the receiving socket is unconnected,\n\
3776address is the address of the sending socket, if available; otherwise,\n\
3777its value is unspecified.\n\
3778\n\
3779If recvmsg_into() raises an exception after the system call returns,\n\
3780it will first attempt to close any file descriptors received via the\n\
3781SCM_RIGHTS mechanism.");
3782#endif /* CMSG_LEN */
3783
3784
Victor Stinner31bf2d52015-04-01 21:57:09 +02003785struct sock_send {
3786 char *buf;
3787 Py_ssize_t len;
3788 int flags;
3789 Py_ssize_t result;
3790};
3791
3792static int
3793sock_send_impl(PySocketSockObject *s, void *data)
3794{
3795 struct sock_send *ctx = data;
3796
3797#ifdef MS_WINDOWS
3798 if (ctx->len > INT_MAX)
3799 ctx->len = INT_MAX;
3800 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3801#else
3802 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3803#endif
3804 return (ctx->result >= 0);
3805}
3806
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003807/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003808
Guido van Rossum73624e91994-10-10 17:59:00 +00003809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003810sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003811{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003812 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003814 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3817 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 if (!IS_SELECTABLE(s)) {
3820 PyBuffer_Release(&pbuf);
3821 return select_error();
3822 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003823 ctx.buf = pbuf.buf;
3824 ctx.len = pbuf.len;
3825 ctx.flags = flags;
3826 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003827 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 return NULL;
3829 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003830 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003831
3832 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003833}
3834
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003835PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003836"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003837\n\
3838Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003839argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003840sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003841
3842
3843/* s.sendall(data [,flags]) method */
3844
3845static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003846sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003849 Py_ssize_t len, n;
3850 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003852 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003853 int has_timeout = (s->sock_timeout > 0);
3854 _PyTime_t interval = s->sock_timeout;
3855 _PyTime_t deadline = 0;
3856 int deadline_initialized = 0;
3857 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3860 return NULL;
3861 buf = pbuf.buf;
3862 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 if (!IS_SELECTABLE(s)) {
3865 PyBuffer_Release(&pbuf);
3866 return select_error();
3867 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003870 if (has_timeout) {
3871 if (deadline_initialized) {
3872 /* recompute the timeout */
3873 interval = deadline - _PyTime_GetMonotonicClock();
3874 }
3875 else {
3876 deadline_initialized = 1;
3877 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3878 }
3879
3880 if (interval <= 0) {
3881 PyErr_SetString(socket_timeout, "timed out");
3882 goto done;
3883 }
3884 }
3885
Victor Stinner02f32ab2015-04-01 22:53:26 +02003886 ctx.buf = buf;
3887 ctx.len = len;
3888 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003889 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3890 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003891 n = ctx.result;
3892 assert(n >= 0);
3893
3894 buf += n;
3895 len -= n;
3896
3897 /* We must run our signal handlers before looping again.
3898 send() can return a successful partial write when it is
3899 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003900 if (PyErr_CheckSignals())
3901 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003902 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003904
Victor Stinner8912d142015-04-06 23:16:34 +02003905 Py_INCREF(Py_None);
3906 res = Py_None;
3907
3908done:
3909 PyBuffer_Release(&pbuf);
3910 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003911}
3912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003913PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003914"sendall(data[, flags])\n\
3915\n\
3916Send a data string to the socket. For the optional flags\n\
3917argument, see the Unix manual. This calls send() repeatedly\n\
3918until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003919to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003920
Guido van Rossum30a685f1991-06-27 15:51:29 +00003921
Victor Stinner31bf2d52015-04-01 21:57:09 +02003922struct sock_sendto {
3923 char *buf;
3924 Py_ssize_t len;
3925 int flags;
3926 int addrlen;
3927 sock_addr_t *addrbuf;
3928 Py_ssize_t result;
3929};
3930
3931static int
3932sock_sendto_impl(PySocketSockObject *s, void *data)
3933{
3934 struct sock_sendto *ctx = data;
3935
3936#ifdef MS_WINDOWS
3937 if (ctx->len > INT_MAX)
3938 ctx->len = INT_MAX;
3939 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3940 SAS2SA(ctx->addrbuf), ctx->addrlen);
3941#else
3942 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3943 SAS2SA(ctx->addrbuf), ctx->addrlen);
3944#endif
3945 return (ctx->result >= 0);
3946}
3947
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003948/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003949
Guido van Rossum73624e91994-10-10 17:59:00 +00003950static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003951sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 Py_buffer pbuf;
3954 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003955 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003957 int addrlen, flags;
3958 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003961 arglen = PyTuple_Size(args);
3962 switch (arglen) {
3963 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003964 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3965 return NULL;
3966 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003967 break;
3968 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003969 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3970 &pbuf, &flags, &addro)) {
3971 return NULL;
3972 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003973 break;
3974 default:
3975 PyErr_Format(PyExc_TypeError,
3976 "sendto() takes 2 or 3 arguments (%d given)",
3977 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003978 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003981 if (!IS_SELECTABLE(s)) {
3982 PyBuffer_Release(&pbuf);
3983 return select_error();
3984 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3987 PyBuffer_Release(&pbuf);
3988 return NULL;
3989 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003990
Victor Stinner31bf2d52015-04-01 21:57:09 +02003991 ctx.buf = pbuf.buf;
3992 ctx.len = pbuf.len;
3993 ctx.flags = flags;
3994 ctx.addrlen = addrlen;
3995 ctx.addrbuf = &addrbuf;
3996 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003997 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 return NULL;
3999 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004000 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004001
4002 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004003}
4004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004005PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004006"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004007\n\
4008Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004009For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004010
Guido van Rossum30a685f1991-06-27 15:51:29 +00004011
Victor Stinner35bee932015-04-02 12:28:07 +02004012/* The sendmsg() and recvmsg[_into]() methods require a working
4013 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4014#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004015struct sock_sendmsg {
4016 struct msghdr *msg;
4017 int flags;
4018 ssize_t result;
4019};
4020
4021static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004022sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4023 struct msghdr *msg,
4024 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4025 Py_ssize_t ndataparts, ndatabufs = 0;
4026 int result = -1;
4027 struct iovec *iovs = NULL;
4028 PyObject *data_fast = NULL;
4029 Py_buffer *databufs = NULL;
4030
4031 /* Fill in an iovec for each message part, and save the Py_buffer
4032 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004033 data_fast = PySequence_Fast(data_arg,
4034 "sendmsg() argument 1 must be an "
4035 "iterable");
4036 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004037 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004038 }
4039
Christian Heimesdffa3942016-09-05 23:54:41 +02004040 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4041 if (ndataparts > INT_MAX) {
4042 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4043 goto finally;
4044 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004045
Christian Heimesdffa3942016-09-05 23:54:41 +02004046 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004047 if (ndataparts > 0) {
4048 iovs = PyMem_New(struct iovec, ndataparts);
4049 if (iovs == NULL) {
4050 PyErr_NoMemory();
4051 goto finally;
4052 }
4053 msg->msg_iov = iovs;
4054
4055 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004056 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004057 PyErr_NoMemory();
4058 goto finally;
4059 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004060 }
4061 for (; ndatabufs < ndataparts; ndatabufs++) {
4062 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4063 "y*;sendmsg() argument 1 must be an iterable of "
4064 "bytes-like objects",
4065 &databufs[ndatabufs]))
4066 goto finally;
4067 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4068 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4069 }
4070 result = 0;
4071 finally:
4072 *databufsout = databufs;
4073 *ndatabufsout = ndatabufs;
4074 Py_XDECREF(data_fast);
4075 return result;
4076}
4077
4078static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004079sock_sendmsg_impl(PySocketSockObject *s, void *data)
4080{
4081 struct sock_sendmsg *ctx = data;
4082
4083 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4084 return (ctx->result >= 0);
4085}
4086
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004087/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4088
4089static PyObject *
4090sock_sendmsg(PySocketSockObject *s, PyObject *args)
4091{
Christian Heimesdffa3942016-09-05 23:54:41 +02004092 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004094 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004095 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004096 struct cmsginfo {
4097 int level;
4098 int type;
4099 Py_buffer data;
4100 } *cmsgs = NULL;
4101 void *controlbuf = NULL;
4102 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004103 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004104 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004106 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004107
4108 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004109 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004110 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004111 }
4112
4113 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115 /* Parse destination address. */
4116 if (addr_arg != NULL && addr_arg != Py_None) {
4117 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4118 goto finally;
4119 msg.msg_name = &addrbuf;
4120 msg.msg_namelen = addrlen;
4121 }
4122
4123 /* Fill in an iovec for each message part, and save the Py_buffer
4124 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004125 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004126 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127 }
4128
4129 if (cmsg_arg == NULL)
4130 ncmsgs = 0;
4131 else {
4132 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4133 "sendmsg() argument 2 must be an "
4134 "iterable")) == NULL)
4135 goto finally;
4136 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4137 }
4138
4139#ifndef CMSG_SPACE
4140 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004141 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004142 "sending multiple control messages is not supported "
4143 "on this system");
4144 goto finally;
4145 }
4146#endif
4147 /* Save level, type and Py_buffer for each control message,
4148 and calculate total size. */
4149 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4150 PyErr_NoMemory();
4151 goto finally;
4152 }
4153 controllen = controllen_last = 0;
4154 while (ncmsgbufs < ncmsgs) {
4155 size_t bufsize, space;
4156
4157 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4158 "(iiy*):[sendmsg() ancillary data items]",
4159 &cmsgs[ncmsgbufs].level,
4160 &cmsgs[ncmsgbufs].type,
4161 &cmsgs[ncmsgbufs].data))
4162 goto finally;
4163 bufsize = cmsgs[ncmsgbufs++].data.len;
4164
4165#ifdef CMSG_SPACE
4166 if (!get_CMSG_SPACE(bufsize, &space)) {
4167#else
4168 if (!get_CMSG_LEN(bufsize, &space)) {
4169#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004170 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004171 goto finally;
4172 }
4173 controllen += space;
4174 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004175 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004176 goto finally;
4177 }
4178 controllen_last = controllen;
4179 }
4180
4181 /* Construct ancillary data block from control message info. */
4182 if (ncmsgbufs > 0) {
4183 struct cmsghdr *cmsgh = NULL;
4184
Victor Stinner52d61e42016-09-12 11:41:58 +02004185 controlbuf = PyMem_Malloc(controllen);
4186 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004187 PyErr_NoMemory();
4188 goto finally;
4189 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004190 msg.msg_control = controlbuf;
4191
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004192 msg.msg_controllen = controllen;
4193
4194 /* Need to zero out the buffer as a workaround for glibc's
4195 CMSG_NXTHDR() implementation. After getting the pointer to
4196 the next header, it checks its (uninitialized) cmsg_len
4197 member to see if the "message" fits in the buffer, and
4198 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004199 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004200 memset(controlbuf, 0, controllen);
4201
4202 for (i = 0; i < ncmsgbufs; i++) {
4203 size_t msg_len, data_len = cmsgs[i].data.len;
4204 int enough_space = 0;
4205
4206 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4207 if (cmsgh == NULL) {
4208 PyErr_Format(PyExc_RuntimeError,
4209 "unexpected NULL result from %s()",
4210 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4211 goto finally;
4212 }
4213 if (!get_CMSG_LEN(data_len, &msg_len)) {
4214 PyErr_SetString(PyExc_RuntimeError,
4215 "item size out of range for CMSG_LEN()");
4216 goto finally;
4217 }
4218 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4219 size_t space;
4220
4221 cmsgh->cmsg_len = msg_len;
4222 if (get_cmsg_data_space(&msg, cmsgh, &space))
4223 enough_space = (space >= data_len);
4224 }
4225 if (!enough_space) {
4226 PyErr_SetString(PyExc_RuntimeError,
4227 "ancillary data does not fit in calculated "
4228 "space");
4229 goto finally;
4230 }
4231 cmsgh->cmsg_level = cmsgs[i].level;
4232 cmsgh->cmsg_type = cmsgs[i].type;
4233 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4234 }
4235 }
4236
4237 /* Make the system call. */
4238 if (!IS_SELECTABLE(s)) {
4239 select_error();
4240 goto finally;
4241 }
4242
Victor Stinner31bf2d52015-04-01 21:57:09 +02004243 ctx.msg = &msg;
4244 ctx.flags = flags;
4245 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004247
4248 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004249
4250finally:
4251 PyMem_Free(controlbuf);
4252 for (i = 0; i < ncmsgbufs; i++)
4253 PyBuffer_Release(&cmsgs[i].data);
4254 PyMem_Free(cmsgs);
4255 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004256 PyMem_Free(msg.msg_iov);
4257 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004258 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004259 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004260 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261 return retval;
4262}
4263
4264PyDoc_STRVAR(sendmsg_doc,
4265"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4266\n\
4267Send normal and ancillary data to the socket, gathering the\n\
4268non-ancillary data from a series of buffers and concatenating it into\n\
4269a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004270data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004271The ancdata argument specifies the ancillary data (control messages)\n\
4272as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4273cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4274protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004275is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004276argument defaults to 0 and has the same meaning as for send(). If\n\
4277address is supplied and not None, it sets a destination address for\n\
4278the message. The return value is the number of bytes of non-ancillary\n\
4279data sent.");
4280#endif /* CMSG_LEN */
4281
Christian Heimesdffa3942016-09-05 23:54:41 +02004282#ifdef HAVE_SOCKADDR_ALG
4283static PyObject*
4284sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4285{
4286 PyObject *retval = NULL;
4287
4288 Py_ssize_t i, ndatabufs = 0;
4289 Py_buffer *databufs = NULL;
4290 PyObject *data_arg = NULL;
4291
4292 Py_buffer iv = {NULL, NULL};
4293
4294 PyObject *opobj = NULL;
4295 int op = -1;
4296
4297 PyObject *assoclenobj = NULL;
4298 int assoclen = -1;
4299
4300 unsigned int *uiptr;
4301 int flags = 0;
4302
4303 struct msghdr msg;
4304 struct cmsghdr *header = NULL;
4305 struct af_alg_iv *alg_iv = NULL;
4306 struct sock_sendmsg ctx;
4307 Py_ssize_t controllen;
4308 void *controlbuf = NULL;
4309 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4310
4311 if (self->sock_family != AF_ALG) {
4312 PyErr_SetString(PyExc_OSError,
4313 "algset is only supported for AF_ALG");
4314 return NULL;
4315 }
4316
4317 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4318 "|O$O!y*O!i:sendmsg_afalg", keywords,
4319 &data_arg,
4320 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004321 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004322 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004323 }
4324
4325 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004326
4327 /* op is a required, keyword-only argument >= 0 */
4328 if (opobj != NULL) {
4329 op = _PyLong_AsInt(opobj);
4330 }
4331 if (op < 0) {
4332 /* override exception from _PyLong_AsInt() */
4333 PyErr_SetString(PyExc_TypeError,
4334 "Invalid or missing argument 'op'");
4335 goto finally;
4336 }
4337 /* assoclen is optional but must be >= 0 */
4338 if (assoclenobj != NULL) {
4339 assoclen = _PyLong_AsInt(assoclenobj);
4340 if (assoclen == -1 && PyErr_Occurred()) {
4341 goto finally;
4342 }
4343 if (assoclen < 0) {
4344 PyErr_SetString(PyExc_TypeError,
4345 "assoclen must be positive");
4346 goto finally;
4347 }
4348 }
4349
4350 controllen = CMSG_SPACE(4);
4351 if (iv.buf != NULL) {
4352 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4353 }
4354 if (assoclen >= 0) {
4355 controllen += CMSG_SPACE(4);
4356 }
4357
4358 controlbuf = PyMem_Malloc(controllen);
4359 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004360 PyErr_NoMemory();
4361 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004362 }
4363 memset(controlbuf, 0, controllen);
4364
Christian Heimesdffa3942016-09-05 23:54:41 +02004365 msg.msg_controllen = controllen;
4366 msg.msg_control = controlbuf;
4367
4368 /* Fill in an iovec for each message part, and save the Py_buffer
4369 structs to release afterwards. */
4370 if (data_arg != NULL) {
4371 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4372 goto finally;
4373 }
4374 }
4375
4376 /* set operation to encrypt or decrypt */
4377 header = CMSG_FIRSTHDR(&msg);
4378 if (header == NULL) {
4379 PyErr_SetString(PyExc_RuntimeError,
4380 "unexpected NULL result from CMSG_FIRSTHDR");
4381 goto finally;
4382 }
4383 header->cmsg_level = SOL_ALG;
4384 header->cmsg_type = ALG_SET_OP;
4385 header->cmsg_len = CMSG_LEN(4);
4386 uiptr = (void*)CMSG_DATA(header);
4387 *uiptr = (unsigned int)op;
4388
4389 /* set initialization vector */
4390 if (iv.buf != NULL) {
4391 header = CMSG_NXTHDR(&msg, header);
4392 if (header == NULL) {
4393 PyErr_SetString(PyExc_RuntimeError,
4394 "unexpected NULL result from CMSG_NXTHDR(iv)");
4395 goto finally;
4396 }
4397 header->cmsg_level = SOL_ALG;
4398 header->cmsg_type = ALG_SET_IV;
4399 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4400 alg_iv = (void*)CMSG_DATA(header);
4401 alg_iv->ivlen = iv.len;
4402 memcpy(alg_iv->iv, iv.buf, iv.len);
4403 }
4404
4405 /* set length of associated data for AEAD */
4406 if (assoclen >= 0) {
4407 header = CMSG_NXTHDR(&msg, header);
4408 if (header == NULL) {
4409 PyErr_SetString(PyExc_RuntimeError,
4410 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4411 goto finally;
4412 }
4413 header->cmsg_level = SOL_ALG;
4414 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4415 header->cmsg_len = CMSG_LEN(4);
4416 uiptr = (void*)CMSG_DATA(header);
4417 *uiptr = (unsigned int)assoclen;
4418 }
4419
4420 ctx.msg = &msg;
4421 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004422 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004423 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004424 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004425
4426 retval = PyLong_FromSsize_t(ctx.result);
4427
4428 finally:
4429 PyMem_Free(controlbuf);
4430 if (iv.buf != NULL) {
4431 PyBuffer_Release(&iv);
4432 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004433 PyMem_Free(msg.msg_iov);
4434 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004435 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004436 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004437 PyMem_Free(databufs);
4438 return retval;
4439}
4440
4441PyDoc_STRVAR(sendmsg_afalg_doc,
4442"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4443\n\
4444Set operation mode, IV and length of associated data for an AF_ALG\n\
4445operation socket.");
4446#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004447
Guido van Rossum30a685f1991-06-27 15:51:29 +00004448/* s.shutdown(how) method */
4449
Guido van Rossum73624e91994-10-10 17:59:00 +00004450static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004451sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 int how;
4454 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004455
Serhiy Storchaka78980432013-01-15 01:12:17 +02004456 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 if (how == -1 && PyErr_Occurred())
4458 return NULL;
4459 Py_BEGIN_ALLOW_THREADS
4460 res = shutdown(s->sock_fd, how);
4461 Py_END_ALLOW_THREADS
4462 if (res < 0)
4463 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004464 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004465}
4466
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004467PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004468"shutdown(flag)\n\
4469\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004470Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4471of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004472
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004473#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004474static PyObject*
4475sock_ioctl(PySocketSockObject *s, PyObject *arg)
4476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 unsigned long cmd = SIO_RCVALL;
4478 PyObject *argO;
4479 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4482 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 switch (cmd) {
4485 case SIO_RCVALL: {
4486 unsigned int option = RCVALL_ON;
4487 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4488 return NULL;
4489 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4490 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4491 return set_error();
4492 }
4493 return PyLong_FromUnsignedLong(recv); }
4494 case SIO_KEEPALIVE_VALS: {
4495 struct tcp_keepalive ka;
4496 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4497 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4498 return NULL;
4499 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4500 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4501 return set_error();
4502 }
4503 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004504#if defined(SIO_LOOPBACK_FAST_PATH)
4505 case SIO_LOOPBACK_FAST_PATH: {
4506 unsigned int option;
4507 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4508 return NULL;
4509 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4510 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4511 return set_error();
4512 }
4513 return PyLong_FromUnsignedLong(recv); }
4514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004515 default:
4516 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4517 return NULL;
4518 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004519}
4520PyDoc_STRVAR(sock_ioctl_doc,
4521"ioctl(cmd, option) -> long\n\
4522\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004523Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4524SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004525SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4526SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004527#endif
4528
4529#if defined(MS_WINDOWS)
4530static PyObject*
4531sock_share(PySocketSockObject *s, PyObject *arg)
4532{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004533 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004534 DWORD processId;
4535 int result;
4536
4537 if (!PyArg_ParseTuple(arg, "I", &processId))
4538 return NULL;
4539
4540 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004541 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004542 Py_END_ALLOW_THREADS
4543 if (result == SOCKET_ERROR)
4544 return set_error();
4545 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4546}
4547PyDoc_STRVAR(sock_share_doc,
4548"share(process_id) -> bytes\n\
4549\n\
4550Share the socket with another process. The target process id\n\
4551must be provided and the resulting bytes object passed to the target\n\
4552process. There the shared socket can be instantiated by calling\n\
4553socket.fromshare().");
4554
Christian Heimesfaf2f632008-01-06 16:59:19 +00004555
4556#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004557
4558/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004559
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004560static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4562 accept_doc},
4563 {"bind", (PyCFunction)sock_bind, METH_O,
4564 bind_doc},
4565 {"close", (PyCFunction)sock_close, METH_NOARGS,
4566 close_doc},
4567 {"connect", (PyCFunction)sock_connect, METH_O,
4568 connect_doc},
4569 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4570 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004571 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4572 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4574 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004575#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 {"getpeername", (PyCFunction)sock_getpeername,
4577 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 {"getsockname", (PyCFunction)sock_getsockname,
4580 METH_NOARGS, getsockname_doc},
4581 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4582 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004583#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4585 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004586#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004587#if defined(MS_WINDOWS)
4588 {"share", (PyCFunction)sock_share, METH_VARARGS,
4589 sock_share_doc},
4590#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004591 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 listen_doc},
4593 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4594 recv_doc},
4595 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4596 recv_into_doc},
4597 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4598 recvfrom_doc},
4599 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4600 recvfrom_into_doc},
4601 {"send", (PyCFunction)sock_send, METH_VARARGS,
4602 send_doc},
4603 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4604 sendall_doc},
4605 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4606 sendto_doc},
4607 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4608 setblocking_doc},
4609 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4610 settimeout_doc},
4611 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4612 gettimeout_doc},
4613 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4614 setsockopt_doc},
4615 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4616 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004617#ifdef CMSG_LEN
4618 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4619 recvmsg_doc},
4620 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4621 recvmsg_into_doc,},
4622 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4623 sendmsg_doc},
4624#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004625#ifdef HAVE_SOCKADDR_ALG
4626 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4627 sendmsg_afalg_doc},
4628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004630};
4631
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004632/* SockObject members */
4633static PyMemberDef sock_memberlist[] = {
4634 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4635 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4636 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004637 {0},
4638};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004639
Victor Stinner71694d52015-03-28 01:18:54 +01004640static PyGetSetDef sock_getsetlist[] = {
4641 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4642 {NULL} /* sentinel */
4643};
4644
Guido van Rossum73624e91994-10-10 17:59:00 +00004645/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004646 First close the file description. */
4647
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004648static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004649sock_finalize(PySocketSockObject *s)
4650{
4651 SOCKET_T fd;
4652 PyObject *error_type, *error_value, *error_traceback;
4653
4654 /* Save the current exception, if any. */
4655 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4656
Victor Stinnerd3afb622016-07-22 17:47:09 +02004657 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004658 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4659 /* Spurious errors can appear at shutdown */
4660 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4661 PyErr_WriteUnraisable((PyObject *)s);
4662 }
4663 }
4664
4665 /* Only close the socket *after* logging the ResourceWarning warning
4666 to allow the logger to call socket methods like
4667 socket.getsockname(). If the socket is closed before, socket
4668 methods fails with the EBADF error. */
4669 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004670 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004671
4672 /* We do not want to retry upon EINTR: see sock_close() */
4673 Py_BEGIN_ALLOW_THREADS
4674 (void) SOCKETCLOSE(fd);
4675 Py_END_ALLOW_THREADS
4676 }
4677
4678 /* Restore the saved exception. */
4679 PyErr_Restore(error_type, error_value, error_traceback);
4680}
4681
4682static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004683sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004684{
Victor Stinner19a8e842016-03-21 16:36:48 +01004685 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4686 return;
4687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004689}
4690
Guido van Rossum30a685f1991-06-27 15:51:29 +00004691
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004693sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004694{
Victor Stinnere254e532014-07-26 14:36:55 +02004695 long sock_fd;
4696 /* On Windows, this test is needed because SOCKET_T is unsigned */
4697 if (s->sock_fd == INVALID_SOCKET) {
4698 sock_fd = -1;
4699 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004700#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004701 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 /* this can occur on Win64, and actually there is a special
4703 ugly printf formatter for decimal pointer length integer
4704 printing, only bother if necessary*/
4705 PyErr_SetString(PyExc_OverflowError,
4706 "no printf formatter to display "
4707 "the socket descriptor in decimal");
4708 return NULL;
4709 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004710#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004711 else
4712 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 return PyUnicode_FromFormat(
4714 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004715 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716 s->sock_type,
4717 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004718}
4719
4720
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004721/* Create a new, uninitialized socket object. */
4722
4723static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004724sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 new = type->tp_alloc(type, 0);
4729 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004730 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004731 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 ((PySocketSockObject *)new)->errorhandler = &set_error;
4733 }
4734 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004735}
4736
4737
4738/* Initialize a new socket object. */
4739
Victor Stinnerdaf45552013-08-28 00:53:59 +02004740#ifdef SOCK_CLOEXEC
4741/* socket() and socketpair() fail with EINVAL on Linux kernel older
4742 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4743static int sock_cloexec_works = -1;
4744#endif
4745
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004746/*ARGSUSED*/
4747static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004748sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 PySocketSockObject *s = (PySocketSockObject *)self;
4751 PyObject *fdobj = NULL;
4752 SOCKET_T fd = INVALID_SOCKET;
4753 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4754 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004755#ifndef MS_WINDOWS
4756#ifdef SOCK_CLOEXEC
4757 int *atomic_flag_works = &sock_cloexec_works;
4758#else
4759 int *atomic_flag_works = NULL;
4760#endif
4761#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4764 "|iiiO:socket", keywords,
4765 &family, &type, &proto, &fdobj))
4766 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004769#ifdef MS_WINDOWS
4770 /* recreate a socket that was duplicated */
4771 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004772 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004773 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4774 PyErr_Format(PyExc_ValueError,
4775 "socket descriptor string has wrong size, "
4776 "should be %zu bytes.", sizeof(info));
4777 return -1;
4778 }
4779 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4780 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004781 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004782 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4783 Py_END_ALLOW_THREADS
4784 if (fd == INVALID_SOCKET) {
4785 set_error();
4786 return -1;
4787 }
4788 family = info.iAddressFamily;
4789 type = info.iSocketType;
4790 proto = info.iProtocol;
4791 }
4792 else
4793#endif
4794 {
4795 fd = PyLong_AsSocket_t(fdobj);
4796 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4797 return -1;
4798 if (fd == INVALID_SOCKET) {
4799 PyErr_SetString(PyExc_ValueError,
4800 "can't use invalid socket value");
4801 return -1;
4802 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004803 }
4804 }
4805 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004806#ifdef MS_WINDOWS
4807 /* Windows implementation */
4808#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4809#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4810#endif
4811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004813 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004814 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004815 NULL, 0,
4816 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4817 if (fd == INVALID_SOCKET) {
4818 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4819 support_wsa_no_inherit = 0;
4820 fd = socket(family, type, proto);
4821 }
4822 }
4823 else {
4824 fd = socket(family, type, proto);
4825 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 if (fd == INVALID_SOCKET) {
4829 set_error();
4830 return -1;
4831 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004832
4833 if (!support_wsa_no_inherit) {
4834 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4835 closesocket(fd);
4836 PyErr_SetFromWindowsErr(0);
4837 return -1;
4838 }
4839 }
4840#else
4841 /* UNIX */
4842 Py_BEGIN_ALLOW_THREADS
4843#ifdef SOCK_CLOEXEC
4844 if (sock_cloexec_works != 0) {
4845 fd = socket(family, type | SOCK_CLOEXEC, proto);
4846 if (sock_cloexec_works == -1) {
4847 if (fd >= 0) {
4848 sock_cloexec_works = 1;
4849 }
4850 else if (errno == EINVAL) {
4851 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4852 sock_cloexec_works = 0;
4853 fd = socket(family, type, proto);
4854 }
4855 }
4856 }
4857 else
4858#endif
4859 {
4860 fd = socket(family, type, proto);
4861 }
4862 Py_END_ALLOW_THREADS
4863
4864 if (fd == INVALID_SOCKET) {
4865 set_error();
4866 return -1;
4867 }
4868
4869 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4870 SOCKETCLOSE(fd);
4871 return -1;
4872 }
4873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004875 if (init_sockobject(s, fd, family, type, proto) == -1) {
4876 SOCKETCLOSE(fd);
4877 return -1;
4878 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004881
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004882}
4883
4884
Guido van Rossumb6775db1994-08-01 11:34:53 +00004885/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004886
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004887static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4889 "_socket.socket", /* tp_name */
4890 sizeof(PySocketSockObject), /* tp_basicsize */
4891 0, /* tp_itemsize */
4892 (destructor)sock_dealloc, /* tp_dealloc */
4893 0, /* tp_print */
4894 0, /* tp_getattr */
4895 0, /* tp_setattr */
4896 0, /* tp_reserved */
4897 (reprfunc)sock_repr, /* tp_repr */
4898 0, /* tp_as_number */
4899 0, /* tp_as_sequence */
4900 0, /* tp_as_mapping */
4901 0, /* tp_hash */
4902 0, /* tp_call */
4903 0, /* tp_str */
4904 PyObject_GenericGetAttr, /* tp_getattro */
4905 0, /* tp_setattro */
4906 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004907 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4908 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 sock_doc, /* tp_doc */
4910 0, /* tp_traverse */
4911 0, /* tp_clear */
4912 0, /* tp_richcompare */
4913 0, /* tp_weaklistoffset */
4914 0, /* tp_iter */
4915 0, /* tp_iternext */
4916 sock_methods, /* tp_methods */
4917 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004918 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 0, /* tp_base */
4920 0, /* tp_dict */
4921 0, /* tp_descr_get */
4922 0, /* tp_descr_set */
4923 0, /* tp_dictoffset */
4924 sock_initobj, /* tp_init */
4925 PyType_GenericAlloc, /* tp_alloc */
4926 sock_new, /* tp_new */
4927 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004928 0, /* tp_is_gc */
4929 0, /* tp_bases */
4930 0, /* tp_mro */
4931 0, /* tp_cache */
4932 0, /* tp_subclasses */
4933 0, /* tp_weaklist */
4934 0, /* tp_del */
4935 0, /* tp_version_tag */
4936 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004937};
4938
Guido van Rossum30a685f1991-06-27 15:51:29 +00004939
Guido van Rossum81194471991-07-27 21:42:02 +00004940/* Python interface to gethostname(). */
4941
4942/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004943static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004944socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004945{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004946#ifdef MS_WINDOWS
4947 /* Don't use winsock's gethostname, as this returns the ANSI
4948 version of the hostname, whereas we need a Unicode string.
4949 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004950 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004951 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004952 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004953 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004954
4955 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004956 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004957
4958 if (GetLastError() != ERROR_MORE_DATA)
4959 return PyErr_SetFromWindowsErr(0);
4960
4961 if (size == 0)
4962 return PyUnicode_New(0, 0);
4963
4964 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4965 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004966 name = PyMem_New(wchar_t, size);
4967 if (!name) {
4968 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004969 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004970 }
Victor Stinner74168972011-11-17 01:11:36 +01004971 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4972 name,
4973 &size))
4974 {
4975 PyMem_Free(name);
4976 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004977 }
Victor Stinner74168972011-11-17 01:11:36 +01004978
4979 result = PyUnicode_FromWideChar(name, size);
4980 PyMem_Free(name);
4981 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004982#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 char buf[1024];
4984 int res;
4985 Py_BEGIN_ALLOW_THREADS
4986 res = gethostname(buf, (int) sizeof buf - 1);
4987 Py_END_ALLOW_THREADS
4988 if (res < 0)
4989 return set_error();
4990 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004991 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004992#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004993}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004995PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004996"gethostname() -> string\n\
4997\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004998Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004999
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005000#ifdef HAVE_SETHOSTNAME
5001PyDoc_STRVAR(sethostname_doc,
5002"sethostname(name)\n\n\
5003Sets the hostname to name.");
5004
5005static PyObject *
5006socket_sethostname(PyObject *self, PyObject *args)
5007{
5008 PyObject *hnobj;
5009 Py_buffer buf;
5010 int res, flag = 0;
5011
Christian Heimesd2774c72013-06-19 02:06:29 +02005012#ifdef _AIX
5013/* issue #18259, not declared in any useful header file */
5014extern int sethostname(const char *, size_t);
5015#endif
5016
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005017 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5018 PyErr_Clear();
5019 if (!PyArg_ParseTuple(args, "O&:sethostname",
5020 PyUnicode_FSConverter, &hnobj))
5021 return NULL;
5022 flag = 1;
5023 }
5024 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5025 if (!res) {
5026 res = sethostname(buf.buf, buf.len);
5027 PyBuffer_Release(&buf);
5028 }
5029 if (flag)
5030 Py_DECREF(hnobj);
5031 if (res)
5032 return set_error();
5033 Py_RETURN_NONE;
5034}
5035#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005036
Guido van Rossum30a685f1991-06-27 15:51:29 +00005037/* Python interface to gethostbyname(name). */
5038
5039/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005040static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005041socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 char *name;
5044 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005045 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005046
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005047 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 return NULL;
5049 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005050 goto finally;
5051 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5052finally:
5053 PyMem_Free(name);
5054 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005055}
5056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005057PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005058"gethostbyname(host) -> address\n\
5059\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005060Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005061
5062
Victor Stinner72400302016-01-28 15:41:01 +01005063static PyObject*
5064sock_decode_hostname(const char *name)
5065{
5066#ifdef MS_WINDOWS
5067 /* Issue #26227: gethostbyaddr() returns a string encoded
5068 * to the ANSI code page */
5069 return PyUnicode_DecodeFSDefault(name);
5070#else
5071 /* Decode from UTF-8 */
5072 return PyUnicode_FromString(name);
5073#endif
5074}
5075
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005076/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5077
5078static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005079gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 char **pch;
5082 PyObject *rtn_tuple = (PyObject *)NULL;
5083 PyObject *name_list = (PyObject *)NULL;
5084 PyObject *addr_list = (PyObject *)NULL;
5085 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005086 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 if (h == NULL) {
5089 /* Let's get real error message to return */
5090 set_herror(h_errno);
5091 return NULL;
5092 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 if (h->h_addrtype != af) {
5095 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005096 errno = EAFNOSUPPORT;
5097 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 return NULL;
5099 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 case AF_INET:
5104 if (alen < sizeof(struct sockaddr_in))
5105 return NULL;
5106 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005107
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005108#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 case AF_INET6:
5110 if (alen < sizeof(struct sockaddr_in6))
5111 return NULL;
5112 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005113#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 if ((name_list = PyList_New(0)) == NULL)
5118 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 if ((addr_list = PyList_New(0)) == NULL)
5121 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 /* SF #1511317: h_aliases can be NULL */
5124 if (h->h_aliases) {
5125 for (pch = h->h_aliases; *pch != NULL; pch++) {
5126 int status;
5127 tmp = PyUnicode_FromString(*pch);
5128 if (tmp == NULL)
5129 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 status = PyList_Append(name_list, tmp);
5132 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 if (status)
5135 goto err;
5136 }
5137 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5140 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 case AF_INET:
5145 {
5146 struct sockaddr_in sin;
5147 memset(&sin, 0, sizeof(sin));
5148 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005149#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5153 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 if (pch == h->h_addr_list && alen >= sizeof(sin))
5156 memcpy((char *) addr, &sin, sizeof(sin));
5157 break;
5158 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005159
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005160#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 case AF_INET6:
5162 {
5163 struct sockaddr_in6 sin6;
5164 memset(&sin6, 0, sizeof(sin6));
5165 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005166#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5170 tmp = makeipaddr((struct sockaddr *)&sin6,
5171 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5174 memcpy((char *) addr, &sin6, sizeof(sin6));
5175 break;
5176 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005177#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005180 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 "unsupported address family");
5182 return NULL;
5183 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 if (tmp == NULL)
5186 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 status = PyList_Append(addr_list, tmp);
5189 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 if (status)
5192 goto err;
5193 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005194
Victor Stinner72400302016-01-28 15:41:01 +01005195 name = sock_decode_hostname(h->h_name);
5196 if (name == NULL)
5197 goto err;
5198 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005199
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005200 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 Py_XDECREF(name_list);
5202 Py_XDECREF(addr_list);
5203 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005204}
5205
5206
5207/* Python interface to gethostbyname_ex(name). */
5208
5209/*ARGSUSED*/
5210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005211socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 char *name;
5214 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005215 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005217 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005218#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005220#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005222#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 char buf[16384];
5224 int buf_len = (sizeof buf) - 1;
5225 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005226#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005227#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005229#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005230#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005231
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005232 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005234 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005235 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005237#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005238#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005239 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005241#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005243#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 memset((void *) &data, '\0', sizeof(data));
5245 result = gethostbyname_r(name, &hp_allocated, &data);
5246 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005247#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005248#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005249#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005251#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005252 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005254#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 Py_END_ALLOW_THREADS
5256 /* Some C libraries would require addr.__ss_family instead of
5257 addr.ss_family.
5258 Therefore, we cast the sockaddr_storage into sockaddr to
5259 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005260 sa = SAS2SA(&addr);
5261 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005263#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005265#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005266finally:
5267 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005269}
5270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005271PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005272"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5273\n\
5274Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005275for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005276
5277
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005278/* Python interface to gethostbyaddr(IP). */
5279
5280/*ARGSUSED*/
5281static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005282socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005283{
Charles-François Natali8b759652011-12-23 16:44:51 +01005284 sock_addr_t addr;
5285 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 char *ip_num;
5287 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005288 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005289#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005291#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005293#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 /* glibcs up to 2.10 assume that the buf argument to
5295 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5296 does not ensure. The attribute below instructs the compiler
5297 to maintain this alignment. */
5298 char buf[16384] Py_ALIGNED(8);
5299 int buf_len = (sizeof buf) - 1;
5300 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005301#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005302#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005304#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005305#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 char *ap;
5307 int al;
5308 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005309
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005310 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 return NULL;
5312 af = AF_UNSPEC;
5313 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005314 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 af = sa->sa_family;
5316 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005317 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 switch (af) {
5319 case AF_INET:
5320 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5321 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5322 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005323#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 case AF_INET6:
5325 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5326 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5327 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005330 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005331 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 }
5333 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005334#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005335#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005336 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 &hp_allocated, buf, buf_len,
5338 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005339#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 h = gethostbyaddr_r(ap, al, af,
5341 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005342#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 memset((void *) &data, '\0', sizeof(data));
5344 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5345 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005346#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005347#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005348#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005350#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005351 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005353#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005355 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005356#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005358#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005359finally:
5360 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005362}
5363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005364PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005365"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5366\n\
5367Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005368for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005369
Guido van Rossum30a685f1991-06-27 15:51:29 +00005370
5371/* Python interface to getservbyname(name).
5372 This only returns the port number, since the other info is already
5373 known or not useful (like the list of aliases). */
5374
5375/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005376static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005377socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 char *name, *proto=NULL;
5380 struct servent *sp;
5381 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5382 return NULL;
5383 Py_BEGIN_ALLOW_THREADS
5384 sp = getservbyname(name, proto);
5385 Py_END_ALLOW_THREADS
5386 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005387 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 return NULL;
5389 }
5390 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005391}
5392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005393PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005394"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005395\n\
5396Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005397The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5398otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005399
Guido van Rossum30a685f1991-06-27 15:51:29 +00005400
Barry Warsaw11b91a02004-06-28 00:50:43 +00005401/* Python interface to getservbyport(port).
5402 This only returns the service name, since the other info is already
5403 known or not useful (like the list of aliases). */
5404
5405/*ARGSUSED*/
5406static PyObject *
5407socket_getservbyport(PyObject *self, PyObject *args)
5408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 int port;
5410 char *proto=NULL;
5411 struct servent *sp;
5412 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5413 return NULL;
5414 if (port < 0 || port > 0xffff) {
5415 PyErr_SetString(
5416 PyExc_OverflowError,
5417 "getservbyport: port must be 0-65535.");
5418 return NULL;
5419 }
5420 Py_BEGIN_ALLOW_THREADS
5421 sp = getservbyport(htons((short)port), proto);
5422 Py_END_ALLOW_THREADS
5423 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005424 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 return NULL;
5426 }
5427 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005428}
5429
5430PyDoc_STRVAR(getservbyport_doc,
5431"getservbyport(port[, protocolname]) -> string\n\
5432\n\
5433Return the service name from a port number and protocol name.\n\
5434The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5435otherwise any protocol will match.");
5436
Guido van Rossum3901d851996-12-19 16:35:04 +00005437/* Python interface to getprotobyname(name).
5438 This only returns the protocol number, since the other info is
5439 already known or not useful (like the list of aliases). */
5440
5441/*ARGSUSED*/
5442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005443socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 char *name;
5446 struct protoent *sp;
5447 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5448 return NULL;
5449 Py_BEGIN_ALLOW_THREADS
5450 sp = getprotobyname(name);
5451 Py_END_ALLOW_THREADS
5452 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005453 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 return NULL;
5455 }
5456 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005457}
5458
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005459PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005460"getprotobyname(name) -> integer\n\
5461\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005462Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005463
Guido van Rossum3901d851996-12-19 16:35:04 +00005464
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005465#ifndef NO_DUP
5466/* dup() function for socket fds */
5467
5468static PyObject *
5469socket_dup(PyObject *self, PyObject *fdobj)
5470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 SOCKET_T fd, newfd;
5472 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005473#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005474 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005475#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 fd = PyLong_AsSocket_t(fdobj);
5478 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5479 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005480
Victor Stinnerdaf45552013-08-28 00:53:59 +02005481#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005482 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005483 return set_error();
5484
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005485 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005486 FROM_PROTOCOL_INFO,
5487 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 if (newfd == INVALID_SOCKET)
5489 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005490
Victor Stinnerdaf45552013-08-28 00:53:59 +02005491 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5492 closesocket(newfd);
5493 PyErr_SetFromWindowsErr(0);
5494 return NULL;
5495 }
5496#else
5497 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5498 newfd = _Py_dup(fd);
5499 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005500 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005501#endif
5502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 newfdobj = PyLong_FromSocket_t(newfd);
5504 if (newfdobj == NULL)
5505 SOCKETCLOSE(newfd);
5506 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005507}
5508
5509PyDoc_STRVAR(dup_doc,
5510"dup(integer) -> integer\n\
5511\n\
5512Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5513sockets; on some platforms os.dup() won't work for socket file descriptors.");
5514#endif
5515
5516
Dave Cole331708b2004-08-09 04:51:41 +00005517#ifdef HAVE_SOCKETPAIR
5518/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005519 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005520 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005521
5522/*ARGSUSED*/
5523static PyObject *
5524socket_socketpair(PyObject *self, PyObject *args)
5525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 PySocketSockObject *s0 = NULL, *s1 = NULL;
5527 SOCKET_T sv[2];
5528 int family, type = SOCK_STREAM, proto = 0;
5529 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005530#ifdef SOCK_CLOEXEC
5531 int *atomic_flag_works = &sock_cloexec_works;
5532#else
5533 int *atomic_flag_works = NULL;
5534#endif
5535 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005536
5537#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5543 &family, &type, &proto))
5544 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005547 Py_BEGIN_ALLOW_THREADS
5548#ifdef SOCK_CLOEXEC
5549 if (sock_cloexec_works != 0) {
5550 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5551 if (sock_cloexec_works == -1) {
5552 if (ret >= 0) {
5553 sock_cloexec_works = 1;
5554 }
5555 else if (errno == EINVAL) {
5556 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5557 sock_cloexec_works = 0;
5558 ret = socketpair(family, type, proto, sv);
5559 }
5560 }
5561 }
5562 else
5563#endif
5564 {
5565 ret = socketpair(family, type, proto, sv);
5566 }
5567 Py_END_ALLOW_THREADS
5568
5569 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005571
5572 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5573 goto finally;
5574 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5575 goto finally;
5576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 s0 = new_sockobject(sv[0], family, type, proto);
5578 if (s0 == NULL)
5579 goto finally;
5580 s1 = new_sockobject(sv[1], family, type, proto);
5581 if (s1 == NULL)
5582 goto finally;
5583 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005584
5585finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 if (res == NULL) {
5587 if (s0 == NULL)
5588 SOCKETCLOSE(sv[0]);
5589 if (s1 == NULL)
5590 SOCKETCLOSE(sv[1]);
5591 }
5592 Py_XDECREF(s0);
5593 Py_XDECREF(s1);
5594 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005595}
5596
5597PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005598"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005599\n\
5600Create a pair of socket objects from the sockets returned by the platform\n\
5601socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005602The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005603AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005604
5605#endif /* HAVE_SOCKETPAIR */
5606
5607
Guido van Rossum006bf911996-06-12 04:04:55 +00005608static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005609socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005610{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005611 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005612
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005613 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 return NULL;
5615 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005616 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005618 "ntohs: can't convert negative Python int to C "
5619 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 return NULL;
5621 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005622 if (x > 0xffff) {
5623 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5624 "ntohs: Python int too large to convert to C "
5625 "16-bit unsigned integer (The silent truncation "
5626 "is deprecated)",
5627 1)) {
5628 return NULL;
5629 }
5630 }
5631 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005632}
5633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005634PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005635"ntohs(integer) -> integer\n\
5636\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005637Convert a 16-bit unsigned integer from network to host byte order.\n\
5638Note that in case the received integer does not fit in 16-bit unsigned\n\
5639integer, but does fit in a positive C int, it is silently truncated to\n\
564016-bit unsigned integer.\n\
5641However, this silent truncation feature is deprecated, and will raise an \n\
5642exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005643
5644
Guido van Rossum006bf911996-06-12 04:04:55 +00005645static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005646socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 if (PyLong_Check(arg)) {
5651 x = PyLong_AsUnsignedLong(arg);
5652 if (x == (unsigned long) -1 && PyErr_Occurred())
5653 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005654#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 {
5656 unsigned long y;
5657 /* only want the trailing 32 bits */
5658 y = x & 0xFFFFFFFFUL;
5659 if (y ^ x)
5660 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005661 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 x = y;
5663 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 }
5666 else
5667 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005668 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005671}
5672
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005673PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005674"ntohl(integer) -> integer\n\
5675\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005676Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005677
5678
Guido van Rossum006bf911996-06-12 04:04:55 +00005679static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005680socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005681{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005682 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005683
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005684 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 return NULL;
5686 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005687 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005689 "htons: can't convert negative Python int to C "
5690 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 return NULL;
5692 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005693 if (x > 0xffff) {
5694 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5695 "htons: Python int too large to convert to C "
5696 "16-bit unsigned integer (The silent truncation "
5697 "is deprecated)",
5698 1)) {
5699 return NULL;
5700 }
5701 }
5702 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005703}
5704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005705PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005706"htons(integer) -> integer\n\
5707\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005708Convert a 16-bit unsigned integer from host to network byte order.\n\
5709Note that in case the received integer does not fit in 16-bit unsigned\n\
5710integer, but does fit in a positive C int, it is silently truncated to\n\
571116-bit unsigned integer.\n\
5712However, this silent truncation feature is deprecated, and will raise an \n\
5713exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005714
5715
Guido van Rossum006bf911996-06-12 04:04:55 +00005716static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005717socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 if (PyLong_Check(arg)) {
5722 x = PyLong_AsUnsignedLong(arg);
5723 if (x == (unsigned long) -1 && PyErr_Occurred())
5724 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005725#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 {
5727 unsigned long y;
5728 /* only want the trailing 32 bits */
5729 y = x & 0xFFFFFFFFUL;
5730 if (y ^ x)
5731 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005732 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 x = y;
5734 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 }
5737 else
5738 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005739 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 Py_TYPE(arg)->tp_name);
5741 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005742}
5743
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005744PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005745"htonl(integer) -> integer\n\
5746\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005747Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005748
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005749/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005750
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005751PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005752"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005753\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005754Convert 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 +00005755binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005756
5757static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005758socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005759{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005760#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005762#endif
5763
5764#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005765#if (SIZEOF_INT != 4)
5766#error "Not sure if in_addr_t exists and int is not 32-bits."
5767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 /* Have to use inet_addr() instead */
5769 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5774 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005775
Tim Peters1df9fdd2003-02-13 03:13:40 +00005776
5777#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005778
5779#ifdef USE_INET_ATON_WEAKLINK
5780 if (inet_aton != NULL) {
5781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 if (inet_aton(ip_addr, &buf))
5783 return PyBytes_FromStringAndSize((char *)(&buf),
5784 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005785
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005786 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 "illegal IP address string passed to inet_aton");
5788 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005789
Thomas Wouters477c8d52006-05-27 19:21:47 +00005790#ifdef USE_INET_ATON_WEAKLINK
5791 } else {
5792#endif
5793
5794#endif
5795
5796#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 /* special-case this address as inet_addr might return INADDR_NONE
5799 * for this */
5800 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005801 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005803
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005804 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005808 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 "illegal IP address string passed to inet_aton");
5810 return NULL;
5811 }
5812 }
5813 return PyBytes_FromStringAndSize((char *) &packed_addr,
5814 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005815
5816#ifdef USE_INET_ATON_WEAKLINK
5817 }
5818#endif
5819
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005820#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005821}
5822
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005823PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005824"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005825\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005826Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005827
5828static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005829socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005830{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005831 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005833
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005834 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 return NULL;
5836 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005837
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005838 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005839 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005841 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 return NULL;
5843 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005844
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005845 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5846 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005847
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005848 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005850}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005851
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005852#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005853
5854PyDoc_STRVAR(inet_pton_doc,
5855"inet_pton(af, ip) -> packed IP address string\n\
5856\n\
5857Convert an IP address from string format to a packed string suitable\n\
5858for use with low-level network functions.");
5859
5860static PyObject *
5861socket_inet_pton(PyObject *self, PyObject *args)
5862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 int af;
5864 char* ip;
5865 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005866#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005867 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005868#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5872 return NULL;
5873 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005874
Martin v. Löwis04697e82004-06-02 12:35:29 +00005875#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005877 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 "can't use AF_INET6, IPv6 is disabled");
5879 return NULL;
5880 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005881#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 retval = inet_pton(af, ip, packed);
5884 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005885 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 return NULL;
5887 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005888 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 "illegal IP address string passed to inet_pton");
5890 return NULL;
5891 } else if (af == AF_INET) {
5892 return PyBytes_FromStringAndSize(packed,
5893 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005894#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 } else if (af == AF_INET6) {
5896 return PyBytes_FromStringAndSize(packed,
5897 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005900 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 return NULL;
5902 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005903}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005904
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005905PyDoc_STRVAR(inet_ntop_doc,
5906"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5907\n\
5908Convert a packed IP address of the given family to string format.");
5909
5910static PyObject *
5911socket_inet_ntop(PyObject *self, PyObject *args)
5912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005914 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005916#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005917 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005918#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005920#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5923 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005924
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005925 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 return NULL;
5927 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005930 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 PyErr_SetString(PyExc_ValueError,
5932 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005933 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 return NULL;
5935 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005936#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005938 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 PyErr_SetString(PyExc_ValueError,
5940 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005941 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 return NULL;
5943 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 } else {
5946 PyErr_Format(PyExc_ValueError,
5947 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005948 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 return NULL;
5950 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005951
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005952 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5953 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005955 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 return NULL;
5957 } else {
5958 return PyUnicode_FromString(retval);
5959 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005960}
5961
5962#endif /* HAVE_INET_PTON */
5963
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005964/* Python interface to getaddrinfo(host, port). */
5965
5966/*ARGSUSED*/
5967static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005968socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005969{
Victor Stinner77af1722011-05-26 14:05:59 +02005970 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005971 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 struct addrinfo hints, *res;
5973 struct addrinfo *res0 = NULL;
5974 PyObject *hobj = NULL;
5975 PyObject *pobj = (PyObject *)NULL;
5976 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005977 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 int family, socktype, protocol, flags;
5979 int error;
5980 PyObject *all = (PyObject *)NULL;
5981 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005982
Georg Brandl6083a4b2013-10-14 06:51:46 +02005983 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005985 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005986 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 &protocol, &flags)) {
5988 return NULL;
5989 }
5990 if (hobj == Py_None) {
5991 hptr = NULL;
5992 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005993 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 if (!idna)
5995 return NULL;
5996 assert(PyBytes_Check(idna));
5997 hptr = PyBytes_AS_STRING(idna);
5998 } else if (PyBytes_Check(hobj)) {
5999 hptr = PyBytes_AsString(hobj);
6000 } else {
6001 PyErr_SetString(PyExc_TypeError,
6002 "getaddrinfo() argument 1 must be string or None");
6003 return NULL;
6004 }
6005 if (PyLong_CheckExact(pobj)) {
6006 long value = PyLong_AsLong(pobj);
6007 if (value == -1 && PyErr_Occurred())
6008 goto err;
6009 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6010 pptr = pbuf;
6011 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006012 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006013 if (pptr == NULL)
6014 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006016 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 } else if (pobj == Py_None) {
6018 pptr = (char *)NULL;
6019 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006020 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 goto err;
6022 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006023#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006024 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6025 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006026 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6027 * This workaround avoids a segfault in libsystem.
6028 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006029 pptr = "00";
6030 }
6031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 memset(&hints, 0, sizeof(hints));
6033 hints.ai_family = family;
6034 hints.ai_socktype = socktype;
6035 hints.ai_protocol = protocol;
6036 hints.ai_flags = flags;
6037 Py_BEGIN_ALLOW_THREADS
6038 ACQUIRE_GETADDRINFO_LOCK
6039 error = getaddrinfo(hptr, pptr, &hints, &res0);
6040 Py_END_ALLOW_THREADS
6041 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6042 if (error) {
6043 set_gaierror(error);
6044 goto err;
6045 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006046
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006047 all = PyList_New(0);
6048 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 goto err;
6050 for (res = res0; res; res = res->ai_next) {
6051 PyObject *single;
6052 PyObject *addr =
6053 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6054 if (addr == NULL)
6055 goto err;
6056 single = Py_BuildValue("iiisO", res->ai_family,
6057 res->ai_socktype, res->ai_protocol,
6058 res->ai_canonname ? res->ai_canonname : "",
6059 addr);
6060 Py_DECREF(addr);
6061 if (single == NULL)
6062 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 if (PyList_Append(all, single))
6065 goto err;
6066 Py_XDECREF(single);
6067 }
6068 Py_XDECREF(idna);
6069 if (res0)
6070 freeaddrinfo(res0);
6071 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006072 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 Py_XDECREF(all);
6074 Py_XDECREF(idna);
6075 if (res0)
6076 freeaddrinfo(res0);
6077 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006078}
6079
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006080PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006081"getaddrinfo(host, port [, family, type, proto, flags])\n\
6082 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006083\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006084Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006085
6086/* Python interface to getnameinfo(sa, flags). */
6087
6088/*ARGSUSED*/
6089static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006090socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 PyObject *sa = (PyObject *)NULL;
6093 int flags;
6094 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006095 int port;
6096 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6098 struct addrinfo hints, *res = NULL;
6099 int error;
6100 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006101 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 flags = flowinfo = scope_id = 0;
6104 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6105 return NULL;
6106 if (!PyTuple_Check(sa)) {
6107 PyErr_SetString(PyExc_TypeError,
6108 "getnameinfo() argument 1 must be a tuple");
6109 return NULL;
6110 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006111 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006113 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006115 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006116 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006117 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006118 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006119 return NULL;
6120 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6122 memset(&hints, 0, sizeof(hints));
6123 hints.ai_family = AF_UNSPEC;
6124 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006125 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126 Py_BEGIN_ALLOW_THREADS
6127 ACQUIRE_GETADDRINFO_LOCK
6128 error = getaddrinfo(hostp, pbuf, &hints, &res);
6129 Py_END_ALLOW_THREADS
6130 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6131 if (error) {
6132 set_gaierror(error);
6133 goto fail;
6134 }
6135 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006136 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 "sockaddr resolved to multiple addresses");
6138 goto fail;
6139 }
6140 switch (res->ai_family) {
6141 case AF_INET:
6142 {
6143 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006144 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 "IPv4 sockaddr must be 2 tuple");
6146 goto fail;
6147 }
6148 break;
6149 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006150#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 case AF_INET6:
6152 {
6153 struct sockaddr_in6 *sin6;
6154 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006155 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 sin6->sin6_scope_id = scope_id;
6157 break;
6158 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006161 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6163 if (error) {
6164 set_gaierror(error);
6165 goto fail;
6166 }
Victor Stinner72400302016-01-28 15:41:01 +01006167
6168 name = sock_decode_hostname(hbuf);
6169 if (name == NULL)
6170 goto fail;
6171 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006172
6173fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 if (res)
6175 freeaddrinfo(res);
6176 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006177}
6178
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006179PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006180"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006181\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006182Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006183
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006184
6185/* Python API to getting and setting the default timeout value. */
6186
6187static PyObject *
6188socket_getdefaulttimeout(PyObject *self)
6189{
Victor Stinner71694d52015-03-28 01:18:54 +01006190 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006191 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 }
Victor Stinner71694d52015-03-28 01:18:54 +01006193 else {
6194 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6195 return PyFloat_FromDouble(seconds);
6196 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006197}
6198
6199PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006200"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006201\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006202Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006203A value of None indicates that new socket objects have no timeout.\n\
6204When the socket module is first imported, the default is None.");
6205
6206static PyObject *
6207socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6208{
Victor Stinner71694d52015-03-28 01:18:54 +01006209 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006210
Victor Stinner71694d52015-03-28 01:18:54 +01006211 if (socket_parse_timeout(&timeout, arg) < 0)
6212 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006215
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006216 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006217}
6218
6219PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006220"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006221\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006222Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006223A value of None indicates that new socket objects have no timeout.\n\
6224When the socket module is first imported, the default is None.");
6225
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006226#ifdef HAVE_IF_NAMEINDEX
6227/* Python API for getting interface indices and names */
6228
6229static PyObject *
6230socket_if_nameindex(PyObject *self, PyObject *arg)
6231{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006232 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006233 int i;
6234 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006235
Charles-François Natali60713592011-05-20 16:55:06 +02006236 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006237 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006238 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006239 return NULL;
6240 }
6241
6242 list = PyList_New(0);
6243 if (list == NULL) {
6244 if_freenameindex(ni);
6245 return NULL;
6246 }
6247
Charles-François Natali60713592011-05-20 16:55:06 +02006248 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6249 PyObject *ni_tuple = Py_BuildValue("IO&",
6250 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006251
6252 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6253 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006254 Py_DECREF(list);
6255 if_freenameindex(ni);
6256 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006257 }
6258 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006259 }
6260
6261 if_freenameindex(ni);
6262 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006263}
6264
6265PyDoc_STRVAR(if_nameindex_doc,
6266"if_nameindex()\n\
6267\n\
6268Returns a list of network interface information (index, name) tuples.");
6269
Charles-François Natali60713592011-05-20 16:55:06 +02006270static PyObject *
6271socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006272{
Charles-François Natali60713592011-05-20 16:55:06 +02006273 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006274 unsigned long index;
6275
Charles-François Natali60713592011-05-20 16:55:06 +02006276 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6277 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006278 return NULL;
6279
Charles-François Natali60713592011-05-20 16:55:06 +02006280 index = if_nametoindex(PyBytes_AS_STRING(oname));
6281 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006282 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006283 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006284 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006285 return NULL;
6286 }
6287
6288 return PyLong_FromUnsignedLong(index);
6289}
6290
6291PyDoc_STRVAR(if_nametoindex_doc,
6292"if_nametoindex(if_name)\n\
6293\n\
6294Returns the interface index corresponding to the interface name if_name.");
6295
Charles-François Natali60713592011-05-20 16:55:06 +02006296static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006297socket_if_indextoname(PyObject *self, PyObject *arg)
6298{
Charles-François Natali60713592011-05-20 16:55:06 +02006299 unsigned long index;
6300 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006301
Charles-François Natali60713592011-05-20 16:55:06 +02006302 index = PyLong_AsUnsignedLong(arg);
6303 if (index == (unsigned long) -1)
6304 return NULL;
6305
6306 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006307 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006308 return NULL;
6309 }
6310
Charles-François Natali60713592011-05-20 16:55:06 +02006311 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006312}
6313
6314PyDoc_STRVAR(if_indextoname_doc,
6315"if_indextoname(if_index)\n\
6316\n\
6317Returns the interface name corresponding to the interface index if_index.");
6318
6319#endif /* HAVE_IF_NAMEINDEX */
6320
6321
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006322#ifdef CMSG_LEN
6323/* Python interface to CMSG_LEN(length). */
6324
6325static PyObject *
6326socket_CMSG_LEN(PyObject *self, PyObject *args)
6327{
6328 Py_ssize_t length;
6329 size_t result;
6330
6331 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6332 return NULL;
6333 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6334 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6335 return NULL;
6336 }
6337 return PyLong_FromSize_t(result);
6338}
6339
6340PyDoc_STRVAR(CMSG_LEN_doc,
6341"CMSG_LEN(length) -> control message length\n\
6342\n\
6343Return the total length, without trailing padding, of an ancillary\n\
6344data item with associated data of the given length. This value can\n\
6345often be used as the buffer size for recvmsg() to receive a single\n\
6346item of ancillary data, but RFC 3542 requires portable applications to\n\
6347use CMSG_SPACE() and thus include space for padding, even when the\n\
6348item will be the last in the buffer. Raises OverflowError if length\n\
6349is outside the permissible range of values.");
6350
6351
6352#ifdef CMSG_SPACE
6353/* Python interface to CMSG_SPACE(length). */
6354
6355static PyObject *
6356socket_CMSG_SPACE(PyObject *self, PyObject *args)
6357{
6358 Py_ssize_t length;
6359 size_t result;
6360
6361 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6362 return NULL;
6363 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6364 PyErr_SetString(PyExc_OverflowError,
6365 "CMSG_SPACE() argument out of range");
6366 return NULL;
6367 }
6368 return PyLong_FromSize_t(result);
6369}
6370
6371PyDoc_STRVAR(CMSG_SPACE_doc,
6372"CMSG_SPACE(length) -> buffer size\n\
6373\n\
6374Return the buffer size needed for recvmsg() to receive an ancillary\n\
6375data item with associated data of the given length, along with any\n\
6376trailing padding. The buffer space needed to receive multiple items\n\
6377is the sum of the CMSG_SPACE() values for their associated data\n\
6378lengths. Raises OverflowError if length is outside the permissible\n\
6379range of values.");
6380#endif /* CMSG_SPACE */
6381#endif /* CMSG_LEN */
6382
6383
Guido van Rossum30a685f1991-06-27 15:51:29 +00006384/* List of functions exported by this module. */
6385
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006386static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 {"gethostbyname", socket_gethostbyname,
6388 METH_VARARGS, gethostbyname_doc},
6389 {"gethostbyname_ex", socket_gethostbyname_ex,
6390 METH_VARARGS, ghbn_ex_doc},
6391 {"gethostbyaddr", socket_gethostbyaddr,
6392 METH_VARARGS, gethostbyaddr_doc},
6393 {"gethostname", socket_gethostname,
6394 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006395#ifdef HAVE_SETHOSTNAME
6396 {"sethostname", socket_sethostname,
6397 METH_VARARGS, sethostname_doc},
6398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 {"getservbyname", socket_getservbyname,
6400 METH_VARARGS, getservbyname_doc},
6401 {"getservbyport", socket_getservbyport,
6402 METH_VARARGS, getservbyport_doc},
6403 {"getprotobyname", socket_getprotobyname,
6404 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006405#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 {"dup", socket_dup,
6407 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006408#endif
Dave Cole331708b2004-08-09 04:51:41 +00006409#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 {"socketpair", socket_socketpair,
6411 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 {"ntohs", socket_ntohs,
6414 METH_VARARGS, ntohs_doc},
6415 {"ntohl", socket_ntohl,
6416 METH_O, ntohl_doc},
6417 {"htons", socket_htons,
6418 METH_VARARGS, htons_doc},
6419 {"htonl", socket_htonl,
6420 METH_O, htonl_doc},
6421 {"inet_aton", socket_inet_aton,
6422 METH_VARARGS, inet_aton_doc},
6423 {"inet_ntoa", socket_inet_ntoa,
6424 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006425#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 {"inet_pton", socket_inet_pton,
6427 METH_VARARGS, inet_pton_doc},
6428 {"inet_ntop", socket_inet_ntop,
6429 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006430#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006431 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6432 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 {"getnameinfo", socket_getnameinfo,
6434 METH_VARARGS, getnameinfo_doc},
6435 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6436 METH_NOARGS, getdefaulttimeout_doc},
6437 {"setdefaulttimeout", socket_setdefaulttimeout,
6438 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006439#ifdef HAVE_IF_NAMEINDEX
6440 {"if_nameindex", socket_if_nameindex,
6441 METH_NOARGS, if_nameindex_doc},
6442 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006443 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006444 {"if_indextoname", socket_if_indextoname,
6445 METH_O, if_indextoname_doc},
6446#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006447#ifdef CMSG_LEN
6448 {"CMSG_LEN", socket_CMSG_LEN,
6449 METH_VARARGS, CMSG_LEN_doc},
6450#ifdef CMSG_SPACE
6451 {"CMSG_SPACE", socket_CMSG_SPACE,
6452 METH_VARARGS, CMSG_SPACE_doc},
6453#endif
6454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006456};
6457
Guido van Rossum30a685f1991-06-27 15:51:29 +00006458
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006459#ifdef MS_WINDOWS
6460#define OS_INIT_DEFINED
6461
6462/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006463
6464static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006465os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006468}
6469
6470static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006471os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 WSADATA WSAData;
6474 int ret;
6475 ret = WSAStartup(0x0101, &WSAData);
6476 switch (ret) {
6477 case 0: /* No error */
6478 Py_AtExit(os_cleanup);
6479 return 1; /* Success */
6480 case WSASYSNOTREADY:
6481 PyErr_SetString(PyExc_ImportError,
6482 "WSAStartup failed: network not ready");
6483 break;
6484 case WSAVERNOTSUPPORTED:
6485 case WSAEINVAL:
6486 PyErr_SetString(
6487 PyExc_ImportError,
6488 "WSAStartup failed: requested version not supported");
6489 break;
6490 default:
6491 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6492 break;
6493 }
6494 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006495}
6496
Guido van Rossum8d665e61996-06-26 18:22:49 +00006497#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006498
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006499
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006500
6501#ifndef OS_INIT_DEFINED
6502static int
6503os_init(void)
6504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006506}
6507#endif
6508
6509
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006510/* C API table - always add new things to the end for binary
6511 compatibility. */
6512static
6513PySocketModule_APIObject PySocketModuleAPI =
6514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006516 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006518};
6519
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006520
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006521/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006522
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006523 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006524 "socket.py" which implements some additional functionality.
6525 The import of "_socket" may fail with an ImportError exception if
6526 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006527 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006528 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006529*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006530
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006531PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006532"Implementation module for socket operations.\n\
6533\n\
6534See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006535
Martin v. Löwis1a214512008-06-11 05:26:20 +00006536static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 PyModuleDef_HEAD_INIT,
6538 PySocket_MODULE_NAME,
6539 socket_doc,
6540 -1,
6541 socket_methods,
6542 NULL,
6543 NULL,
6544 NULL,
6545 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006546};
6547
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006548PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006549PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 if (!os_init())
6554 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006555
Victor Stinnerdaf45552013-08-28 00:53:59 +02006556#ifdef MS_WINDOWS
6557 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006558#if defined(_MSC_VER) && _MSC_VER >= 1800
6559 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6560#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006561 DWORD version = GetVersion();
6562 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6563 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6564 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006565 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6566#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006567 }
6568#endif
6569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570 Py_TYPE(&sock_type) = &PyType_Type;
6571 m = PyModule_Create(&socketmodule);
6572 if (m == NULL)
6573 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006574
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006575 Py_INCREF(PyExc_OSError);
6576 PySocketModuleAPI.error = PyExc_OSError;
6577 Py_INCREF(PyExc_OSError);
6578 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006580 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 if (socket_herror == NULL)
6582 return NULL;
6583 Py_INCREF(socket_herror);
6584 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006585 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 NULL);
6587 if (socket_gaierror == NULL)
6588 return NULL;
6589 Py_INCREF(socket_gaierror);
6590 PyModule_AddObject(m, "gaierror", socket_gaierror);
6591 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006592 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 if (socket_timeout == NULL)
6594 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006595 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 Py_INCREF(socket_timeout);
6597 PyModule_AddObject(m, "timeout", socket_timeout);
6598 Py_INCREF((PyObject *)&sock_type);
6599 if (PyModule_AddObject(m, "SocketType",
6600 (PyObject *)&sock_type) != 0)
6601 return NULL;
6602 Py_INCREF((PyObject *)&sock_type);
6603 if (PyModule_AddObject(m, "socket",
6604 (PyObject *)&sock_type) != 0)
6605 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006606
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006607#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 Py_INCREF(has_ipv6);
6613 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615 /* Export C API */
6616 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6617 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6618 ) != 0)
6619 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006622#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006626#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006628#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006629#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006632#endif
6633#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006635#endif
6636#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006639#endif
6640#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006643#endif
6644#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006647#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006648#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006651#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006652#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006655#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006656#ifdef HAVE_SOCKADDR_ALG
6657 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6658#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006659#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006662#endif
6663#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006665#endif
6666#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006669#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006673#endif
6674#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006677#endif
6678#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006681#endif
6682#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006685#endif
6686#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, AF_NETLINK);
6689 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006690#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006692#endif
6693#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006695#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6697 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006698#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006700#endif
6701#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006703#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006704#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006706#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006707#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006709#endif
6710#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006712#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006714#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006716#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006717#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006719#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006720#ifdef NETLINK_CRYPTO
6721 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6722#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006723#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006724
6725#ifdef AF_VSOCK
6726 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6727 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6728 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6729 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6730 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6731 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6732 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6733 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6734 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6735#endif
6736
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006740#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006741#ifdef AF_LINK
6742 PyModule_AddIntMacro(m, AF_LINK);
6743#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006747#endif
6748#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006751#endif
6752#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006755#endif
6756#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006759#endif
6760#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006763#endif
6764#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006767#endif
6768#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006771#endif
6772#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006775#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006776
Hye-Shik Chang81268602004-02-02 06:05:24 +00006777#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6779 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6780 PyModule_AddIntMacro(m, BTPROTO_HCI);
6781 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006782#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006784#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006785#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006786#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006788#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6790 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006791#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6794 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006795#endif
6796
Charles-François Natali47413c12011-10-06 19:47:44 +02006797#ifdef AF_CAN
6798 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006800#endif
6801#ifdef PF_CAN
6802 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006804#endif
6805
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006806/* Reliable Datagram Sockets */
6807#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006809#endif
6810#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006812#endif
6813
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006814/* Kernel event messages */
6815#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006817#endif
6818#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006820#endif
6821
Antoine Pitroub156a462010-10-27 20:13:57 +00006822#ifdef AF_PACKET
6823 PyModule_AddIntMacro(m, AF_PACKET);
6824#endif
6825#ifdef PF_PACKET
6826 PyModule_AddIntMacro(m, PF_PACKET);
6827#endif
6828#ifdef PACKET_HOST
6829 PyModule_AddIntMacro(m, PACKET_HOST);
6830#endif
6831#ifdef PACKET_BROADCAST
6832 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6833#endif
6834#ifdef PACKET_MULTICAST
6835 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6836#endif
6837#ifdef PACKET_OTHERHOST
6838 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6839#endif
6840#ifdef PACKET_OUTGOING
6841 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6842#endif
6843#ifdef PACKET_LOOPBACK
6844 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6845#endif
6846#ifdef PACKET_FASTROUTE
6847 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006848#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006849
Christian Heimes043d6f62008-01-07 17:19:16 +00006850#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6855 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6856 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006857
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6859 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6860 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, SOL_TIPC);
6864 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6865 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6866 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6867 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006868
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6870 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6871 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6872 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6876 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006877#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006878 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006880#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6882 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6883 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6884 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6885 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6886 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006887#endif
6888
Christian Heimesdffa3942016-09-05 23:54:41 +02006889#ifdef HAVE_SOCKADDR_ALG
6890 /* Socket options */
6891 PyModule_AddIntMacro(m, ALG_SET_KEY);
6892 PyModule_AddIntMacro(m, ALG_SET_IV);
6893 PyModule_AddIntMacro(m, ALG_SET_OP);
6894 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6895 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6896 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6897
6898 /* Operations */
6899 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6900 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6901 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6902 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6903#endif
6904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006905 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, SOCK_STREAM);
6907 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006908/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006909#ifdef SOCK_RAW
6910 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006912#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006914#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006916#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006917#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006919#endif
6920#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006922#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006933#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006935#endif
6936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006954#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006955#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006958#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006986#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006987#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#endif
6990#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006992#endif
6993#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006995#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006996#ifdef SO_PASSSEC
6997 PyModule_AddIntMacro(m, SO_PASSSEC);
6998#endif
6999#ifdef SO_PEERSEC
7000 PyModule_AddIntMacro(m, SO_PEERSEC);
7001#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007002#ifdef SO_BINDTODEVICE
7003 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7004#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007005#ifdef SO_PRIORITY
7006 PyModule_AddIntMacro(m, SO_PRIORITY);
7007#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007008#ifdef SO_MARK
7009 PyModule_AddIntMacro(m, SO_MARK);
7010#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007011#ifdef SO_DOMAIN
7012 PyModule_AddIntMacro(m, SO_DOMAIN);
7013#endif
7014#ifdef SO_PROTOCOL
7015 PyModule_AddIntMacro(m, SO_PROTOCOL);
7016#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018 /* Maximum number of connections for "listen" */
7019#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007021#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007022 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007023#endif
7024
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007025 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007026#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007028#endif
7029#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007031#endif
7032#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007034#endif
7035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 /* Flags for send, recv */
7037#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007066#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007067#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007069#endif
7070#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007072#endif
7073#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007075#endif
7076#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007078#endif
7079#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007081#endif
7082#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007084#endif
7085#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007087#endif
7088#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007090#endif
7091#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007093#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007094#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007096#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 /* Protocol level and numbers, usable for [gs]etsockopt */
7099#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007104#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007129#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007131#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007132#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007134#endif
7135#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7137 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007138#endif
7139#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7141 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7142 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007143
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7145 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7146 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007147#ifdef CAN_ISOTP
7148 PyModule_AddIntMacro(m, CAN_ISOTP);
7149#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007150#endif
7151#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7153 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7154 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7155 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007156#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007157#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7158 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7159#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007160#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007162 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7163 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7164 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7165 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7166 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7167 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7168 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7169 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7170 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7171 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7172 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7173 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7174#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007175#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007177#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007178#ifdef HAVE_SOCKADDR_ALG
7179 PyModule_AddIntMacro(m, SOL_ALG);
7180#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007181#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007183#endif
7184#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007186#endif
7187#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007189#endif
7190#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007192#endif
7193#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007195#endif
7196#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007209#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007229#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007240#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007299#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007300#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007305#endif
7306/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007309#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#endif
7315
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007316#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007318#endif
7319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320 /* Some port configuration */
7321#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007330#endif
7331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332 /* Some reserved IP v.4 addresses */
7333#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007340#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007345#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007350#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef INADDR_ALLHOSTS_GROUP
7354 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7355 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007356#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007368#endif
7369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370 /* IPv4 [gs]etsockopt options */
7371#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007410#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007413#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007418#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007419#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007421#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7424#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007433#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007443#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007446 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007447#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007449#endif
7450#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007452#endif
7453#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007455#endif
7456#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007458#endif
7459#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#endif
7462#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007464#endif
7465#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007467#endif
7468#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#endif
7471#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007473#endif
7474#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
7477#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007479#endif
7480#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007482#endif
7483#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007485#endif
7486#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007488#endif
7489#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007491#endif
7492#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007494#endif
7495#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007497#endif
7498#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007500#endif
7501#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007503#endif
7504#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007506#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007508 /* TCP options */
7509#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007544#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007545#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007547#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007548#ifdef TCP_CONGESTION
7549 PyModule_AddIntMacro(m, TCP_CONGESTION);
7550#endif
7551#ifdef TCP_USER_TIMEOUT
7552 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7553#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007554#ifdef TCP_NOTSENT_LOWAT
7555 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7556#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 /* IPX options */
7559#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007561#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007562
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007563/* Reliable Datagram Sockets */
7564#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007566#endif
7567#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007569#endif
7570#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007572#endif
7573#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007575#endif
7576#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007578#endif
7579#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007581#endif
7582#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007584#endif
7585#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007587#endif
7588#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007590#endif
7591#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007593#endif
7594#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007596#endif
7597#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007599#endif
7600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007613#endif
7614#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#endif
7617#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
7620#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#endif
7623#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007625#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007626#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007628#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007629#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007634#endif
7635#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007637#endif
7638#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007640#endif
7641#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007643#endif
7644#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007646#endif
7647#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#endif
7650#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007652#endif
7653#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007655#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007656#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007658#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007659#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007661#endif
7662#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007664#endif
7665#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007667#endif
7668#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007670#endif
7671#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#endif
7674#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007676#endif
7677#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007679#endif
7680#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007682#endif
7683#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007685#endif
7686#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007688#endif
7689#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007691#endif
7692#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007694#endif
7695#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007696 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007697#endif
7698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007699 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007700#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007702#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007704#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#endif
7707#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007708 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007709#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007710 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007713#endif
7714#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007716#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007718#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007719 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007720#endif
7721
Christian Heimesfaf2f632008-01-06 16:59:19 +00007722#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007724 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7725#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007726 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007727#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007728 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007729 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7730#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007731 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007732#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007733 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007734 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007735 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007736 PyObject *tmp;
7737 tmp = PyLong_FromUnsignedLong(codes[i]);
7738 if (tmp == NULL)
7739 return NULL;
7740 PyModule_AddObject(m, names[i], tmp);
7741 }
7742 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007743 PyModule_AddIntMacro(m, RCVALL_OFF);
7744 PyModule_AddIntMacro(m, RCVALL_ON);
7745 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007746#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007748#endif
7749#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007751#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007752#endif /* _MSTCPIP_ */
7753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007754 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007755#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007756 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007758 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007759}