blob: 2c2f98d4ac34b555a1ea59fad1d81dc9680002e0 [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(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000171# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700175# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000177# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
178# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
180# undef HAVE_GETHOSTBYNAME_R
181# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#endif
183
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200184#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000186#endif
187
Ned Deilye1d4e582016-02-23 22:05:29 +1100188/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000189#ifdef HAVE_SYS_PARAM_H
190#include <sys/param.h>
191#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100193 (this includes the getaddrinfo emulation) protect access with a lock.
194
195 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
196 a mix of code including an unsafe implementation from an old BSD's
197 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
198 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100199 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100200
Ned Deilye1d4e582016-02-23 22:05:29 +1100201 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
202 http://www.openbsd.org/plus54.html
203
204 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
205
206http://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 +1100207 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200208#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100209 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000210 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
212 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100213 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000214#define USE_GETADDRINFO_LOCK
215#endif
216
217#ifdef USE_GETADDRINFO_LOCK
218#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
219#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
220#else
221#define ACQUIRE_GETADDRINFO_LOCK
222#define RELEASE_GETADDRINFO_LOCK
223#endif
224
225#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000227#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include <types.h>
231# include <io.h>
232# include <sys/ioctl.h>
233# include <utils.h>
234# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#endif
236
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100237#ifdef __APPLE__
238# include <sys/ioctl.h>
239#endif
240
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243/* make sure that the reentrant (gethostbyaddr_r etc)
244 functions are declared correctly if compiling with
245 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000249#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000252#undef _XOPEN_SOURCE
253#include <sys/socket.h>
254#include <sys/types.h>
255#include <netinet/in.h>
256#ifdef _SS_ALIGNSIZE
257#define HAVE_GETADDRINFO 1
258#define HAVE_GETNAMEINFO 1
259#endif
260
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000261#define HAVE_INET_PTON
262#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000263#endif
264
Benjamin Peterson06930632017-09-04 16:36:05 -0700265/* Solaris fails to define this variable at all. */
266#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000267#define INET_ADDRSTRLEN 16
268#endif
269
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700275#ifdef HAVE_SYS_SOCKET_H
276#include <sys/socket.h>
277#endif
278
279#ifdef HAVE_NET_IF_H
280#include <net/if.h>
281#endif
282
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000283/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000285#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286
287/* Addressing includes */
288
Guido van Rossum6f489d91996-06-28 20:15:15 +0000289#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Non-MS WINDOWS includes */
292# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000293# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000294
Guido van Rossum9376b741999-09-15 22:01:40 +0000295/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000297
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000300#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000303# ifdef HAVE_FCNTL_H
304# include <fcntl.h>
305# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Steve Dower65e4cb12014-11-22 12:54:57 -0800307#if defined(_MSC_VER) && _MSC_VER >= 1800
308/* Provides the IsWindows7SP1OrGreater() function */
309#include <VersionHelpers.h>
310#endif
311
Jeremy Hylton22308652001-02-02 03:23:09 +0000312#endif
313
Skip Montanaro7befb992004-02-10 16:50:21 +0000314#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000315
Neal Norwitz39d22e52002-11-02 19:55:21 +0000316#ifndef O_NONBLOCK
317# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000318#endif
319
Trent Micka708d6e2004-09-07 17:48:26 +0000320/* include Python's addrinfo.h unless it causes trouble */
321#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
322 /* Do not include addinfo.h on some newer IRIX versions.
323 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
324 * for example, but not by 6.5.10.
325 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000326#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000327 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
328 * EAI_* constants are defined in (the already included) ws2tcpip.h.
329 */
330#else
331# include "addrinfo.h"
332#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000333
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#ifdef __APPLE__
335/* On OS X, getaddrinfo returns no error indication of lookup
336 failure, so we must use the emulation instead of the libinfo
337 implementation. Unfortunately, performing an autoconf test
338 for this bug would require DNS access for the machine performing
339 the configuration, which is not acceptable. Therefore, we
340 determine the bug just by checking for __APPLE__. If this bug
341 gets ever fixed, perhaps checking for sys/version.h would be
342 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000343#ifndef HAVE_GETNAMEINFO
344/* This bug seems to be fixed in Jaguar. Ths easiest way I could
345 Find to check for Jaguar is that it has getnameinfo(), which
346 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000349
350#ifdef HAVE_INET_ATON
351#define USE_INET_ATON_WEAKLINK
352#endif
353
Jack Jansen84262fb2002-07-02 14:40:42 +0000354#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000356/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358/* avoid clashes with the C library definition of the symbol. */
359#define getaddrinfo fake_getaddrinfo
360#define gai_strerror fake_gai_strerror
361#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000362#include "getaddrinfo.c"
363#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000364#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000365#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000366#include "getnameinfo.c"
367#endif
368
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000369#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000370#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000371#endif
372
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000373#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000374#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000375#define EAFNOSUPPORT WSAEAFNOSUPPORT
376#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000377#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000378
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#ifndef SOCKETCLOSE
380#define SOCKETCLOSE close
381#endif
382
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000383#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define USE_BLUETOOTH 1
385#if defined(__FreeBSD__)
386#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
387#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000389#define SOL_HCI SOL_HCI_RAW
390#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define sockaddr_l2 sockaddr_l2cap
392#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000393#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000397#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000398#define sockaddr_l2 sockaddr_bt
399#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000400#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000401#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000402#define SOL_HCI BTPROTO_HCI
403#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000404#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
405#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
410#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000411#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
413#endif
414#endif
415
Charles-François Natali8b759652011-12-23 16:44:51 +0100416/* Convert "sock_addr_t *" to "struct sockaddr *". */
417#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418
Martin v. Löwise9416172003-05-03 10:12:45 +0000419/*
420 * Constants for getnameinfo()
421 */
422#if !defined(NI_MAXHOST)
423#define NI_MAXHOST 1025
424#endif
425#if !defined(NI_MAXSERV)
426#define NI_MAXSERV 32
427#endif
428
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000429#ifndef INVALID_SOCKET /* MS defines this */
430#define INVALID_SOCKET (-1)
431#endif
432
Charles-François Natali0cc86852013-09-13 19:53:08 +0200433#ifndef INADDR_NONE
434#define INADDR_NONE (-1)
435#endif
436
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000437/* XXX There's a problem here: *static* functions are not supposed to have
438 a Py prefix (or use CapitalizedWords). Later... */
439
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440/* Global variable holding the exception type for errors detected
441 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442static PyObject *socket_herror;
443static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000444static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445
Tim Peters643a7fc2002-02-17 04:13:21 +0000446/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000447 The sock_type variable contains pointers to various functions,
448 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000449 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000450static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000451
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452#if defined(HAVE_POLL_H)
453#include <poll.h>
454#elif defined(HAVE_SYS_POLL_H)
455#include <sys/poll.h>
456#endif
457
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000458/* Largest value to try to store in a socklen_t (used when handling
459 ancillary data). POSIX requires socklen_t to hold at least
460 (2**31)-1 and recommends against storing larger values, but
461 socklen_t was originally int in the BSD interface, so to be on the
462 safe side we use the smaller of (2**31)-1 and INT_MAX. */
463#if INT_MAX > 0x7fffffff
464#define SOCKLEN_T_LIMIT 0x7fffffff
465#else
466#define SOCKLEN_T_LIMIT INT_MAX
467#endif
468
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200469#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470/* Instead of select(), we'll use poll() since poll() works on any fd. */
471#define IS_SELECTABLE(s) 1
472/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000473#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200474/* If there's no timeout left, we don't have to call select, so it's a safe,
475 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100476#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000477#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000478
479static PyObject*
480select_error(void)
481{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200482 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000484}
485
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000486#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000487#ifndef WSAEAGAIN
488#define WSAEAGAIN WSAEWOULDBLOCK
489#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000490#define CHECK_ERRNO(expected) \
491 (WSAGetLastError() == WSA ## expected)
492#else
493#define CHECK_ERRNO(expected) \
494 (errno == expected)
495#endif
496
Victor Stinnerdaf45552013-08-28 00:53:59 +0200497#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200498# define GET_SOCK_ERROR WSAGetLastError()
499# define SET_SOCK_ERROR(err) WSASetLastError(err)
500# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
501# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300502# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200503#else
504# define GET_SOCK_ERROR errno
505# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
506# define SOCK_TIMEOUT_ERR EWOULDBLOCK
507# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300508# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200509#endif
510
511
512#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200513/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
514static int support_wsa_no_inherit = -1;
515#endif
516
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517/* Convenience function to raise an error according to errno
518 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519
Guido van Rossum73624e91994-10-10 17:59:00 +0000520static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000521set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000523#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 int err_no = WSAGetLastError();
525 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
526 recognizes the error codes used by both GetLastError() and
527 WSAGetLastError */
528 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200529 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000530#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000531
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200532 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533}
534
Guido van Rossum30a685f1991-06-27 15:51:29 +0000535
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540
541#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (v != NULL) {
547 PyErr_SetObject(socket_herror, v);
548 Py_DECREF(v);
549 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552}
553
554
555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559
Martin v. Löwis272cb402002-03-01 08:31:07 +0000560#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 /* EAI_SYSTEM is not available on Windows XP. */
562 if (error == EAI_SYSTEM)
563 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000564#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000566#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 if (v != NULL) {
572 PyErr_SetObject(socket_gaierror, v);
573 Py_DECREF(v);
574 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577}
578
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000579/* Function to perform the setting of socket blocking mode
580 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581static int
582internal_setblocking(PySocketSockObject *s, int block)
583{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400584 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585#ifdef MS_WINDOWS
586 u_long arg;
587#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100588#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100589 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100590 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000592#ifdef SOCK_NONBLOCK
593 if (block)
594 s->sock_type &= (~SOCK_NONBLOCK);
595 else
596 s->sock_type |= SOCK_NONBLOCK;
597#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100601#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200603 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400604 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100605#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200607 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400608 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100610 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 else
Victor Stinner9a954832013-12-04 00:41:24 +0100612 new_delay_flag = delay_flag | O_NONBLOCK;
613 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200614 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400615 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100616#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200618 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200619 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400620 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400622
623 result = 0;
624
625 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000626 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628
Yury Selivanovfa22b292016-10-18 16:03:52 -0400629 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200630#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400631 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200632#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400633 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200634#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400635 }
636
637 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638}
639
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000640static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200641internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
642 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100645#ifdef HAVE_POLL
646 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200647 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100648#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200649 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200650 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100651#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000652
Victor Stinnerb7df3142015-03-27 22:59:32 +0100653 /* must be called with the GIL held */
654 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100655
Victor Stinner416f2e62015-03-31 13:56:29 +0200656 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200657 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200660 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 /* Prefer poll, if available, since you can poll() any fd
664 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100666 pollfd.fd = s->sock_fd;
667 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200668 if (connect) {
669 /* On Windows, the socket becomes writable on connection success,
670 but a connection failure is notified as an error. On POSIX, the
671 socket becomes writable on connection success or on connection
672 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200673 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200674 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675
Victor Stinner71694d52015-03-28 01:18:54 +0100676 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200677 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200678 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679
Victor Stinner71694d52015-03-28 01:18:54 +0100680 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200681 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100682 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683#else
Victor Stinnerced11742015-04-09 10:27:25 +0200684 if (interval >= 0) {
685 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
686 tvp = &tv;
687 }
688 else
689 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690
Victor Stinner71694d52015-03-28 01:18:54 +0100691 FD_ZERO(&fds);
692 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200693 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200694 if (connect) {
695 /* On Windows, the socket becomes writable on connection success,
696 but a connection failure is notified as an error. On POSIX, the
697 socket becomes writable on connection success or on connection
698 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200699 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200700 }
Victor Stinner71694d52015-03-28 01:18:54 +0100701
702 /* See if the socket is ready */
703 Py_BEGIN_ALLOW_THREADS;
704 if (writing)
705 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200706 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100707 else
708 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200709 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100710 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000711#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (n < 0)
714 return -1;
715 if (n == 0)
716 return 1;
717 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000718}
719
Victor Stinner31bf2d52015-04-01 21:57:09 +0200720/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000721
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 On error, raise an exception and return -1 if err is set, or fill err and
723 return -1 otherwise. If a signal was received and the signal handler raised
724 an exception, return -1, and set err to -1 if err is set.
725
726 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100727
Victor Stinner31bf2d52015-04-01 21:57:09 +0200728 If the socket has a timeout, wait until the socket is ready before calling
729 the function: wait until the socket is writable if writing is nonzero, wait
730 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100731
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200733 the function, except if the signal handler raised an exception (PEP 475).
734
735 When the function is retried, recompute the timeout using a monotonic clock.
736
Victor Stinner81c41db2015-04-02 11:50:57 +0200737 sock_call_ex() must be called with the GIL held. The socket function is
738 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200739static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200740sock_call_ex(PySocketSockObject *s,
741 int writing,
742 int (*sock_func) (PySocketSockObject *s, void *data),
743 void *data,
744 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200745 int *err,
746 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747{
Victor Stinner8912d142015-04-06 23:16:34 +0200748 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200749 _PyTime_t deadline = 0;
750 int deadline_initialized = 0;
751 int res;
752
753 /* sock_call() must be called with the GIL held. */
754 assert(PyGILState_Check());
755
756 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200758 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200759 /* For connect(), poll even for blocking socket. The connection
760 runs asynchronously. */
761 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200763 _PyTime_t interval;
764
Victor Stinner81c41db2015-04-02 11:50:57 +0200765 if (deadline_initialized) {
766 /* recompute the timeout */
767 interval = deadline - _PyTime_GetMonotonicClock();
768 }
769 else {
770 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200771 deadline = _PyTime_GetMonotonicClock() + timeout;
772 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200773 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200774
Victor Stinner10550cd2015-04-03 13:22:27 +0200775 if (interval >= 0)
776 res = internal_select(s, writing, interval, connect);
777 else
778 res = 1;
779 }
780 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200781 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200782 }
783
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 if (err)
786 *err = GET_SOCK_ERROR;
787
Victor Stinner31bf2d52015-04-01 21:57:09 +0200788 if (CHECK_ERRNO(EINTR)) {
789 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 if (PyErr_CheckSignals()) {
791 if (err)
792 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200793 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200794 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795
796 /* retry select() */
797 continue;
798 }
799
800 /* select() failed */
801 s->errorhandler();
802 return -1;
803 }
804
805 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 if (err)
807 *err = SOCK_TIMEOUT_ERR;
808 else
809 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 return -1;
811 }
812
813 /* the socket is ready */
814 }
815
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 /* inner loop to retry sock_func() when sock_func() is interrupted
817 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818 while (1) {
819 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200821 Py_END_ALLOW_THREADS
822
823 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200824 /* sock_func() succeeded */
825 if (err)
826 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827 return 0;
828 }
829
Victor Stinner81c41db2015-04-02 11:50:57 +0200830 if (err)
831 *err = GET_SOCK_ERROR;
832
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 if (!CHECK_ERRNO(EINTR))
834 break;
835
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 /* sock_func() was interrupted by a signal */
837 if (PyErr_CheckSignals()) {
838 if (err)
839 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 }
845
846 if (s->sock_timeout > 0
847 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200848 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200849
850 For example, select() could indicate a socket is ready for
851 reading, but the data then discarded by the OS because of a
852 wrong checksum.
853
854 Loop on select() to recheck for socket readyness. */
855 continue;
856 }
857
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 /* sock_func() failed */
859 if (!err)
860 s->errorhandler();
861 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000862 return -1;
863 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200864}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000865
Victor Stinner81c41db2015-04-02 11:50:57 +0200866static int
867sock_call(PySocketSockObject *s,
868 int writing,
869 int (*func) (PySocketSockObject *s, void *data),
870 void *data)
871{
Victor Stinner8912d142015-04-06 23:16:34 +0200872 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200873}
874
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000875
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000876/* Initialize a new socket object. */
877
Victor Stinner88ed6402015-04-09 10:23:12 +0200878/* Default timeout for new sockets */
879static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000880
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200881static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000882init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 s->sock_fd = fd;
886 s->sock_family = family;
887 s->sock_type = type;
888 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000891#ifdef SOCK_NONBLOCK
892 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100893 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000894 else
895#endif
896 {
897 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200898 if (defaulttimeout >= 0) {
899 if (internal_setblocking(s, 0) == -1) {
900 return -1;
901 }
902 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000903 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200904 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000905}
906
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908/* Create a new socket object.
909 This just creates the object and initializes it.
910 If the creation fails, return NULL and set an exception (implicit
911 in NEWOBJ()). */
912
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000914new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 PySocketSockObject *s;
917 s = (PySocketSockObject *)
918 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200919 if (s == NULL)
920 return NULL;
921 if (init_sockobject(s, fd, family, type, proto) == -1) {
922 Py_DECREF(s);
923 return NULL;
924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926}
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
Guido van Rossum48a680c2001-03-02 06:34:14 +0000929/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000930 thread to be in gethostbyname or getaddrinfo */
931#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200932static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000933#endif
934
935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936/* Convert a string specifying a host name or one of a few symbolic
937 names to a numeric IP address. This usually calls gethostbyname()
938 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000939 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940 an error occurred; then an exception is raised. */
941
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200943setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 struct addrinfo hints, *res;
946 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
949 if (name[0] == '\0') {
950 int siz;
951 memset(&hints, 0, sizeof(hints));
952 hints.ai_family = af;
953 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
954 hints.ai_flags = AI_PASSIVE;
955 Py_BEGIN_ALLOW_THREADS
956 ACQUIRE_GETADDRINFO_LOCK
957 error = getaddrinfo(NULL, "0", &hints, &res);
958 Py_END_ALLOW_THREADS
959 /* We assume that those thread-unsafe getaddrinfo() versions
960 *are* safe regarding their return value, ie. that a
961 subsequent call to getaddrinfo() does not destroy the
962 outcome of the first call. */
963 RELEASE_GETADDRINFO_LOCK
964 if (error) {
965 set_gaierror(error);
966 return -1;
967 }
968 switch (res->ai_family) {
969 case AF_INET:
970 siz = 4;
971 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000972#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 case AF_INET6:
974 siz = 16;
975 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 default:
978 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200979 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 "unsupported address family");
981 return -1;
982 }
983 if (res->ai_next) {
984 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200985 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 "wildcard resolved to multiple address");
987 return -1;
988 }
989 if (res->ai_addrlen < addr_ret_size)
990 addr_ret_size = res->ai_addrlen;
991 memcpy(addr_ret, res->ai_addr, addr_ret_size);
992 freeaddrinfo(res);
993 return siz;
994 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200995 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100996 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200997 if (strcmp(name, "255.255.255.255") == 0 ||
998 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 struct sockaddr_in *sin;
1000 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 "address family mismatched");
1003 return -1;
1004 }
1005 sin = (struct sockaddr_in *)addr_ret;
1006 memset((void *) sin, '\0', sizeof(*sin));
1007 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001008#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 sin->sin_addr.s_addr = INADDR_BROADCAST;
1012 return sizeof(sin->sin_addr);
1013 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014
1015 /* avoid a name resolution in case of numeric address */
1016#ifdef HAVE_INET_PTON
1017 /* check for an IPv4 address */
1018 if (af == AF_UNSPEC || af == AF_INET) {
1019 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1020 memset(sin, 0, sizeof(*sin));
1021 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1022 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001023#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001024 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001025#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001026 return 4;
1027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001029#ifdef ENABLE_IPV6
1030 /* check for an IPv6 address - if the address contains a scope ID, we
1031 * fallback to getaddrinfo(), which can handle translation from interface
1032 * name to interface index */
1033 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1034 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1035 memset(sin, 0, sizeof(*sin));
1036 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1037 sin->sin6_family = AF_INET6;
1038#ifdef HAVE_SOCKADDR_SA_LEN
1039 sin->sin6_len = sizeof(*sin);
1040#endif
1041 return 16;
1042 }
1043 }
1044#endif /* ENABLE_IPV6 */
1045#else /* HAVE_INET_PTON */
1046 /* check for an IPv4 address */
1047 if (af == AF_INET || af == AF_UNSPEC) {
1048 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1049 memset(sin, 0, sizeof(*sin));
1050 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1051 sin->sin_family = AF_INET;
1052#ifdef HAVE_SOCKADDR_SA_LEN
1053 sin->sin_len = sizeof(*sin);
1054#endif
1055 return 4;
1056 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001057 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001058#endif /* HAVE_INET_PTON */
1059
1060 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 memset(&hints, 0, sizeof(hints));
1062 hints.ai_family = af;
1063 Py_BEGIN_ALLOW_THREADS
1064 ACQUIRE_GETADDRINFO_LOCK
1065 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001066#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 if (error == EAI_NONAME && af == AF_UNSPEC) {
1068 /* On Tru64 V5.1, numeric-to-addr conversion fails
1069 if no address family is given. Assume IPv4 for now.*/
1070 hints.ai_family = AF_INET;
1071 error = getaddrinfo(name, NULL, &hints, &res);
1072 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 Py_END_ALLOW_THREADS
1075 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1076 if (error) {
1077 set_gaierror(error);
1078 return -1;
1079 }
1080 if (res->ai_addrlen < addr_ret_size)
1081 addr_ret_size = res->ai_addrlen;
1082 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1083 freeaddrinfo(res);
1084 switch (addr_ret->sa_family) {
1085 case AF_INET:
1086 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001087#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case AF_INET6:
1089 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001092 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 return -1;
1094 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095}
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098/* Create a string object representing an IP address.
1099 This is always a string of the form 'dd.dd.dd.dd' (with variable
1100 size numbers). */
1101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001103makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 char buf[NI_MAXHOST];
1106 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1109 NI_NUMERICHOST);
1110 if (error) {
1111 set_gaierror(error);
1112 return NULL;
1113 }
1114 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115}
1116
1117
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118#ifdef USE_BLUETOOTH
1119/* Convert a string representation of a Bluetooth address into a numeric
1120 address. Returns the length (6), or raises an exception and returns -1 if
1121 an error occurred. */
1122
1123static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001124setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 unsigned int b0, b1, b2, b3, b4, b5;
1127 char ch;
1128 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1131 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1132 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1133 bdaddr->b[0] = b0;
1134 bdaddr->b[1] = b1;
1135 bdaddr->b[2] = b2;
1136 bdaddr->b[3] = b3;
1137 bdaddr->b[4] = b4;
1138 bdaddr->b[5] = b5;
1139 return 6;
1140 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001141 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 return -1;
1143 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144}
1145
1146/* Create a string representation of the Bluetooth address. This is always a
1147 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1148 value (zero padded if necessary). */
1149
1150static PyObject *
1151makebdaddr(bdaddr_t *bdaddr)
1152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1156 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1157 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1158 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159}
1160#endif
1161
1162
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163/* Create an object representing the given socket address,
1164 suitable for passing it back to bind(), connect() etc.
1165 The family field of the sockaddr structure is inspected
1166 to determine what kind of address it really is. */
1167
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001169static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001170makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (addrlen == 0) {
1173 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001174 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case AF_INET:
1180 {
1181 struct sockaddr_in *a;
1182 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1183 PyObject *ret = NULL;
1184 if (addrobj) {
1185 a = (struct sockaddr_in *)addr;
1186 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1187 Py_DECREF(addrobj);
1188 }
1189 return ret;
1190 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001192#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 case AF_UNIX:
1194 {
1195 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001196#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001197 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1198 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1199 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 }
1201 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001202#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 {
1204 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001205 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 }
1207 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001208#endif /* AF_UNIX */
1209
Martin v. Löwis11017b12006-01-14 18:12:57 +00001210#if defined(AF_NETLINK)
1211 case AF_NETLINK:
1212 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1214 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001215 }
1216#endif /* AF_NETLINK */
1217
caaveryeffc12f2017-09-06 18:18:10 -04001218#if defined(AF_VSOCK)
1219 case AF_VSOCK:
1220 {
1221 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1222 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1223 }
1224#endif /* AF_VSOCK */
1225
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001226#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AF_INET6:
1228 {
1229 struct sockaddr_in6 *a;
1230 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1231 PyObject *ret = NULL;
1232 if (addrobj) {
1233 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001234 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 addrobj,
1236 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001237 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 a->sin6_scope_id);
1239 Py_DECREF(addrobj);
1240 }
1241 return ret;
1242 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001243#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001245#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 case AF_BLUETOOTH:
1247 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 case BTPROTO_L2CAP:
1250 {
1251 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1252 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1253 PyObject *ret = NULL;
1254 if (addrobj) {
1255 ret = Py_BuildValue("Oi",
1256 addrobj,
1257 _BT_L2_MEMB(a, psm));
1258 Py_DECREF(addrobj);
1259 }
1260 return ret;
1261 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 case BTPROTO_RFCOMM:
1264 {
1265 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1266 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1267 PyObject *ret = NULL;
1268 if (addrobj) {
1269 ret = Py_BuildValue("Oi",
1270 addrobj,
1271 _BT_RC_MEMB(a, channel));
1272 Py_DECREF(addrobj);
1273 }
1274 return ret;
1275 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 case BTPROTO_HCI:
1278 {
1279 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001280#if defined(__NetBSD__) || defined(__DragonFly__)
1281 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 PyObject *ret = NULL;
1284 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1285 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001288
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001289#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case BTPROTO_SCO:
1291 {
1292 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1293 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1294 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295#endif
1296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 default:
1298 PyErr_SetString(PyExc_ValueError,
1299 "Unknown Bluetooth protocol");
1300 return NULL;
1301 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302#endif
1303
Antoine Pitroub156a462010-10-27 20:13:57 +00001304#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_PACKET:
1306 {
1307 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1308 char *ifname = "";
1309 struct ifreq ifr;
1310 /* need to look up interface name give index */
1311 if (a->sll_ifindex) {
1312 ifr.ifr_ifindex = a->sll_ifindex;
1313 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1314 ifname = ifr.ifr_name;
1315 }
1316 return Py_BuildValue("shbhy#",
1317 ifname,
1318 ntohs(a->sll_protocol),
1319 a->sll_pkttype,
1320 a->sll_hatype,
1321 a->sll_addr,
1322 a->sll_halen);
1323 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001324#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001325
Christian Heimes043d6f62008-01-07 17:19:16 +00001326#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 case AF_TIPC:
1328 {
1329 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1330 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1331 return Py_BuildValue("IIIII",
1332 a->addrtype,
1333 a->addr.nameseq.type,
1334 a->addr.nameseq.lower,
1335 a->addr.nameseq.upper,
1336 a->scope);
1337 } else if (a->addrtype == TIPC_ADDR_NAME) {
1338 return Py_BuildValue("IIIII",
1339 a->addrtype,
1340 a->addr.name.name.type,
1341 a->addr.name.name.instance,
1342 a->addr.name.name.instance,
1343 a->scope);
1344 } else if (a->addrtype == TIPC_ADDR_ID) {
1345 return Py_BuildValue("IIIII",
1346 a->addrtype,
1347 a->addr.id.node,
1348 a->addr.id.ref,
1349 0,
1350 a->scope);
1351 } else {
1352 PyErr_SetString(PyExc_ValueError,
1353 "Invalid address type");
1354 return NULL;
1355 }
1356 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001357#endif
1358
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001359#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001360 case AF_CAN:
1361 {
1362 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1363 char *ifname = "";
1364 struct ifreq ifr;
1365 /* need to look up interface name given index */
1366 if (a->can_ifindex) {
1367 ifr.ifr_ifindex = a->can_ifindex;
1368 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1369 ifname = ifr.ifr_name;
1370 }
1371
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001372 switch (proto) {
1373#ifdef CAN_ISOTP
1374 case CAN_ISOTP:
1375 {
1376 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1377 ifname,
1378 a->can_addr.tp.rx_id,
1379 a->can_addr.tp.tx_id);
1380 }
1381#endif
1382 default:
1383 {
1384 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1385 ifname);
1386 }
1387 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001388 }
1389#endif
1390
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001391#ifdef PF_SYSTEM
1392 case PF_SYSTEM:
1393 switch(proto) {
1394#ifdef SYSPROTO_CONTROL
1395 case SYSPROTO_CONTROL:
1396 {
1397 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1398 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1399 }
1400#endif
1401 default:
1402 PyErr_SetString(PyExc_ValueError,
1403 "Invalid address type");
1404 return 0;
1405 }
1406#endif
1407
Christian Heimesdffa3942016-09-05 23:54:41 +02001408#ifdef HAVE_SOCKADDR_ALG
1409 case AF_ALG:
1410 {
1411 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1412 return Py_BuildValue("s#s#HH",
1413 a->salg_type,
1414 strnlen((const char*)a->salg_type,
1415 sizeof(a->salg_type)),
1416 a->salg_name,
1417 strnlen((const char*)a->salg_name,
1418 sizeof(a->salg_name)),
1419 a->salg_feat,
1420 a->salg_mask);
1421 }
1422#endif
1423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 default:
1427 /* If we don't know the address family, don't raise an
1428 exception -- return it as an (int, bytes) tuple. */
1429 return Py_BuildValue("iy#",
1430 addr->sa_family,
1431 addr->sa_data,
1432 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435}
1436
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001437/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1438 (in particular, numeric IP addresses). */
1439struct maybe_idna {
1440 PyObject *obj;
1441 char *buf;
1442};
1443
1444static void
1445idna_cleanup(struct maybe_idna *data)
1446{
1447 Py_CLEAR(data->obj);
1448}
1449
1450static int
1451idna_converter(PyObject *obj, struct maybe_idna *data)
1452{
1453 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001454 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455 if (obj == NULL) {
1456 idna_cleanup(data);
1457 return 1;
1458 }
1459 data->obj = NULL;
1460 len = -1;
1461 if (PyBytes_Check(obj)) {
1462 data->buf = PyBytes_AsString(obj);
1463 len = PyBytes_Size(obj);
1464 }
1465 else if (PyByteArray_Check(obj)) {
1466 data->buf = PyByteArray_AsString(obj);
1467 len = PyByteArray_Size(obj);
1468 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001469 else if (PyUnicode_Check(obj)) {
1470 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1471 data->buf = PyUnicode_DATA(obj);
1472 len = PyUnicode_GET_LENGTH(obj);
1473 }
1474 else {
1475 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1476 if (!obj2) {
1477 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1478 return 0;
1479 }
1480 assert(PyBytes_Check(obj2));
1481 data->obj = obj2;
1482 data->buf = PyBytes_AS_STRING(obj2);
1483 len = PyBytes_GET_SIZE(obj2);
1484 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001485 }
1486 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001487 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1488 obj->ob_type->tp_name);
1489 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001490 }
1491 if (strlen(data->buf) != len) {
1492 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001493 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001494 return 0;
1495 }
1496 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001497}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001498
1499/* Parse a socket address argument according to the socket object's
1500 address family. Return 1 if the address was in the proper format,
1501 0 of not. The address is returned through addr_ret, its length
1502 through len_ret. */
1503
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001504static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001505getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001509
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001510#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 case AF_UNIX:
1512 {
1513 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001514 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001515 int retval = 0;
1516
1517 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1518 allow embedded nulls on Linux. */
1519 if (PyUnicode_Check(args)) {
1520 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1521 return 0;
1522 }
1523 else
1524 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001525 if (!PyArg_Parse(args, "y*", &path)) {
1526 Py_DECREF(args);
1527 return retval;
1528 }
1529 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001532#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001533 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001536 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001538 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 }
1540 }
1541 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 {
1544 /* regular NULL-terminated string */
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 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001550 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
1552 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 memcpy(addr->sun_path, path.buf, path.len);
1554 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001555 retval = 1;
1556 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001557 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001558 Py_DECREF(args);
1559 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001561#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001562
Martin v. Löwis11017b12006-01-14 18:12:57 +00001563#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 case AF_NETLINK:
1565 {
1566 struct sockaddr_nl* addr;
1567 int pid, groups;
1568 addr = (struct sockaddr_nl *)addr_ret;
1569 if (!PyTuple_Check(args)) {
1570 PyErr_Format(
1571 PyExc_TypeError,
1572 "getsockaddrarg: "
1573 "AF_NETLINK address must be tuple, not %.500s",
1574 Py_TYPE(args)->tp_name);
1575 return 0;
1576 }
1577 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1578 return 0;
1579 addr->nl_family = AF_NETLINK;
1580 addr->nl_pid = pid;
1581 addr->nl_groups = groups;
1582 *len_ret = sizeof(*addr);
1583 return 1;
1584 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001585#endif
1586
caaveryeffc12f2017-09-06 18:18:10 -04001587#if defined(AF_VSOCK)
1588 case AF_VSOCK:
1589 {
1590 struct sockaddr_vm* addr;
1591 int port, cid;
1592 addr = (struct sockaddr_vm *)addr_ret;
1593 memset(addr, 0, sizeof(struct sockaddr_vm));
1594 if (!PyTuple_Check(args)) {
1595 PyErr_Format(
1596 PyExc_TypeError,
1597 "getsockaddrarg: "
1598 "AF_VSOCK address must be tuple, not %.500s",
1599 Py_TYPE(args)->tp_name);
1600 return 0;
1601 }
1602 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1603 return 0;
1604 addr->svm_family = s->sock_family;
1605 addr->svm_port = port;
1606 addr->svm_cid = cid;
1607 *len_ret = sizeof(*addr);
1608 return 1;
1609 }
1610#endif
1611
1612
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001613#ifdef AF_RDS
1614 case AF_RDS:
1615 /* RDS sockets use sockaddr_in: fall-through */
1616#endif
1617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 case AF_INET:
1619 {
1620 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001621 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 int port, result;
1623 if (!PyTuple_Check(args)) {
1624 PyErr_Format(
1625 PyExc_TypeError,
1626 "getsockaddrarg: "
1627 "AF_INET address must be tuple, not %.500s",
1628 Py_TYPE(args)->tp_name);
1629 return 0;
1630 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001631 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1632 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 return 0;
1634 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001635 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 if (result < 0)
1639 return 0;
1640 if (port < 0 || port > 0xffff) {
1641 PyErr_SetString(
1642 PyExc_OverflowError,
1643 "getsockaddrarg: port must be 0-65535.");
1644 return 0;
1645 }
1646 addr->sin_family = AF_INET;
1647 addr->sin_port = htons((short)port);
1648 *len_ret = sizeof *addr;
1649 return 1;
1650 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001652#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 case AF_INET6:
1654 {
1655 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001656 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001657 int port, result;
1658 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 flowinfo = scope_id = 0;
1660 if (!PyTuple_Check(args)) {
1661 PyErr_Format(
1662 PyExc_TypeError,
1663 "getsockaddrarg: "
1664 "AF_INET6 address must be tuple, not %.500s",
1665 Py_TYPE(args)->tp_name);
1666 return 0;
1667 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001668 if (!PyArg_ParseTuple(args, "O&i|II",
1669 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 &scope_id)) {
1671 return 0;
1672 }
1673 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001674 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001676 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 if (result < 0)
1678 return 0;
1679 if (port < 0 || port > 0xffff) {
1680 PyErr_SetString(
1681 PyExc_OverflowError,
1682 "getsockaddrarg: port must be 0-65535.");
1683 return 0;
1684 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001685 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001686 PyErr_SetString(
1687 PyExc_OverflowError,
1688 "getsockaddrarg: flowinfo must be 0-1048575.");
1689 return 0;
1690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 addr->sin6_family = s->sock_family;
1692 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001693 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 addr->sin6_scope_id = scope_id;
1695 *len_ret = sizeof *addr;
1696 return 1;
1697 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001698#endif
1699
Hye-Shik Chang81268602004-02-02 06:05:24 +00001700#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 case AF_BLUETOOTH:
1702 {
1703 switch (s->sock_proto) {
1704 case BTPROTO_L2CAP:
1705 {
1706 struct sockaddr_l2 *addr;
1707 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 addr = (struct sockaddr_l2 *)addr_ret;
1710 memset(addr, 0, sizeof(struct sockaddr_l2));
1711 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1712 if (!PyArg_ParseTuple(args, "si", &straddr,
1713 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001714 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 "wrong format");
1716 return 0;
1717 }
1718 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1719 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 *len_ret = sizeof *addr;
1722 return 1;
1723 }
1724 case BTPROTO_RFCOMM:
1725 {
1726 struct sockaddr_rc *addr;
1727 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 addr = (struct sockaddr_rc *)addr_ret;
1730 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1731 if (!PyArg_ParseTuple(args, "si", &straddr,
1732 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001733 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 "wrong format");
1735 return 0;
1736 }
1737 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1738 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 *len_ret = sizeof *addr;
1741 return 1;
1742 }
1743 case BTPROTO_HCI:
1744 {
1745 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001746#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001747 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001748
Alexander Belopolskye239d232010-12-08 23:31:48 +00001749 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001750 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001751 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001752 "wrong format");
1753 return 0;
1754 }
1755 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1756 return 0;
1757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1759 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001760 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 "wrong format");
1762 return 0;
1763 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 *len_ret = sizeof *addr;
1766 return 1;
1767 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001768#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 case BTPROTO_SCO:
1770 {
1771 struct sockaddr_sco *addr;
1772 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 addr = (struct sockaddr_sco *)addr_ret;
1775 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1776 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001777 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 "wrong format");
1779 return 0;
1780 }
1781 straddr = PyBytes_AS_STRING(args);
1782 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1783 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 *len_ret = sizeof *addr;
1786 return 1;
1787 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return 0;
1792 }
1793 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001794#endif
1795
Antoine Pitroub156a462010-10-27 20:13:57 +00001796#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 case AF_PACKET:
1798 {
1799 struct sockaddr_ll* addr;
1800 struct ifreq ifr;
1801 char *interfaceName;
1802 int protoNumber;
1803 int hatype = 0;
1804 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001805 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (!PyTuple_Check(args)) {
1808 PyErr_Format(
1809 PyExc_TypeError,
1810 "getsockaddrarg: "
1811 "AF_PACKET address must be tuple, not %.500s",
1812 Py_TYPE(args)->tp_name);
1813 return 0;
1814 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001817 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 return 0;
1819 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1820 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1821 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1822 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001823 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 return 0;
1825 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001826 if (haddr.buf && haddr.len > 8) {
1827 PyErr_SetString(PyExc_ValueError,
1828 "Hardware address must be 8 bytes or less");
1829 PyBuffer_Release(&haddr);
1830 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 }
1832 if (protoNumber < 0 || protoNumber > 0xffff) {
1833 PyErr_SetString(
1834 PyExc_OverflowError,
1835 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001836 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 return 0;
1838 }
1839 addr = (struct sockaddr_ll*)addr_ret;
1840 addr->sll_family = AF_PACKET;
1841 addr->sll_protocol = htons((short)protoNumber);
1842 addr->sll_ifindex = ifr.ifr_ifindex;
1843 addr->sll_pkttype = pkttype;
1844 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001845 if (haddr.buf) {
1846 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1847 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001849 else
1850 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001852 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 return 1;
1854 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855#endif
1856
Christian Heimes043d6f62008-01-07 17:19:16 +00001857#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 case AF_TIPC:
1859 {
1860 unsigned int atype, v1, v2, v3;
1861 unsigned int scope = TIPC_CLUSTER_SCOPE;
1862 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 if (!PyTuple_Check(args)) {
1865 PyErr_Format(
1866 PyExc_TypeError,
1867 "getsockaddrarg: "
1868 "AF_TIPC address must be tuple, not %.500s",
1869 Py_TYPE(args)->tp_name);
1870 return 0;
1871 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 if (!PyArg_ParseTuple(args,
1874 "IIII|I;Invalid TIPC address format",
1875 &atype, &v1, &v2, &v3, &scope))
1876 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 addr = (struct sockaddr_tipc *) addr_ret;
1879 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 addr->family = AF_TIPC;
1882 addr->scope = scope;
1883 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 if (atype == TIPC_ADDR_NAMESEQ) {
1886 addr->addr.nameseq.type = v1;
1887 addr->addr.nameseq.lower = v2;
1888 addr->addr.nameseq.upper = v3;
1889 } else if (atype == TIPC_ADDR_NAME) {
1890 addr->addr.name.name.type = v1;
1891 addr->addr.name.name.instance = v2;
1892 } else if (atype == TIPC_ADDR_ID) {
1893 addr->addr.id.node = v1;
1894 addr->addr.id.ref = v2;
1895 } else {
1896 /* Shouldn't happen */
1897 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1898 return 0;
1899 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return 1;
1904 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001905#endif
1906
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001907#ifdef AF_CAN
1908
1909#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001910 case AF_CAN:
1911 switch (s->sock_proto) {
1912 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001913 /* fall-through */
1914 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001915 {
1916 struct sockaddr_can *addr;
1917 PyObject *interfaceName;
1918 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001919 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001920 addr = (struct sockaddr_can *)addr_ret;
1921
Charles-François Natali47413c12011-10-06 19:47:44 +02001922 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1923 &interfaceName))
1924 return 0;
1925
1926 len = PyBytes_GET_SIZE(interfaceName);
1927
1928 if (len == 0) {
1929 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001930 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001931 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1932 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001933 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1934 s->errorhandler();
1935 Py_DECREF(interfaceName);
1936 return 0;
1937 }
1938 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001939 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001940 "AF_CAN interface name too long");
1941 Py_DECREF(interfaceName);
1942 return 0;
1943 }
1944
1945 addr->can_family = AF_CAN;
1946 addr->can_ifindex = ifr.ifr_ifindex;
1947
1948 *len_ret = sizeof(*addr);
1949 Py_DECREF(interfaceName);
1950 return 1;
1951 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001952#endif
1953
1954#ifdef CAN_ISOTP
1955 case CAN_ISOTP:
1956 {
1957 struct sockaddr_can *addr;
1958 PyObject *interfaceName;
1959 struct ifreq ifr;
1960 Py_ssize_t len;
1961 unsigned long int rx_id, tx_id;
1962
1963 addr = (struct sockaddr_can *)addr_ret;
1964
1965 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1966 &interfaceName,
1967 &rx_id,
1968 &tx_id))
1969 return 0;
1970
1971 len = PyBytes_GET_SIZE(interfaceName);
1972
1973 if (len == 0) {
1974 ifr.ifr_ifindex = 0;
1975 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1976 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1977 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1978 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1979 s->errorhandler();
1980 Py_DECREF(interfaceName);
1981 return 0;
1982 }
1983 } else {
1984 PyErr_SetString(PyExc_OSError,
1985 "AF_CAN interface name too long");
1986 Py_DECREF(interfaceName);
1987 return 0;
1988 }
1989
1990 addr->can_family = AF_CAN;
1991 addr->can_ifindex = ifr.ifr_ifindex;
1992 addr->can_addr.tp.rx_id = rx_id;
1993 addr->can_addr.tp.tx_id = tx_id;
1994
1995 *len_ret = sizeof(*addr);
1996 Py_DECREF(interfaceName);
1997 return 1;
1998 }
1999#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002000 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002001 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 "getsockaddrarg: unsupported CAN protocol");
2003 return 0;
2004 }
2005#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002006
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002007#ifdef PF_SYSTEM
2008 case PF_SYSTEM:
2009 switch (s->sock_proto) {
2010#ifdef SYSPROTO_CONTROL
2011 case SYSPROTO_CONTROL:
2012 {
2013 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002014
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002015 addr = (struct sockaddr_ctl *)addr_ret;
2016 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002017 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002018
2019 if (PyUnicode_Check(args)) {
2020 struct ctl_info info;
2021 PyObject *ctl_name;
2022
2023 if (!PyArg_Parse(args, "O&",
2024 PyUnicode_FSConverter, &ctl_name)) {
2025 return 0;
2026 }
2027
Victor Stinnerf50e1872015-03-20 11:32:24 +01002028 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002029 PyErr_SetString(PyExc_ValueError,
2030 "provided string is too long");
2031 Py_DECREF(ctl_name);
2032 return 0;
2033 }
2034 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2035 sizeof(info.ctl_name));
2036 Py_DECREF(ctl_name);
2037
2038 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2039 PyErr_SetString(PyExc_OSError,
2040 "cannot find kernel control with provided name");
2041 return 0;
2042 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002043
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002044 addr->sc_id = info.ctl_id;
2045 addr->sc_unit = 0;
2046 } else if (!PyArg_ParseTuple(args, "II",
2047 &(addr->sc_id), &(addr->sc_unit))) {
2048 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2049 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002050
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002051 return 0;
2052 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002053
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002054 *len_ret = sizeof(*addr);
2055 return 1;
2056 }
2057#endif
2058 default:
2059 PyErr_SetString(PyExc_OSError,
2060 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2061 return 0;
2062 }
2063#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002064#ifdef HAVE_SOCKADDR_ALG
2065 case AF_ALG:
2066 {
2067 struct sockaddr_alg *sa;
2068 char *type;
2069 char *name;
2070 sa = (struct sockaddr_alg *)addr_ret;
2071
2072 memset(sa, 0, sizeof(*sa));
2073 sa->salg_family = AF_ALG;
2074
2075 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2076 &type, &name, &sa->salg_feat, &sa->salg_mask))
2077 return 0;
2078 /* sockaddr_alg has fixed-sized char arrays for type and name */
2079 if (strlen(type) > sizeof(sa->salg_type)) {
2080 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2081 return 0;
2082 }
2083 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2084 if (strlen(name) > sizeof(sa->salg_name)) {
2085 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2086 return 0;
2087 }
2088 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2089
2090 *len_ret = sizeof(*sa);
2091 return 1;
2092 }
2093#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002098 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002102}
2103
Guido van Rossum30a685f1991-06-27 15:51:29 +00002104
Guido van Rossum48a680c2001-03-02 06:34:14 +00002105/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002106 Return 1 if the family is known, 0 otherwise. The length is returned
2107 through len_ret. */
2108
2109static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002110getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002113
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002114#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 case AF_UNIX:
2116 {
2117 *len_ret = sizeof (struct sockaddr_un);
2118 return 1;
2119 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002120#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002121
Martin v. Löwis11017b12006-01-14 18:12:57 +00002122#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002123 case AF_NETLINK:
2124 {
2125 *len_ret = sizeof (struct sockaddr_nl);
2126 return 1;
2127 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002128#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002129
caaveryeffc12f2017-09-06 18:18:10 -04002130#if defined(AF_VSOCK)
2131 case AF_VSOCK:
2132 {
2133 *len_ret = sizeof (struct sockaddr_vm);
2134 return 1;
2135 }
2136#endif
2137
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002138#ifdef AF_RDS
2139 case AF_RDS:
2140 /* RDS sockets use sockaddr_in: fall-through */
2141#endif
2142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 case AF_INET:
2144 {
2145 *len_ret = sizeof (struct sockaddr_in);
2146 return 1;
2147 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002148
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002149#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 case AF_INET6:
2151 {
2152 *len_ret = sizeof (struct sockaddr_in6);
2153 return 1;
2154 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002155#endif
2156
Hye-Shik Chang81268602004-02-02 06:05:24 +00002157#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 case AF_BLUETOOTH:
2159 {
2160 switch(s->sock_proto)
2161 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 case BTPROTO_L2CAP:
2164 *len_ret = sizeof (struct sockaddr_l2);
2165 return 1;
2166 case BTPROTO_RFCOMM:
2167 *len_ret = sizeof (struct sockaddr_rc);
2168 return 1;
2169 case BTPROTO_HCI:
2170 *len_ret = sizeof (struct sockaddr_hci);
2171 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002172#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 case BTPROTO_SCO:
2174 *len_ret = sizeof (struct sockaddr_sco);
2175 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002178 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 "unknown BT protocol");
2180 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 }
2183 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002184#endif
2185
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002186#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 case AF_PACKET:
2188 {
2189 *len_ret = sizeof (struct sockaddr_ll);
2190 return 1;
2191 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002192#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002193
Christian Heimes043d6f62008-01-07 17:19:16 +00002194#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 case AF_TIPC:
2196 {
2197 *len_ret = sizeof (struct sockaddr_tipc);
2198 return 1;
2199 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002200#endif
2201
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002202#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002203 case AF_CAN:
2204 {
2205 *len_ret = sizeof (struct sockaddr_can);
2206 return 1;
2207 }
2208#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002209
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002210#ifdef PF_SYSTEM
2211 case PF_SYSTEM:
2212 switch(s->sock_proto) {
2213#ifdef SYSPROTO_CONTROL
2214 case SYSPROTO_CONTROL:
2215 *len_ret = sizeof (struct sockaddr_ctl);
2216 return 1;
2217#endif
2218 default:
2219 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2220 "unknown PF_SYSTEM protocol");
2221 return 0;
2222 }
2223#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002224#ifdef HAVE_SOCKADDR_ALG
2225 case AF_ALG:
2226 {
2227 *len_ret = sizeof (struct sockaddr_alg);
2228 return 1;
2229 }
2230#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002235 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002239}
2240
2241
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002242/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2243 Currently, these methods are only compiled if the RFC 2292/3542
2244 CMSG_LEN() macro is available. Older systems seem to have used
2245 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2246 it may be possible to define CMSG_LEN() that way if it's not
2247 provided. Some architectures might need extra padding after the
2248 cmsghdr, however, and CMSG_LEN() would have to take account of
2249 this. */
2250#ifdef CMSG_LEN
2251/* If length is in range, set *result to CMSG_LEN(length) and return
2252 true; otherwise, return false. */
2253static int
2254get_CMSG_LEN(size_t length, size_t *result)
2255{
2256 size_t tmp;
2257
2258 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2259 return 0;
2260 tmp = CMSG_LEN(length);
2261 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2262 return 0;
2263 *result = tmp;
2264 return 1;
2265}
2266
2267#ifdef CMSG_SPACE
2268/* If length is in range, set *result to CMSG_SPACE(length) and return
2269 true; otherwise, return false. */
2270static int
2271get_CMSG_SPACE(size_t length, size_t *result)
2272{
2273 size_t tmp;
2274
2275 /* Use CMSG_SPACE(1) here in order to take account of the padding
2276 necessary before *and* after the data. */
2277 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2278 return 0;
2279 tmp = CMSG_SPACE(length);
2280 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2281 return 0;
2282 *result = tmp;
2283 return 1;
2284}
2285#endif
2286
2287/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2288 pointer in msg->msg_control with at least "space" bytes after it,
2289 and its cmsg_len member inside the buffer. */
2290static int
2291cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2292{
2293 size_t cmsg_offset;
2294 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2295 sizeof(cmsgh->cmsg_len));
2296
Charles-François Natali466517d2011-08-28 18:23:43 +02002297 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002298 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002299 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002300 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2301 annoying under OS X as it's unsigned there and so it triggers a
2302 tautological comparison warning under Clang when compared against 0.
2303 Since the check is valid on other platforms, silence the warning under
2304 Clang. */
2305 #ifdef __clang__
2306 #pragma clang diagnostic push
2307 #pragma clang diagnostic ignored "-Wtautological-compare"
2308 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002309 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002310 #pragma GCC diagnostic push
2311 #pragma GCC diagnostic ignored "-Wtype-limits"
2312 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002313 if (msg->msg_controllen < 0)
2314 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002315 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002316 #pragma GCC diagnostic pop
2317 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002318 #ifdef __clang__
2319 #pragma clang diagnostic pop
2320 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002321 if (space < cmsg_len_end)
2322 space = cmsg_len_end;
2323 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2324 return (cmsg_offset <= (size_t)-1 - space &&
2325 cmsg_offset + space <= msg->msg_controllen);
2326}
2327
2328/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2329 *space to number of bytes following it in the buffer and return
2330 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2331 msg->msg_controllen are valid. */
2332static int
2333get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2334{
2335 size_t data_offset;
2336 char *data_ptr;
2337
2338 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2339 return 0;
2340 data_offset = data_ptr - (char *)msg->msg_control;
2341 if (data_offset > msg->msg_controllen)
2342 return 0;
2343 *space = msg->msg_controllen - data_offset;
2344 return 1;
2345}
2346
2347/* If cmsgh is invalid or not contained in the buffer pointed to by
2348 msg->msg_control, return -1. If cmsgh is valid and its associated
2349 data is entirely contained in the buffer, set *data_len to the
2350 length of the associated data and return 0. If only part of the
2351 associated data is contained in the buffer but cmsgh is otherwise
2352 valid, set *data_len to the length contained in the buffer and
2353 return 1. */
2354static int
2355get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2356{
2357 size_t space, cmsg_data_len;
2358
2359 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2360 cmsgh->cmsg_len < CMSG_LEN(0))
2361 return -1;
2362 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2363 if (!get_cmsg_data_space(msg, cmsgh, &space))
2364 return -1;
2365 if (space >= cmsg_data_len) {
2366 *data_len = cmsg_data_len;
2367 return 0;
2368 }
2369 *data_len = space;
2370 return 1;
2371}
2372#endif /* CMSG_LEN */
2373
2374
Victor Stinner31bf2d52015-04-01 21:57:09 +02002375struct sock_accept {
2376 socklen_t *addrlen;
2377 sock_addr_t *addrbuf;
2378 SOCKET_T result;
2379};
2380
2381#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2382/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2383static int accept4_works = -1;
2384#endif
2385
2386static int
2387sock_accept_impl(PySocketSockObject *s, void *data)
2388{
2389 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002390 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2391 socklen_t *paddrlen = ctx->addrlen;
2392#ifdef HAVE_SOCKADDR_ALG
2393 /* AF_ALG does not support accept() with addr and raises
2394 * ECONNABORTED instead. */
2395 if (s->sock_family == AF_ALG) {
2396 addr = NULL;
2397 paddrlen = NULL;
2398 *ctx->addrlen = 0;
2399 }
2400#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002401
2402#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2403 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002404 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002405 SOCK_CLOEXEC);
2406 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2407 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2408 accept4_works = (errno != ENOSYS);
2409 }
2410 }
2411 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002412 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002413#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002414 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002415#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002416
2417#ifdef MS_WINDOWS
2418 return (ctx->result != INVALID_SOCKET);
2419#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002420 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002421#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002422}
2423
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002424/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002425
Guido van Rossum73624e91994-10-10 17:59:00 +00002426static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002427sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002430 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 socklen_t addrlen;
2432 PyObject *sock = NULL;
2433 PyObject *addr = NULL;
2434 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002435 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 if (!getsockaddrlen(s, &addrlen))
2438 return NULL;
2439 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 if (!IS_SELECTABLE(s))
2442 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002443
Victor Stinner31bf2d52015-04-01 21:57:09 +02002444 ctx.addrlen = &addrlen;
2445 ctx.addrbuf = &addrbuf;
2446 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002448 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002449
Victor Stinnerdaf45552013-08-28 00:53:59 +02002450#ifdef MS_WINDOWS
2451 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2452 PyErr_SetFromWindowsErr(0);
2453 SOCKETCLOSE(newfd);
2454 goto finally;
2455 }
2456#else
2457
2458#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2459 if (!accept4_works)
2460#endif
2461 {
2462 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2463 SOCKETCLOSE(newfd);
2464 goto finally;
2465 }
2466 }
2467#endif
2468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 sock = PyLong_FromSocket_t(newfd);
2470 if (sock == NULL) {
2471 SOCKETCLOSE(newfd);
2472 goto finally;
2473 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2476 addrlen, s->sock_proto);
2477 if (addr == NULL)
2478 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002481
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 Py_XDECREF(sock);
2484 Py_XDECREF(addr);
2485 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002486}
2487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002489"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002491Wait for an incoming connection. Return a new socket file descriptor\n\
2492representing the connection, and the address of the client.\n\
2493For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002494
Guido van Rossum11ba0942002-06-13 15:07:44 +00002495/* s.setblocking(flag) method. Argument:
2496 False -- non-blocking mode; same as settimeout(0)
2497 True -- blocking mode; same as settimeout(None)
2498*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002499
Guido van Rossum73624e91994-10-10 17:59:00 +00002500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002501sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002502{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002503 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 block = PyLong_AsLong(arg);
2506 if (block == -1 && PyErr_Occurred())
2507 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Victor Stinner9001d802015-04-06 23:06:01 +02002509 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002510 if (internal_setblocking(s, block) == -1) {
2511 return NULL;
2512 }
2513 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002514}
Guido van Rossume4485b01994-09-07 14:32:49 +00002515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517"setblocking(flag)\n\
2518\n\
2519Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002520setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522
Victor Stinner71694d52015-03-28 01:18:54 +01002523static int
2524socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2525{
2526#ifdef MS_WINDOWS
2527 struct timeval tv;
2528#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002529#ifndef HAVE_POLL
2530 _PyTime_t ms;
2531#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002532 int overflow = 0;
2533
2534 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002535 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002536 return 0;
2537 }
2538
Victor Stinner869e1772015-03-30 03:49:14 +02002539 if (_PyTime_FromSecondsObject(timeout,
2540 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002541 return -1;
2542
2543 if (*timeout < 0) {
2544 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2545 return -1;
2546 }
2547
2548#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002549 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002550#endif
2551#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002552 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2553 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002554#endif
2555 if (overflow) {
2556 PyErr_SetString(PyExc_OverflowError,
2557 "timeout doesn't fit into C timeval");
2558 return -1;
2559 }
2560
2561 return 0;
2562}
2563
Guido van Rossum11ba0942002-06-13 15:07:44 +00002564/* s.settimeout(timeout) method. Argument:
2565 None -- no timeout, blocking mode; same as setblocking(True)
2566 0.0 -- non-blocking mode; same as setblocking(False)
2567 > 0 -- timeout mode; operations time out after timeout seconds
2568 < 0 -- illegal; raises an exception
2569*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002571sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572{
Victor Stinner71694d52015-03-28 01:18:54 +01002573 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002574
Victor Stinner71694d52015-03-28 01:18:54 +01002575 if (socket_parse_timeout(&timeout, arg) < 0)
2576 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002579 if (internal_setblocking(s, timeout < 0) == -1) {
2580 return NULL;
2581 }
2582 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583}
2584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002585PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002586"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002588Set a timeout on socket operations. 'timeout' can be a float,\n\
2589giving in seconds, or None. Setting a timeout of None disables\n\
2590the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002591Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002592
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002593/* s.gettimeout() method.
2594 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002596sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597{
Victor Stinner71694d52015-03-28 01:18:54 +01002598 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002599 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 }
Victor Stinner71694d52015-03-28 01:18:54 +01002601 else {
2602 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2603 return PyFloat_FromDouble(seconds);
2604 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002605}
2606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002607PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002608"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002609\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002610Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002611operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002613
Guido van Rossumaee08791992-09-08 09:05:33 +00002614/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002615 With an integer third argument, sets an integer optval with optlen=4.
2616 With None as third argument and an integer fourth argument, set
2617 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002618 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002619 use optional built-in module 'struct' to encode the string.
2620*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002621
Guido van Rossum73624e91994-10-10 17:59:00 +00002622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002623sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 int level;
2626 int optname;
2627 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002628 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002630 unsigned int optlen;
2631 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002632
caaveryeffc12f2017-09-06 18:18:10 -04002633#ifdef AF_VSOCK
2634 if (s->sock_family == AF_VSOCK) {
2635 uint64_t vflag; // Must be set width of 64 bits
2636 /* setsockopt(level, opt, flag) */
2637 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2638 &level, &optname, &vflag)) {
2639 // level should always be set to AF_VSOCK
2640 res = setsockopt(s->sock_fd, level, optname,
2641 (void*)&vflag, sizeof vflag);
2642 goto done;
2643 }
2644 return NULL;
2645 }
2646#endif
2647
Christian Heimesdffa3942016-09-05 23:54:41 +02002648 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (PyArg_ParseTuple(args, "iii:setsockopt",
2650 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002651 res = setsockopt(s->sock_fd, level, optname,
2652 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002653 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002655
2656 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002657 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002658 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2659 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2660 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002661 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002662 NULL, (socklen_t)optlen);
2663 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002665
2666 PyErr_Clear();
2667 /* setsockopt(level, opt, buffer) */
2668 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2669 &level, &optname, &optval))
2670 return NULL;
2671
2672#ifdef MS_WINDOWS
2673 if (optval.len > INT_MAX) {
2674 PyBuffer_Release(&optval);
2675 PyErr_Format(PyExc_OverflowError,
2676 "socket option is larger than %i bytes",
2677 INT_MAX);
2678 return NULL;
2679 }
2680 res = setsockopt(s->sock_fd, level, optname,
2681 optval.buf, (int)optval.len);
2682#else
2683 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2684#endif
2685 PyBuffer_Release(&optval);
2686
2687done:
Victor Stinnercc739322016-03-23 21:35:29 +01002688 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002690 }
2691
2692 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002693}
2694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002695PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002696"setsockopt(level, option, value: int)\n\
2697setsockopt(level, option, value: buffer)\n\
2698setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699\n\
2700Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002701The value argument can either be an integer, a string buffer, or \n\
2702None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002703
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002704
Guido van Rossumaee08791992-09-08 09:05:33 +00002705/* s.getsockopt() method.
2706 With two arguments, retrieves an integer option.
2707 With a third integer argument, retrieves a string buffer of that size;
2708 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002709
Guido van Rossum73624e91994-10-10 17:59:00 +00002710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 int level;
2714 int optname;
2715 int res;
2716 PyObject *buf;
2717 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002718 int flag = 0;
2719 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2722 &level, &optname, &buflen))
2723 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002726#ifdef AF_VSOCK
2727 if (s->sock_family == AF_VSOCK) {
2728 uint64_t vflag = 0; // Must be set width of 64 bits
2729 flagsize = sizeof vflag;
2730 res = getsockopt(s->sock_fd, level, optname,
2731 (void *)&vflag, &flagsize);
2732 if (res < 0)
2733 return s->errorhandler();
2734 return PyLong_FromUnsignedLong(vflag);
2735 }
2736#endif
2737 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 res = getsockopt(s->sock_fd, level, optname,
2739 (void *)&flag, &flagsize);
2740 if (res < 0)
2741 return s->errorhandler();
2742 return PyLong_FromLong(flag);
2743 }
caaveryeffc12f2017-09-06 18:18:10 -04002744#ifdef AF_VSOCK
2745 if (s->sock_family == AF_VSOCK) {
2746 PyErr_SetString(PyExc_OSError,
2747 "getsockopt string buffer not allowed");
2748 return NULL;
2749 }
2750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002752 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 "getsockopt buflen out of range");
2754 return NULL;
2755 }
2756 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2757 if (buf == NULL)
2758 return NULL;
2759 res = getsockopt(s->sock_fd, level, optname,
2760 (void *)PyBytes_AS_STRING(buf), &buflen);
2761 if (res < 0) {
2762 Py_DECREF(buf);
2763 return s->errorhandler();
2764 }
2765 _PyBytes_Resize(&buf, buflen);
2766 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002767}
2768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002769PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002770"getsockopt(level, option[, buffersize]) -> value\n\
2771\n\
2772Get a socket option. See the Unix manual for level and option.\n\
2773If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002774string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002775
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002776
Fred Drake728819a2000-07-01 03:40:12 +00002777/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002778
Guido van Rossum73624e91994-10-10 17:59:00 +00002779static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002780sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 sock_addr_t addrbuf;
2783 int addrlen;
2784 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2787 return NULL;
2788 Py_BEGIN_ALLOW_THREADS
2789 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2790 Py_END_ALLOW_THREADS
2791 if (res < 0)
2792 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002793 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002794}
2795
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002796PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002797"bind(address)\n\
2798\n\
2799Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002800pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002801sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002802
Guido van Rossum30a685f1991-06-27 15:51:29 +00002803
2804/* s.close() method.
2805 Set the file descriptor to -1 so operations tried subsequently
2806 will surely fail. */
2807
Guido van Rossum73624e91994-10-10 17:59:00 +00002808static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002809sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002812 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002813
Victor Stinner19a8e842016-03-21 16:36:48 +01002814 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002815 if (fd != INVALID_SOCKET) {
2816 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002817
2818 /* We do not want to retry upon EINTR: see
2819 http://lwn.net/Articles/576478/ and
2820 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2821 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002823 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002825 /* bpo-30319: The peer can already have closed the connection.
2826 Python ignores ECONNRESET on close(). */
2827 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002828 return s->errorhandler();
2829 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002831 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002832}
2833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835"close()\n\
2836\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002837Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002839static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002840sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002841{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002842 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002843 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002844 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002845}
2846
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002847PyDoc_STRVAR(detach_doc,
2848"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002849\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002850Close the socket object without closing the underlying file descriptor.\n\
2851The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002852can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002853
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002854static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002855sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002856{
Victor Stinner81c41db2015-04-02 11:50:57 +02002857 int err;
2858 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002859
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2861 /* getsockopt() failed */
2862 return 0;
2863 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002864
Victor Stinner81c41db2015-04-02 11:50:57 +02002865 if (err == EISCONN)
2866 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002867 if (err != 0) {
2868 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2869 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002870 return 0;
2871 }
2872 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002873}
2874
2875static int
2876internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2877 int raise)
2878{
2879 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002880
2881 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002883 Py_END_ALLOW_THREADS
2884
Victor Stinner70a46f62015-03-31 22:03:59 +02002885 if (!res) {
2886 /* connect() succeeded, the socket is connected */
2887 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002889
Victor Stinner81c41db2015-04-02 11:50:57 +02002890 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002891
Victor Stinner81c41db2015-04-02 11:50:57 +02002892 /* save error, PyErr_CheckSignals() can replace it */
2893 err = GET_SOCK_ERROR;
2894 if (CHECK_ERRNO(EINTR)) {
2895 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002896 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002897
2898 /* Issue #23618: when connect() fails with EINTR, the connection is
2899 running asynchronously.
2900
2901 If the socket is blocking or has a timeout, wait until the
2902 connection completes, fails or timed out using select(), and then
2903 get the connection status using getsockopt(SO_ERROR).
2904
2905 If the socket is non-blocking, raise InterruptedError. The caller is
2906 responsible to wait until the connection completes, fails or timed
2907 out (it's the case in asyncio for example). */
2908 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2909 }
2910 else {
2911 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2912 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002913 }
2914
Victor Stinner81c41db2015-04-02 11:50:57 +02002915 if (!wait_connect) {
2916 if (raise) {
2917 /* restore error, maybe replaced by PyErr_CheckSignals() */
2918 SET_SOCK_ERROR(err);
2919 s->errorhandler();
2920 return -1;
2921 }
2922 else
2923 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002924 }
2925
Victor Stinner81c41db2015-04-02 11:50:57 +02002926 if (raise) {
2927 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002928 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2929 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002930 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002931 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002932 else {
2933 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002934 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2935 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002936 return err;
2937 }
2938 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002939}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002940
Fred Drake728819a2000-07-01 03:40:12 +00002941/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002942
Guido van Rossum73624e91994-10-10 17:59:00 +00002943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002944sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 sock_addr_t addrbuf;
2947 int addrlen;
2948 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2951 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002952
Victor Stinner81c41db2015-04-02 11:50:57 +02002953 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002954 if (res < 0)
2955 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002956
Victor Stinneree699e92015-03-31 21:28:42 +02002957 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002958}
2959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002960PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002961"connect(address)\n\
2962\n\
2963Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965
Guido van Rossum30a685f1991-06-27 15:51:29 +00002966
Fred Drake728819a2000-07-01 03:40:12 +00002967/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002968
2969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002970sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 sock_addr_t addrbuf;
2973 int addrlen;
2974 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2977 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002978
Victor Stinner81c41db2015-04-02 11:50:57 +02002979 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002980 if (res < 0)
2981 return NULL;
2982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002984}
2985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002986PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002987"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002988\n\
2989This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002990instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002991
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002992
Guido van Rossumed233a51992-06-23 09:07:03 +00002993/* s.fileno() method */
2994
Guido van Rossum73624e91994-10-10 17:59:00 +00002995static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002996sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002999}
3000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003001PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003002"fileno() -> integer\n\
3003\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003004Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005
Guido van Rossumed233a51992-06-23 09:07:03 +00003006
Guido van Rossumc89705d1992-11-26 08:54:07 +00003007/* s.getsockname() method */
3008
Guido van Rossum73624e91994-10-10 17:59:00 +00003009static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003010sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 sock_addr_t addrbuf;
3013 int res;
3014 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 if (!getsockaddrlen(s, &addrlen))
3017 return NULL;
3018 memset(&addrbuf, 0, addrlen);
3019 Py_BEGIN_ALLOW_THREADS
3020 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3021 Py_END_ALLOW_THREADS
3022 if (res < 0)
3023 return s->errorhandler();
3024 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3025 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003026}
3027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003028PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003029"getsockname() -> address info\n\
3030\n\
3031Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003032info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003033
Guido van Rossumc89705d1992-11-26 08:54:07 +00003034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003036/* s.getpeername() method */
3037
Guido van Rossum73624e91994-10-10 17:59:00 +00003038static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003039sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 sock_addr_t addrbuf;
3042 int res;
3043 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 if (!getsockaddrlen(s, &addrlen))
3046 return NULL;
3047 memset(&addrbuf, 0, addrlen);
3048 Py_BEGIN_ALLOW_THREADS
3049 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3050 Py_END_ALLOW_THREADS
3051 if (res < 0)
3052 return s->errorhandler();
3053 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3054 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003055}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003057PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003058"getpeername() -> address info\n\
3059\n\
3060Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003061info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003062
Guido van Rossumb6775db1994-08-01 11:34:53 +00003063#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003064
3065
Guido van Rossum30a685f1991-06-27 15:51:29 +00003066/* s.listen(n) method */
3067
Guido van Rossum73624e91994-10-10 17:59:00 +00003068static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003069sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003070{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003071 /* We try to choose a default backlog high enough to avoid connection drops
3072 * for common workloads, yet not too high to limit resource usage. */
3073 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003075
Charles-François Natali644b8f52014-05-22 19:45:39 +01003076 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003080 /* To avoid problems on systems that don't allow a negative backlog
3081 * (which doesn't make sense anyway) we force a minimum value of 0. */
3082 if (backlog < 0)
3083 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 res = listen(s->sock_fd, backlog);
3085 Py_END_ALLOW_THREADS
3086 if (res < 0)
3087 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003088 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003089}
3090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003091PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003092"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003093\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003094Enable a server to accept connections. If backlog is specified, it must be\n\
3095at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003096unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003097connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003098
Victor Stinner31bf2d52015-04-01 21:57:09 +02003099struct sock_recv {
3100 char *cbuf;
3101 Py_ssize_t len;
3102 int flags;
3103 Py_ssize_t result;
3104};
3105
3106static int
3107sock_recv_impl(PySocketSockObject *s, void *data)
3108{
3109 struct sock_recv *ctx = data;
3110
3111#ifdef MS_WINDOWS
3112 if (ctx->len > INT_MAX)
3113 ctx->len = INT_MAX;
3114 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3115#else
3116 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3117#endif
3118 return (ctx->result >= 0);
3119}
3120
Guido van Rossum82a5c661998-07-07 20:45:43 +00003121
Thomas Wouters477c8d52006-05-27 19:21:47 +00003122/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003123 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003124 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003126 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003127 * also possible that we return a number of bytes smaller than the request
3128 * bytes.
3129 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003130
Antoine Pitrou19467d22010-08-17 19:33:30 +00003131static Py_ssize_t
3132sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003133{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003134 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 if (!IS_SELECTABLE(s)) {
3137 select_error();
3138 return -1;
3139 }
3140 if (len == 0) {
3141 /* If 0 bytes were requested, do nothing. */
3142 return 0;
3143 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144
Victor Stinner31bf2d52015-04-01 21:57:09 +02003145 ctx.cbuf = cbuf;
3146 ctx.len = len;
3147 ctx.flags = flags;
3148 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003150
3151 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003152}
3153
Guido van Rossum48a680c2001-03-02 06:34:14 +00003154
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003155/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003156
Guido van Rossum73624e91994-10-10 17:59:00 +00003157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003158sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003159{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003160 Py_ssize_t recvlen, outlen;
3161 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003163
Antoine Pitrou19467d22010-08-17 19:33:30 +00003164 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 if (recvlen < 0) {
3168 PyErr_SetString(PyExc_ValueError,
3169 "negative buffersize in recv");
3170 return NULL;
3171 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 /* Allocate a new string. */
3174 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3175 if (buf == NULL)
3176 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 /* Call the guts */
3179 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3180 if (outlen < 0) {
3181 /* An error occurred, release the string and return an
3182 error. */
3183 Py_DECREF(buf);
3184 return NULL;
3185 }
3186 if (outlen != recvlen) {
3187 /* We did not read as many bytes as we anticipated, resize the
3188 string if possible and be successful. */
3189 _PyBytes_Resize(&buf, outlen);
3190 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003193}
3194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003195PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003196"recv(buffersize[, flags]) -> data\n\
3197\n\
3198Receive up to buffersize bytes from the socket. For the optional flags\n\
3199argument, see the Unix manual. When no data is available, block until\n\
3200at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003201the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003202
Guido van Rossum30a685f1991-06-27 15:51:29 +00003203
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003204/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003205
Thomas Wouters477c8d52006-05-27 19:21:47 +00003206static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003207sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003210
Antoine Pitrou19467d22010-08-17 19:33:30 +00003211 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 Py_buffer pbuf;
3213 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003214 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003217 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 &pbuf, &recvlen, &flags))
3219 return NULL;
3220 buf = pbuf.buf;
3221 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 if (recvlen < 0) {
3224 PyBuffer_Release(&pbuf);
3225 PyErr_SetString(PyExc_ValueError,
3226 "negative buffersize in recv_into");
3227 return NULL;
3228 }
3229 if (recvlen == 0) {
3230 /* If nbytes was not specified, use the buffer's length */
3231 recvlen = buflen;
3232 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 /* Check if the buffer is large enough */
3235 if (buflen < recvlen) {
3236 PyBuffer_Release(&pbuf);
3237 PyErr_SetString(PyExc_ValueError,
3238 "buffer too small for requested bytes");
3239 return NULL;
3240 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 /* Call the guts */
3243 readlen = sock_recv_guts(s, buf, recvlen, flags);
3244 if (readlen < 0) {
3245 /* Return an error. */
3246 PyBuffer_Release(&pbuf);
3247 return NULL;
3248 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 PyBuffer_Release(&pbuf);
3251 /* Return the number of bytes read. Note that we do not do anything
3252 special here in the case that readlen < recvlen. */
3253 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003254}
3255
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003256PyDoc_STRVAR(recv_into_doc,
3257"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003258\n\
3259A version of recv() that stores its data into a buffer rather than creating \n\
3260a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3261is not specified (or 0), receive up to the size available in the given buffer.\n\
3262\n\
3263See recv() for documentation about the flags.");
3264
Victor Stinner31bf2d52015-04-01 21:57:09 +02003265struct sock_recvfrom {
3266 char* cbuf;
3267 Py_ssize_t len;
3268 int flags;
3269 socklen_t *addrlen;
3270 sock_addr_t *addrbuf;
3271 Py_ssize_t result;
3272};
3273
3274static int
3275sock_recvfrom_impl(PySocketSockObject *s, void *data)
3276{
3277 struct sock_recvfrom *ctx = data;
3278
3279 memset(ctx->addrbuf, 0, *ctx->addrlen);
3280
3281#ifdef MS_WINDOWS
3282 if (ctx->len > INT_MAX)
3283 ctx->len = INT_MAX;
3284 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3285 SAS2SA(ctx->addrbuf), ctx->addrlen);
3286#else
3287 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3288 SAS2SA(ctx->addrbuf), ctx->addrlen);
3289#endif
3290 return (ctx->result >= 0);
3291}
3292
Thomas Wouters477c8d52006-05-27 19:21:47 +00003293
3294/*
Christian Heimes99170a52007-12-19 02:07:34 +00003295 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3296 * into a char buffer. If you have any inc/def ref to do to the objects that
3297 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003298 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003299 * that it is also possible that we return a number of bytes smaller than the
3300 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003301 *
3302 * 'addr' is a return value for the address object. Note that you must decref
3303 * it yourself.
3304 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003305static Py_ssize_t
3306sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003311 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 if (!getsockaddrlen(s, &addrlen))
3316 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 if (!IS_SELECTABLE(s)) {
3319 select_error();
3320 return -1;
3321 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003322
Victor Stinner31bf2d52015-04-01 21:57:09 +02003323 ctx.cbuf = cbuf;
3324 ctx.len = len;
3325 ctx.flags = flags;
3326 ctx.addrbuf = &addrbuf;
3327 ctx.addrlen = &addrlen;
3328 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003330
Victor Stinner31bf2d52015-04-01 21:57:09 +02003331 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3332 s->sock_proto);
3333 if (*addr == NULL)
3334 return -1;
3335
3336 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003337}
3338
3339/* s.recvfrom(nbytes [,flags]) method */
3340
3341static PyObject *
3342sock_recvfrom(PySocketSockObject *s, PyObject *args)
3343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 PyObject *buf = NULL;
3345 PyObject *addr = NULL;
3346 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003347 int flags = 0;
3348 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003349
Antoine Pitrou19467d22010-08-17 19:33:30 +00003350 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 if (recvlen < 0) {
3354 PyErr_SetString(PyExc_ValueError,
3355 "negative buffersize in recvfrom");
3356 return NULL;
3357 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3360 if (buf == NULL)
3361 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3364 recvlen, flags, &addr);
3365 if (outlen < 0) {
3366 goto finally;
3367 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 if (outlen != recvlen) {
3370 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003371 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003373 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 goto finally;
3375 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003378
3379finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 Py_XDECREF(buf);
3381 Py_XDECREF(addr);
3382 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003383}
3384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003385PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003386"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3387\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003388Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003389
Thomas Wouters477c8d52006-05-27 19:21:47 +00003390
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003391/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003392
3393static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003394sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397
Antoine Pitrou19467d22010-08-17 19:33:30 +00003398 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 Py_buffer pbuf;
3400 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003401 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003404
Antoine Pitrou19467d22010-08-17 19:33:30 +00003405 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 kwlist, &pbuf,
3407 &recvlen, &flags))
3408 return NULL;
3409 buf = pbuf.buf;
3410 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 if (recvlen < 0) {
3413 PyBuffer_Release(&pbuf);
3414 PyErr_SetString(PyExc_ValueError,
3415 "negative buffersize in recvfrom_into");
3416 return NULL;
3417 }
3418 if (recvlen == 0) {
3419 /* If nbytes was not specified, use the buffer's length */
3420 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003421 } else if (recvlen > buflen) {
3422 PyBuffer_Release(&pbuf);
3423 PyErr_SetString(PyExc_ValueError,
3424 "nbytes is greater than the length of the buffer");
3425 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3429 if (readlen < 0) {
3430 PyBuffer_Release(&pbuf);
3431 /* Return an error */
3432 Py_XDECREF(addr);
3433 return NULL;
3434 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 PyBuffer_Release(&pbuf);
3437 /* Return the number of bytes read and the address. Note that we do
3438 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003439 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440}
3441
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003442PyDoc_STRVAR(recvfrom_into_doc,
3443"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003444\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003445Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003446
Victor Stinner35bee932015-04-02 12:28:07 +02003447/* The sendmsg() and recvmsg[_into]() methods require a working
3448 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3449#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003450struct sock_recvmsg {
3451 struct msghdr *msg;
3452 int flags;
3453 ssize_t result;
3454};
3455
3456static int
3457sock_recvmsg_impl(PySocketSockObject *s, void *data)
3458{
3459 struct sock_recvmsg *ctx = data;
3460
3461 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3462 return (ctx->result >= 0);
3463}
3464
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003465/*
3466 * Call recvmsg() with the supplied iovec structures, flags, and
3467 * ancillary data buffer size (controllen). Returns the tuple return
3468 * value for recvmsg() or recvmsg_into(), with the first item provided
3469 * by the supplied makeval() function. makeval() will be called with
3470 * the length read and makeval_data as arguments, and must return a
3471 * new reference (which will be decrefed if there is a subsequent
3472 * error). On error, closes any file descriptors received via
3473 * SCM_RIGHTS.
3474 */
3475static PyObject *
3476sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3477 int flags, Py_ssize_t controllen,
3478 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3479{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003480 sock_addr_t addrbuf;
3481 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003482 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003483 PyObject *cmsg_list = NULL, *retval = NULL;
3484 void *controlbuf = NULL;
3485 struct cmsghdr *cmsgh;
3486 size_t cmsgdatalen = 0;
3487 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003488 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489
3490 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3491 ignored" when the socket is connected (Linux fills them in
3492 anyway for AF_UNIX sockets at least). Normally msg_namelen
3493 seems to be set to 0 if there's no address, but try to
3494 initialize msg_name to something that won't be mistaken for a
3495 real address if that doesn't happen. */
3496 if (!getsockaddrlen(s, &addrbuflen))
3497 return NULL;
3498 memset(&addrbuf, 0, addrbuflen);
3499 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3500
3501 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3502 PyErr_SetString(PyExc_ValueError,
3503 "invalid ancillary data buffer length");
3504 return NULL;
3505 }
3506 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3507 return PyErr_NoMemory();
3508
3509 /* Make the system call. */
3510 if (!IS_SELECTABLE(s)) {
3511 select_error();
3512 goto finally;
3513 }
3514
Victor Stinner31bf2d52015-04-01 21:57:09 +02003515 msg.msg_name = SAS2SA(&addrbuf);
3516 msg.msg_namelen = addrbuflen;
3517 msg.msg_iov = iov;
3518 msg.msg_iovlen = iovlen;
3519 msg.msg_control = controlbuf;
3520 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003521
Victor Stinner31bf2d52015-04-01 21:57:09 +02003522 ctx.msg = &msg;
3523 ctx.flags = flags;
3524 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003525 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003526
3527 /* Make list of (level, type, data) tuples from control messages. */
3528 if ((cmsg_list = PyList_New(0)) == NULL)
3529 goto err_closefds;
3530 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3531 implementations didn't do so. */
3532 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3533 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3534 PyObject *bytes, *tuple;
3535 int tmp;
3536
3537 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3538 if (cmsg_status != 0) {
3539 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3540 "received malformed or improperly-truncated "
3541 "ancillary data", 1) == -1)
3542 goto err_closefds;
3543 }
3544 if (cmsg_status < 0)
3545 break;
3546 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003547 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003548 goto err_closefds;
3549 }
3550
3551 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3552 cmsgdatalen);
3553 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3554 (int)cmsgh->cmsg_type, bytes);
3555 if (tuple == NULL)
3556 goto err_closefds;
3557 tmp = PyList_Append(cmsg_list, tuple);
3558 Py_DECREF(tuple);
3559 if (tmp != 0)
3560 goto err_closefds;
3561
3562 if (cmsg_status != 0)
3563 break;
3564 }
3565
3566 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003567 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003568 cmsg_list,
3569 (int)msg.msg_flags,
3570 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3571 ((msg.msg_namelen > addrbuflen) ?
3572 addrbuflen : msg.msg_namelen),
3573 s->sock_proto));
3574 if (retval == NULL)
3575 goto err_closefds;
3576
3577finally:
3578 Py_XDECREF(cmsg_list);
3579 PyMem_Free(controlbuf);
3580 return retval;
3581
3582err_closefds:
3583#ifdef SCM_RIGHTS
3584 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3585 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3586 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3587 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3588 if (cmsg_status < 0)
3589 break;
3590 if (cmsgh->cmsg_level == SOL_SOCKET &&
3591 cmsgh->cmsg_type == SCM_RIGHTS) {
3592 size_t numfds;
3593 int *fdp;
3594
3595 numfds = cmsgdatalen / sizeof(int);
3596 fdp = (int *)CMSG_DATA(cmsgh);
3597 while (numfds-- > 0)
3598 close(*fdp++);
3599 }
3600 if (cmsg_status != 0)
3601 break;
3602 }
3603#endif /* SCM_RIGHTS */
3604 goto finally;
3605}
3606
3607
3608static PyObject *
3609makeval_recvmsg(ssize_t received, void *data)
3610{
3611 PyObject **buf = data;
3612
3613 if (received < PyBytes_GET_SIZE(*buf))
3614 _PyBytes_Resize(buf, received);
3615 Py_XINCREF(*buf);
3616 return *buf;
3617}
3618
3619/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3620
3621static PyObject *
3622sock_recvmsg(PySocketSockObject *s, PyObject *args)
3623{
3624 Py_ssize_t bufsize, ancbufsize = 0;
3625 int flags = 0;
3626 struct iovec iov;
3627 PyObject *buf = NULL, *retval = NULL;
3628
3629 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3630 return NULL;
3631
3632 if (bufsize < 0) {
3633 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3634 return NULL;
3635 }
3636 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3637 return NULL;
3638 iov.iov_base = PyBytes_AS_STRING(buf);
3639 iov.iov_len = bufsize;
3640
3641 /* Note that we're passing a pointer to *our pointer* to the bytes
3642 object here (&buf); makeval_recvmsg() may incref the object, or
3643 deallocate it and set our pointer to NULL. */
3644 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3645 &makeval_recvmsg, &buf);
3646 Py_XDECREF(buf);
3647 return retval;
3648}
3649
3650PyDoc_STRVAR(recvmsg_doc,
3651"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3652\n\
3653Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3654socket. The ancbufsize argument sets the size in bytes of the\n\
3655internal buffer used to receive the ancillary data; it defaults to 0,\n\
3656meaning that no ancillary data will be received. Appropriate buffer\n\
3657sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3658CMSG_LEN(), and items which do not fit into the buffer might be\n\
3659truncated or discarded. The flags argument defaults to 0 and has the\n\
3660same meaning as for recv().\n\
3661\n\
3662The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3663The data item is a bytes object holding the non-ancillary data\n\
3664received. The ancdata item is a list of zero or more tuples\n\
3665(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3666(control messages) received: cmsg_level and cmsg_type are integers\n\
3667specifying the protocol level and protocol-specific type respectively,\n\
3668and cmsg_data is a bytes object holding the associated data. The\n\
3669msg_flags item is the bitwise OR of various flags indicating\n\
3670conditions on the received message; see your system documentation for\n\
3671details. If the receiving socket is unconnected, address is the\n\
3672address of the sending socket, if available; otherwise, its value is\n\
3673unspecified.\n\
3674\n\
3675If recvmsg() raises an exception after the system call returns, it\n\
3676will first attempt to close any file descriptors received via the\n\
3677SCM_RIGHTS mechanism.");
3678
3679
3680static PyObject *
3681makeval_recvmsg_into(ssize_t received, void *data)
3682{
3683 return PyLong_FromSsize_t(received);
3684}
3685
3686/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3687
3688static PyObject *
3689sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3690{
3691 Py_ssize_t ancbufsize = 0;
3692 int flags = 0;
3693 struct iovec *iovs = NULL;
3694 Py_ssize_t i, nitems, nbufs = 0;
3695 Py_buffer *bufs = NULL;
3696 PyObject *buffers_arg, *fast, *retval = NULL;
3697
3698 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3699 &buffers_arg, &ancbufsize, &flags))
3700 return NULL;
3701
3702 if ((fast = PySequence_Fast(buffers_arg,
3703 "recvmsg_into() argument 1 must be an "
3704 "iterable")) == NULL)
3705 return NULL;
3706 nitems = PySequence_Fast_GET_SIZE(fast);
3707 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003708 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709 goto finally;
3710 }
3711
3712 /* Fill in an iovec for each item, and save the Py_buffer
3713 structs to release afterwards. */
3714 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3715 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3716 PyErr_NoMemory();
3717 goto finally;
3718 }
3719 for (; nbufs < nitems; nbufs++) {
3720 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3721 "w*;recvmsg_into() argument 1 must be an iterable "
3722 "of single-segment read-write buffers",
3723 &bufs[nbufs]))
3724 goto finally;
3725 iovs[nbufs].iov_base = bufs[nbufs].buf;
3726 iovs[nbufs].iov_len = bufs[nbufs].len;
3727 }
3728
3729 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3730 &makeval_recvmsg_into, NULL);
3731finally:
3732 for (i = 0; i < nbufs; i++)
3733 PyBuffer_Release(&bufs[i]);
3734 PyMem_Free(bufs);
3735 PyMem_Free(iovs);
3736 Py_DECREF(fast);
3737 return retval;
3738}
3739
3740PyDoc_STRVAR(recvmsg_into_doc,
3741"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3742\n\
3743Receive normal data and ancillary data from the socket, scattering the\n\
3744non-ancillary data into a series of buffers. The buffers argument\n\
3745must be an iterable of objects that export writable buffers\n\
3746(e.g. bytearray objects); these will be filled with successive chunks\n\
3747of the non-ancillary data until it has all been written or there are\n\
3748no more buffers. The ancbufsize argument sets the size in bytes of\n\
3749the internal buffer used to receive the ancillary data; it defaults to\n\
37500, meaning that no ancillary data will be received. Appropriate\n\
3751buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3752or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3753truncated or discarded. The flags argument defaults to 0 and has the\n\
3754same meaning as for recv().\n\
3755\n\
3756The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3757The nbytes item is the total number of bytes of non-ancillary data\n\
3758written into the buffers. The ancdata item is a list of zero or more\n\
3759tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3760data (control messages) received: cmsg_level and cmsg_type are\n\
3761integers specifying the protocol level and protocol-specific type\n\
3762respectively, and cmsg_data is a bytes object holding the associated\n\
3763data. The msg_flags item is the bitwise OR of various flags\n\
3764indicating conditions on the received message; see your system\n\
3765documentation for details. If the receiving socket is unconnected,\n\
3766address is the address of the sending socket, if available; otherwise,\n\
3767its value is unspecified.\n\
3768\n\
3769If recvmsg_into() raises an exception after the system call returns,\n\
3770it will first attempt to close any file descriptors received via the\n\
3771SCM_RIGHTS mechanism.");
3772#endif /* CMSG_LEN */
3773
3774
Victor Stinner31bf2d52015-04-01 21:57:09 +02003775struct sock_send {
3776 char *buf;
3777 Py_ssize_t len;
3778 int flags;
3779 Py_ssize_t result;
3780};
3781
3782static int
3783sock_send_impl(PySocketSockObject *s, void *data)
3784{
3785 struct sock_send *ctx = data;
3786
3787#ifdef MS_WINDOWS
3788 if (ctx->len > INT_MAX)
3789 ctx->len = INT_MAX;
3790 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3791#else
3792 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3793#endif
3794 return (ctx->result >= 0);
3795}
3796
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003797/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003798
Guido van Rossum73624e91994-10-10 17:59:00 +00003799static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003800sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003801{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003802 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003803 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003804 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3807 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 if (!IS_SELECTABLE(s)) {
3810 PyBuffer_Release(&pbuf);
3811 return select_error();
3812 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003813 ctx.buf = pbuf.buf;
3814 ctx.len = pbuf.len;
3815 ctx.flags = flags;
3816 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003817 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 return NULL;
3819 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003820 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003821
3822 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003823}
3824
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003825PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003826"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003827\n\
3828Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003829argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003830sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003831
3832
3833/* s.sendall(data [,flags]) method */
3834
3835static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003836sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003839 Py_ssize_t len, n;
3840 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003842 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003843 int has_timeout = (s->sock_timeout > 0);
3844 _PyTime_t interval = s->sock_timeout;
3845 _PyTime_t deadline = 0;
3846 int deadline_initialized = 0;
3847 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3850 return NULL;
3851 buf = pbuf.buf;
3852 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 if (!IS_SELECTABLE(s)) {
3855 PyBuffer_Release(&pbuf);
3856 return select_error();
3857 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003860 if (has_timeout) {
3861 if (deadline_initialized) {
3862 /* recompute the timeout */
3863 interval = deadline - _PyTime_GetMonotonicClock();
3864 }
3865 else {
3866 deadline_initialized = 1;
3867 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3868 }
3869
3870 if (interval <= 0) {
3871 PyErr_SetString(socket_timeout, "timed out");
3872 goto done;
3873 }
3874 }
3875
Victor Stinner02f32ab2015-04-01 22:53:26 +02003876 ctx.buf = buf;
3877 ctx.len = len;
3878 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003879 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3880 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003881 n = ctx.result;
3882 assert(n >= 0);
3883
3884 buf += n;
3885 len -= n;
3886
3887 /* We must run our signal handlers before looping again.
3888 send() can return a successful partial write when it is
3889 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003890 if (PyErr_CheckSignals())
3891 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003892 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003893 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003894
Victor Stinner8912d142015-04-06 23:16:34 +02003895 Py_INCREF(Py_None);
3896 res = Py_None;
3897
3898done:
3899 PyBuffer_Release(&pbuf);
3900 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003901}
3902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003903PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003904"sendall(data[, flags])\n\
3905\n\
3906Send a data string to the socket. For the optional flags\n\
3907argument, see the Unix manual. This calls send() repeatedly\n\
3908until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003909to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003910
Guido van Rossum30a685f1991-06-27 15:51:29 +00003911
Victor Stinner31bf2d52015-04-01 21:57:09 +02003912struct sock_sendto {
3913 char *buf;
3914 Py_ssize_t len;
3915 int flags;
3916 int addrlen;
3917 sock_addr_t *addrbuf;
3918 Py_ssize_t result;
3919};
3920
3921static int
3922sock_sendto_impl(PySocketSockObject *s, void *data)
3923{
3924 struct sock_sendto *ctx = data;
3925
3926#ifdef MS_WINDOWS
3927 if (ctx->len > INT_MAX)
3928 ctx->len = INT_MAX;
3929 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3930 SAS2SA(ctx->addrbuf), ctx->addrlen);
3931#else
3932 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3933 SAS2SA(ctx->addrbuf), ctx->addrlen);
3934#endif
3935 return (ctx->result >= 0);
3936}
3937
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003938/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003939
Guido van Rossum73624e91994-10-10 17:59:00 +00003940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003941sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 Py_buffer pbuf;
3944 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003945 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003947 int addrlen, flags;
3948 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003951 arglen = PyTuple_Size(args);
3952 switch (arglen) {
3953 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003954 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3955 return NULL;
3956 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003957 break;
3958 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003959 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3960 &pbuf, &flags, &addro)) {
3961 return NULL;
3962 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003963 break;
3964 default:
3965 PyErr_Format(PyExc_TypeError,
3966 "sendto() takes 2 or 3 arguments (%d given)",
3967 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003968 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 if (!IS_SELECTABLE(s)) {
3972 PyBuffer_Release(&pbuf);
3973 return select_error();
3974 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3977 PyBuffer_Release(&pbuf);
3978 return NULL;
3979 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003980
Victor Stinner31bf2d52015-04-01 21:57:09 +02003981 ctx.buf = pbuf.buf;
3982 ctx.len = pbuf.len;
3983 ctx.flags = flags;
3984 ctx.addrlen = addrlen;
3985 ctx.addrbuf = &addrbuf;
3986 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003987 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 return NULL;
3989 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003990 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003991
3992 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003993}
3994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003995PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003996"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003997\n\
3998Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003999For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004000
Guido van Rossum30a685f1991-06-27 15:51:29 +00004001
Victor Stinner35bee932015-04-02 12:28:07 +02004002/* The sendmsg() and recvmsg[_into]() methods require a working
4003 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4004#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004005struct sock_sendmsg {
4006 struct msghdr *msg;
4007 int flags;
4008 ssize_t result;
4009};
4010
4011static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004012sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4013 struct msghdr *msg,
4014 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4015 Py_ssize_t ndataparts, ndatabufs = 0;
4016 int result = -1;
4017 struct iovec *iovs = NULL;
4018 PyObject *data_fast = NULL;
4019 Py_buffer *databufs = NULL;
4020
4021 /* Fill in an iovec for each message part, and save the Py_buffer
4022 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004023 data_fast = PySequence_Fast(data_arg,
4024 "sendmsg() argument 1 must be an "
4025 "iterable");
4026 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004027 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004028 }
4029
Christian Heimesdffa3942016-09-05 23:54:41 +02004030 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4031 if (ndataparts > INT_MAX) {
4032 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4033 goto finally;
4034 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004035
Christian Heimesdffa3942016-09-05 23:54:41 +02004036 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004037 if (ndataparts > 0) {
4038 iovs = PyMem_New(struct iovec, ndataparts);
4039 if (iovs == NULL) {
4040 PyErr_NoMemory();
4041 goto finally;
4042 }
4043 msg->msg_iov = iovs;
4044
4045 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004046 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004047 PyErr_NoMemory();
4048 goto finally;
4049 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004050 }
4051 for (; ndatabufs < ndataparts; ndatabufs++) {
4052 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4053 "y*;sendmsg() argument 1 must be an iterable of "
4054 "bytes-like objects",
4055 &databufs[ndatabufs]))
4056 goto finally;
4057 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4058 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4059 }
4060 result = 0;
4061 finally:
4062 *databufsout = databufs;
4063 *ndatabufsout = ndatabufs;
4064 Py_XDECREF(data_fast);
4065 return result;
4066}
4067
4068static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004069sock_sendmsg_impl(PySocketSockObject *s, void *data)
4070{
4071 struct sock_sendmsg *ctx = data;
4072
4073 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4074 return (ctx->result >= 0);
4075}
4076
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004077/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4078
4079static PyObject *
4080sock_sendmsg(PySocketSockObject *s, PyObject *args)
4081{
Christian Heimesdffa3942016-09-05 23:54:41 +02004082 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004083 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004085 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004086 struct cmsginfo {
4087 int level;
4088 int type;
4089 Py_buffer data;
4090 } *cmsgs = NULL;
4091 void *controlbuf = NULL;
4092 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004093 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004094 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004096 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097
4098 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004099 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004101 }
4102
4103 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004105 /* Parse destination address. */
4106 if (addr_arg != NULL && addr_arg != Py_None) {
4107 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4108 goto finally;
4109 msg.msg_name = &addrbuf;
4110 msg.msg_namelen = addrlen;
4111 }
4112
4113 /* Fill in an iovec for each message part, and save the Py_buffer
4114 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004115 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004117 }
4118
4119 if (cmsg_arg == NULL)
4120 ncmsgs = 0;
4121 else {
4122 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4123 "sendmsg() argument 2 must be an "
4124 "iterable")) == NULL)
4125 goto finally;
4126 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4127 }
4128
4129#ifndef CMSG_SPACE
4130 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004131 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004132 "sending multiple control messages is not supported "
4133 "on this system");
4134 goto finally;
4135 }
4136#endif
4137 /* Save level, type and Py_buffer for each control message,
4138 and calculate total size. */
4139 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4140 PyErr_NoMemory();
4141 goto finally;
4142 }
4143 controllen = controllen_last = 0;
4144 while (ncmsgbufs < ncmsgs) {
4145 size_t bufsize, space;
4146
4147 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4148 "(iiy*):[sendmsg() ancillary data items]",
4149 &cmsgs[ncmsgbufs].level,
4150 &cmsgs[ncmsgbufs].type,
4151 &cmsgs[ncmsgbufs].data))
4152 goto finally;
4153 bufsize = cmsgs[ncmsgbufs++].data.len;
4154
4155#ifdef CMSG_SPACE
4156 if (!get_CMSG_SPACE(bufsize, &space)) {
4157#else
4158 if (!get_CMSG_LEN(bufsize, &space)) {
4159#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004160 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004161 goto finally;
4162 }
4163 controllen += space;
4164 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004165 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004166 goto finally;
4167 }
4168 controllen_last = controllen;
4169 }
4170
4171 /* Construct ancillary data block from control message info. */
4172 if (ncmsgbufs > 0) {
4173 struct cmsghdr *cmsgh = NULL;
4174
Victor Stinner52d61e42016-09-12 11:41:58 +02004175 controlbuf = PyMem_Malloc(controllen);
4176 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004177 PyErr_NoMemory();
4178 goto finally;
4179 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004180 msg.msg_control = controlbuf;
4181
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004182 msg.msg_controllen = controllen;
4183
4184 /* Need to zero out the buffer as a workaround for glibc's
4185 CMSG_NXTHDR() implementation. After getting the pointer to
4186 the next header, it checks its (uninitialized) cmsg_len
4187 member to see if the "message" fits in the buffer, and
4188 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004189 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004190 memset(controlbuf, 0, controllen);
4191
4192 for (i = 0; i < ncmsgbufs; i++) {
4193 size_t msg_len, data_len = cmsgs[i].data.len;
4194 int enough_space = 0;
4195
4196 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4197 if (cmsgh == NULL) {
4198 PyErr_Format(PyExc_RuntimeError,
4199 "unexpected NULL result from %s()",
4200 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4201 goto finally;
4202 }
4203 if (!get_CMSG_LEN(data_len, &msg_len)) {
4204 PyErr_SetString(PyExc_RuntimeError,
4205 "item size out of range for CMSG_LEN()");
4206 goto finally;
4207 }
4208 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4209 size_t space;
4210
4211 cmsgh->cmsg_len = msg_len;
4212 if (get_cmsg_data_space(&msg, cmsgh, &space))
4213 enough_space = (space >= data_len);
4214 }
4215 if (!enough_space) {
4216 PyErr_SetString(PyExc_RuntimeError,
4217 "ancillary data does not fit in calculated "
4218 "space");
4219 goto finally;
4220 }
4221 cmsgh->cmsg_level = cmsgs[i].level;
4222 cmsgh->cmsg_type = cmsgs[i].type;
4223 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4224 }
4225 }
4226
4227 /* Make the system call. */
4228 if (!IS_SELECTABLE(s)) {
4229 select_error();
4230 goto finally;
4231 }
4232
Victor Stinner31bf2d52015-04-01 21:57:09 +02004233 ctx.msg = &msg;
4234 ctx.flags = flags;
4235 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004236 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004237
4238 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239
4240finally:
4241 PyMem_Free(controlbuf);
4242 for (i = 0; i < ncmsgbufs; i++)
4243 PyBuffer_Release(&cmsgs[i].data);
4244 PyMem_Free(cmsgs);
4245 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004246 PyMem_Free(msg.msg_iov);
4247 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004249 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004250 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004251 return retval;
4252}
4253
4254PyDoc_STRVAR(sendmsg_doc,
4255"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4256\n\
4257Send normal and ancillary data to the socket, gathering the\n\
4258non-ancillary data from a series of buffers and concatenating it into\n\
4259a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004260data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261The ancdata argument specifies the ancillary data (control messages)\n\
4262as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4263cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4264protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004265is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004266argument defaults to 0 and has the same meaning as for send(). If\n\
4267address is supplied and not None, it sets a destination address for\n\
4268the message. The return value is the number of bytes of non-ancillary\n\
4269data sent.");
4270#endif /* CMSG_LEN */
4271
Christian Heimesdffa3942016-09-05 23:54:41 +02004272#ifdef HAVE_SOCKADDR_ALG
4273static PyObject*
4274sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4275{
4276 PyObject *retval = NULL;
4277
4278 Py_ssize_t i, ndatabufs = 0;
4279 Py_buffer *databufs = NULL;
4280 PyObject *data_arg = NULL;
4281
4282 Py_buffer iv = {NULL, NULL};
4283
4284 PyObject *opobj = NULL;
4285 int op = -1;
4286
4287 PyObject *assoclenobj = NULL;
4288 int assoclen = -1;
4289
4290 unsigned int *uiptr;
4291 int flags = 0;
4292
4293 struct msghdr msg;
4294 struct cmsghdr *header = NULL;
4295 struct af_alg_iv *alg_iv = NULL;
4296 struct sock_sendmsg ctx;
4297 Py_ssize_t controllen;
4298 void *controlbuf = NULL;
4299 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4300
4301 if (self->sock_family != AF_ALG) {
4302 PyErr_SetString(PyExc_OSError,
4303 "algset is only supported for AF_ALG");
4304 return NULL;
4305 }
4306
4307 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4308 "|O$O!y*O!i:sendmsg_afalg", keywords,
4309 &data_arg,
4310 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004311 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004312 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004313 }
4314
4315 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004316
4317 /* op is a required, keyword-only argument >= 0 */
4318 if (opobj != NULL) {
4319 op = _PyLong_AsInt(opobj);
4320 }
4321 if (op < 0) {
4322 /* override exception from _PyLong_AsInt() */
4323 PyErr_SetString(PyExc_TypeError,
4324 "Invalid or missing argument 'op'");
4325 goto finally;
4326 }
4327 /* assoclen is optional but must be >= 0 */
4328 if (assoclenobj != NULL) {
4329 assoclen = _PyLong_AsInt(assoclenobj);
4330 if (assoclen == -1 && PyErr_Occurred()) {
4331 goto finally;
4332 }
4333 if (assoclen < 0) {
4334 PyErr_SetString(PyExc_TypeError,
4335 "assoclen must be positive");
4336 goto finally;
4337 }
4338 }
4339
4340 controllen = CMSG_SPACE(4);
4341 if (iv.buf != NULL) {
4342 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4343 }
4344 if (assoclen >= 0) {
4345 controllen += CMSG_SPACE(4);
4346 }
4347
4348 controlbuf = PyMem_Malloc(controllen);
4349 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004350 PyErr_NoMemory();
4351 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004352 }
4353 memset(controlbuf, 0, controllen);
4354
Christian Heimesdffa3942016-09-05 23:54:41 +02004355 msg.msg_controllen = controllen;
4356 msg.msg_control = controlbuf;
4357
4358 /* Fill in an iovec for each message part, and save the Py_buffer
4359 structs to release afterwards. */
4360 if (data_arg != NULL) {
4361 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4362 goto finally;
4363 }
4364 }
4365
4366 /* set operation to encrypt or decrypt */
4367 header = CMSG_FIRSTHDR(&msg);
4368 if (header == NULL) {
4369 PyErr_SetString(PyExc_RuntimeError,
4370 "unexpected NULL result from CMSG_FIRSTHDR");
4371 goto finally;
4372 }
4373 header->cmsg_level = SOL_ALG;
4374 header->cmsg_type = ALG_SET_OP;
4375 header->cmsg_len = CMSG_LEN(4);
4376 uiptr = (void*)CMSG_DATA(header);
4377 *uiptr = (unsigned int)op;
4378
4379 /* set initialization vector */
4380 if (iv.buf != NULL) {
4381 header = CMSG_NXTHDR(&msg, header);
4382 if (header == NULL) {
4383 PyErr_SetString(PyExc_RuntimeError,
4384 "unexpected NULL result from CMSG_NXTHDR(iv)");
4385 goto finally;
4386 }
4387 header->cmsg_level = SOL_ALG;
4388 header->cmsg_type = ALG_SET_IV;
4389 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4390 alg_iv = (void*)CMSG_DATA(header);
4391 alg_iv->ivlen = iv.len;
4392 memcpy(alg_iv->iv, iv.buf, iv.len);
4393 }
4394
4395 /* set length of associated data for AEAD */
4396 if (assoclen >= 0) {
4397 header = CMSG_NXTHDR(&msg, header);
4398 if (header == NULL) {
4399 PyErr_SetString(PyExc_RuntimeError,
4400 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4401 goto finally;
4402 }
4403 header->cmsg_level = SOL_ALG;
4404 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4405 header->cmsg_len = CMSG_LEN(4);
4406 uiptr = (void*)CMSG_DATA(header);
4407 *uiptr = (unsigned int)assoclen;
4408 }
4409
4410 ctx.msg = &msg;
4411 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004412 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004413 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004414 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004415
4416 retval = PyLong_FromSsize_t(ctx.result);
4417
4418 finally:
4419 PyMem_Free(controlbuf);
4420 if (iv.buf != NULL) {
4421 PyBuffer_Release(&iv);
4422 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004423 PyMem_Free(msg.msg_iov);
4424 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004425 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004426 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004427 PyMem_Free(databufs);
4428 return retval;
4429}
4430
4431PyDoc_STRVAR(sendmsg_afalg_doc,
4432"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4433\n\
4434Set operation mode, IV and length of associated data for an AF_ALG\n\
4435operation socket.");
4436#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004437
Guido van Rossum30a685f1991-06-27 15:51:29 +00004438/* s.shutdown(how) method */
4439
Guido van Rossum73624e91994-10-10 17:59:00 +00004440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004441sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 int how;
4444 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004445
Serhiy Storchaka78980432013-01-15 01:12:17 +02004446 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 if (how == -1 && PyErr_Occurred())
4448 return NULL;
4449 Py_BEGIN_ALLOW_THREADS
4450 res = shutdown(s->sock_fd, how);
4451 Py_END_ALLOW_THREADS
4452 if (res < 0)
4453 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004454 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004455}
4456
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004457PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004458"shutdown(flag)\n\
4459\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004460Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4461of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004462
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004463#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004464static PyObject*
4465sock_ioctl(PySocketSockObject *s, PyObject *arg)
4466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 unsigned long cmd = SIO_RCVALL;
4468 PyObject *argO;
4469 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4472 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 switch (cmd) {
4475 case SIO_RCVALL: {
4476 unsigned int option = RCVALL_ON;
4477 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4478 return NULL;
4479 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4480 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4481 return set_error();
4482 }
4483 return PyLong_FromUnsignedLong(recv); }
4484 case SIO_KEEPALIVE_VALS: {
4485 struct tcp_keepalive ka;
4486 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4487 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4488 return NULL;
4489 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4490 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4491 return set_error();
4492 }
4493 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004494#if defined(SIO_LOOPBACK_FAST_PATH)
4495 case SIO_LOOPBACK_FAST_PATH: {
4496 unsigned int option;
4497 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4498 return NULL;
4499 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4500 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4501 return set_error();
4502 }
4503 return PyLong_FromUnsignedLong(recv); }
4504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 default:
4506 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4507 return NULL;
4508 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004509}
4510PyDoc_STRVAR(sock_ioctl_doc,
4511"ioctl(cmd, option) -> long\n\
4512\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004513Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4514SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004515SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4516SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004517#endif
4518
4519#if defined(MS_WINDOWS)
4520static PyObject*
4521sock_share(PySocketSockObject *s, PyObject *arg)
4522{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004523 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004524 DWORD processId;
4525 int result;
4526
4527 if (!PyArg_ParseTuple(arg, "I", &processId))
4528 return NULL;
4529
4530 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004531 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004532 Py_END_ALLOW_THREADS
4533 if (result == SOCKET_ERROR)
4534 return set_error();
4535 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4536}
4537PyDoc_STRVAR(sock_share_doc,
4538"share(process_id) -> bytes\n\
4539\n\
4540Share the socket with another process. The target process id\n\
4541must be provided and the resulting bytes object passed to the target\n\
4542process. There the shared socket can be instantiated by calling\n\
4543socket.fromshare().");
4544
Christian Heimesfaf2f632008-01-06 16:59:19 +00004545
4546#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004547
4548/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004549
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004550static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4552 accept_doc},
4553 {"bind", (PyCFunction)sock_bind, METH_O,
4554 bind_doc},
4555 {"close", (PyCFunction)sock_close, METH_NOARGS,
4556 close_doc},
4557 {"connect", (PyCFunction)sock_connect, METH_O,
4558 connect_doc},
4559 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4560 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004561 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4562 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4564 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004565#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 {"getpeername", (PyCFunction)sock_getpeername,
4567 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 {"getsockname", (PyCFunction)sock_getsockname,
4570 METH_NOARGS, getsockname_doc},
4571 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4572 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004573#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4575 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004576#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004577#if defined(MS_WINDOWS)
4578 {"share", (PyCFunction)sock_share, METH_VARARGS,
4579 sock_share_doc},
4580#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004581 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 listen_doc},
4583 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4584 recv_doc},
4585 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4586 recv_into_doc},
4587 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4588 recvfrom_doc},
4589 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4590 recvfrom_into_doc},
4591 {"send", (PyCFunction)sock_send, METH_VARARGS,
4592 send_doc},
4593 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4594 sendall_doc},
4595 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4596 sendto_doc},
4597 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4598 setblocking_doc},
4599 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4600 settimeout_doc},
4601 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4602 gettimeout_doc},
4603 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4604 setsockopt_doc},
4605 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4606 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004607#ifdef CMSG_LEN
4608 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4609 recvmsg_doc},
4610 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4611 recvmsg_into_doc,},
4612 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4613 sendmsg_doc},
4614#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004615#ifdef HAVE_SOCKADDR_ALG
4616 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4617 sendmsg_afalg_doc},
4618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004620};
4621
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004622/* SockObject members */
4623static PyMemberDef sock_memberlist[] = {
4624 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4625 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4626 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004627 {0},
4628};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004629
Victor Stinner71694d52015-03-28 01:18:54 +01004630static PyGetSetDef sock_getsetlist[] = {
4631 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4632 {NULL} /* sentinel */
4633};
4634
Guido van Rossum73624e91994-10-10 17:59:00 +00004635/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004636 First close the file description. */
4637
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004638static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004639sock_finalize(PySocketSockObject *s)
4640{
4641 SOCKET_T fd;
4642 PyObject *error_type, *error_value, *error_traceback;
4643
4644 /* Save the current exception, if any. */
4645 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4646
Victor Stinnerd3afb622016-07-22 17:47:09 +02004647 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004648 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4649 /* Spurious errors can appear at shutdown */
4650 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4651 PyErr_WriteUnraisable((PyObject *)s);
4652 }
4653 }
4654
4655 /* Only close the socket *after* logging the ResourceWarning warning
4656 to allow the logger to call socket methods like
4657 socket.getsockname(). If the socket is closed before, socket
4658 methods fails with the EBADF error. */
4659 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004660 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004661
4662 /* We do not want to retry upon EINTR: see sock_close() */
4663 Py_BEGIN_ALLOW_THREADS
4664 (void) SOCKETCLOSE(fd);
4665 Py_END_ALLOW_THREADS
4666 }
4667
4668 /* Restore the saved exception. */
4669 PyErr_Restore(error_type, error_value, error_traceback);
4670}
4671
4672static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004673sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004674{
Victor Stinner19a8e842016-03-21 16:36:48 +01004675 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4676 return;
4677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004679}
4680
Guido van Rossum30a685f1991-06-27 15:51:29 +00004681
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004683sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004684{
Victor Stinnere254e532014-07-26 14:36:55 +02004685 long sock_fd;
4686 /* On Windows, this test is needed because SOCKET_T is unsigned */
4687 if (s->sock_fd == INVALID_SOCKET) {
4688 sock_fd = -1;
4689 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004690#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004691 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 /* this can occur on Win64, and actually there is a special
4693 ugly printf formatter for decimal pointer length integer
4694 printing, only bother if necessary*/
4695 PyErr_SetString(PyExc_OverflowError,
4696 "no printf formatter to display "
4697 "the socket descriptor in decimal");
4698 return NULL;
4699 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004700#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004701 else
4702 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 return PyUnicode_FromFormat(
4704 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004705 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 s->sock_type,
4707 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004708}
4709
4710
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004711/* Create a new, uninitialized socket object. */
4712
4713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004714sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 new = type->tp_alloc(type, 0);
4719 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004720 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004721 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 ((PySocketSockObject *)new)->errorhandler = &set_error;
4723 }
4724 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004725}
4726
4727
4728/* Initialize a new socket object. */
4729
Victor Stinnerdaf45552013-08-28 00:53:59 +02004730#ifdef SOCK_CLOEXEC
4731/* socket() and socketpair() fail with EINVAL on Linux kernel older
4732 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4733static int sock_cloexec_works = -1;
4734#endif
4735
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004736/*ARGSUSED*/
4737static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004738sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 PySocketSockObject *s = (PySocketSockObject *)self;
4741 PyObject *fdobj = NULL;
4742 SOCKET_T fd = INVALID_SOCKET;
4743 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4744 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004745#ifndef MS_WINDOWS
4746#ifdef SOCK_CLOEXEC
4747 int *atomic_flag_works = &sock_cloexec_works;
4748#else
4749 int *atomic_flag_works = NULL;
4750#endif
4751#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4754 "|iiiO:socket", keywords,
4755 &family, &type, &proto, &fdobj))
4756 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004759#ifdef MS_WINDOWS
4760 /* recreate a socket that was duplicated */
4761 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004762 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004763 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4764 PyErr_Format(PyExc_ValueError,
4765 "socket descriptor string has wrong size, "
4766 "should be %zu bytes.", sizeof(info));
4767 return -1;
4768 }
4769 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4770 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004771 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004772 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4773 Py_END_ALLOW_THREADS
4774 if (fd == INVALID_SOCKET) {
4775 set_error();
4776 return -1;
4777 }
4778 family = info.iAddressFamily;
4779 type = info.iSocketType;
4780 proto = info.iProtocol;
4781 }
4782 else
4783#endif
4784 {
4785 fd = PyLong_AsSocket_t(fdobj);
4786 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4787 return -1;
4788 if (fd == INVALID_SOCKET) {
4789 PyErr_SetString(PyExc_ValueError,
4790 "can't use invalid socket value");
4791 return -1;
4792 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 }
4794 }
4795 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004796#ifdef MS_WINDOWS
4797 /* Windows implementation */
4798#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4799#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4800#endif
4801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004803 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004804 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004805 NULL, 0,
4806 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4807 if (fd == INVALID_SOCKET) {
4808 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4809 support_wsa_no_inherit = 0;
4810 fd = socket(family, type, proto);
4811 }
4812 }
4813 else {
4814 fd = socket(family, type, proto);
4815 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 if (fd == INVALID_SOCKET) {
4819 set_error();
4820 return -1;
4821 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004822
4823 if (!support_wsa_no_inherit) {
4824 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4825 closesocket(fd);
4826 PyErr_SetFromWindowsErr(0);
4827 return -1;
4828 }
4829 }
4830#else
4831 /* UNIX */
4832 Py_BEGIN_ALLOW_THREADS
4833#ifdef SOCK_CLOEXEC
4834 if (sock_cloexec_works != 0) {
4835 fd = socket(family, type | SOCK_CLOEXEC, proto);
4836 if (sock_cloexec_works == -1) {
4837 if (fd >= 0) {
4838 sock_cloexec_works = 1;
4839 }
4840 else if (errno == EINVAL) {
4841 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4842 sock_cloexec_works = 0;
4843 fd = socket(family, type, proto);
4844 }
4845 }
4846 }
4847 else
4848#endif
4849 {
4850 fd = socket(family, type, proto);
4851 }
4852 Py_END_ALLOW_THREADS
4853
4854 if (fd == INVALID_SOCKET) {
4855 set_error();
4856 return -1;
4857 }
4858
4859 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4860 SOCKETCLOSE(fd);
4861 return -1;
4862 }
4863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004865 if (init_sockobject(s, fd, family, type, proto) == -1) {
4866 SOCKETCLOSE(fd);
4867 return -1;
4868 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004871
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004872}
4873
4874
Guido van Rossumb6775db1994-08-01 11:34:53 +00004875/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004876
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004877static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4879 "_socket.socket", /* tp_name */
4880 sizeof(PySocketSockObject), /* tp_basicsize */
4881 0, /* tp_itemsize */
4882 (destructor)sock_dealloc, /* tp_dealloc */
4883 0, /* tp_print */
4884 0, /* tp_getattr */
4885 0, /* tp_setattr */
4886 0, /* tp_reserved */
4887 (reprfunc)sock_repr, /* tp_repr */
4888 0, /* tp_as_number */
4889 0, /* tp_as_sequence */
4890 0, /* tp_as_mapping */
4891 0, /* tp_hash */
4892 0, /* tp_call */
4893 0, /* tp_str */
4894 PyObject_GenericGetAttr, /* tp_getattro */
4895 0, /* tp_setattro */
4896 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004897 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4898 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 sock_doc, /* tp_doc */
4900 0, /* tp_traverse */
4901 0, /* tp_clear */
4902 0, /* tp_richcompare */
4903 0, /* tp_weaklistoffset */
4904 0, /* tp_iter */
4905 0, /* tp_iternext */
4906 sock_methods, /* tp_methods */
4907 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004908 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 0, /* tp_base */
4910 0, /* tp_dict */
4911 0, /* tp_descr_get */
4912 0, /* tp_descr_set */
4913 0, /* tp_dictoffset */
4914 sock_initobj, /* tp_init */
4915 PyType_GenericAlloc, /* tp_alloc */
4916 sock_new, /* tp_new */
4917 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004918 0, /* tp_is_gc */
4919 0, /* tp_bases */
4920 0, /* tp_mro */
4921 0, /* tp_cache */
4922 0, /* tp_subclasses */
4923 0, /* tp_weaklist */
4924 0, /* tp_del */
4925 0, /* tp_version_tag */
4926 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004927};
4928
Guido van Rossum30a685f1991-06-27 15:51:29 +00004929
Guido van Rossum81194471991-07-27 21:42:02 +00004930/* Python interface to gethostname(). */
4931
4932/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004933static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004934socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004935{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004936#ifdef MS_WINDOWS
4937 /* Don't use winsock's gethostname, as this returns the ANSI
4938 version of the hostname, whereas we need a Unicode string.
4939 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004940 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004941 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004942 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004943 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004944
4945 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004946 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004947
4948 if (GetLastError() != ERROR_MORE_DATA)
4949 return PyErr_SetFromWindowsErr(0);
4950
4951 if (size == 0)
4952 return PyUnicode_New(0, 0);
4953
4954 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4955 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004956 name = PyMem_New(wchar_t, size);
4957 if (!name) {
4958 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004959 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004960 }
Victor Stinner74168972011-11-17 01:11:36 +01004961 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4962 name,
4963 &size))
4964 {
4965 PyMem_Free(name);
4966 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004967 }
Victor Stinner74168972011-11-17 01:11:36 +01004968
4969 result = PyUnicode_FromWideChar(name, size);
4970 PyMem_Free(name);
4971 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004972#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 char buf[1024];
4974 int res;
4975 Py_BEGIN_ALLOW_THREADS
4976 res = gethostname(buf, (int) sizeof buf - 1);
4977 Py_END_ALLOW_THREADS
4978 if (res < 0)
4979 return set_error();
4980 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004981 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004982#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004983}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004985PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004986"gethostname() -> string\n\
4987\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004988Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004989
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004990#ifdef HAVE_SETHOSTNAME
4991PyDoc_STRVAR(sethostname_doc,
4992"sethostname(name)\n\n\
4993Sets the hostname to name.");
4994
4995static PyObject *
4996socket_sethostname(PyObject *self, PyObject *args)
4997{
4998 PyObject *hnobj;
4999 Py_buffer buf;
5000 int res, flag = 0;
5001
Christian Heimesd2774c72013-06-19 02:06:29 +02005002#ifdef _AIX
5003/* issue #18259, not declared in any useful header file */
5004extern int sethostname(const char *, size_t);
5005#endif
5006
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005007 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5008 PyErr_Clear();
5009 if (!PyArg_ParseTuple(args, "O&:sethostname",
5010 PyUnicode_FSConverter, &hnobj))
5011 return NULL;
5012 flag = 1;
5013 }
5014 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5015 if (!res) {
5016 res = sethostname(buf.buf, buf.len);
5017 PyBuffer_Release(&buf);
5018 }
5019 if (flag)
5020 Py_DECREF(hnobj);
5021 if (res)
5022 return set_error();
5023 Py_RETURN_NONE;
5024}
5025#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005026
Guido van Rossum30a685f1991-06-27 15:51:29 +00005027/* Python interface to gethostbyname(name). */
5028
5029/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005030static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005031socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 char *name;
5034 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005035 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005036
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005037 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 return NULL;
5039 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005040 goto finally;
5041 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5042finally:
5043 PyMem_Free(name);
5044 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005045}
5046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005047PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005048"gethostbyname(host) -> address\n\
5049\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005050Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005051
5052
Victor Stinner72400302016-01-28 15:41:01 +01005053static PyObject*
5054sock_decode_hostname(const char *name)
5055{
5056#ifdef MS_WINDOWS
5057 /* Issue #26227: gethostbyaddr() returns a string encoded
5058 * to the ANSI code page */
5059 return PyUnicode_DecodeFSDefault(name);
5060#else
5061 /* Decode from UTF-8 */
5062 return PyUnicode_FromString(name);
5063#endif
5064}
5065
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005066/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5067
5068static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005069gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 char **pch;
5072 PyObject *rtn_tuple = (PyObject *)NULL;
5073 PyObject *name_list = (PyObject *)NULL;
5074 PyObject *addr_list = (PyObject *)NULL;
5075 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005076 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 if (h == NULL) {
5079 /* Let's get real error message to return */
5080 set_herror(h_errno);
5081 return NULL;
5082 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 if (h->h_addrtype != af) {
5085 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005086 errno = EAFNOSUPPORT;
5087 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 return NULL;
5089 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 case AF_INET:
5094 if (alen < sizeof(struct sockaddr_in))
5095 return NULL;
5096 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005097
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005098#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 case AF_INET6:
5100 if (alen < sizeof(struct sockaddr_in6))
5101 return NULL;
5102 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005103#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 if ((name_list = PyList_New(0)) == NULL)
5108 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 if ((addr_list = PyList_New(0)) == NULL)
5111 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 /* SF #1511317: h_aliases can be NULL */
5114 if (h->h_aliases) {
5115 for (pch = h->h_aliases; *pch != NULL; pch++) {
5116 int status;
5117 tmp = PyUnicode_FromString(*pch);
5118 if (tmp == NULL)
5119 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 status = PyList_Append(name_list, tmp);
5122 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 if (status)
5125 goto err;
5126 }
5127 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5130 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 case AF_INET:
5135 {
5136 struct sockaddr_in sin;
5137 memset(&sin, 0, sizeof(sin));
5138 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005139#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5143 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 if (pch == h->h_addr_list && alen >= sizeof(sin))
5146 memcpy((char *) addr, &sin, sizeof(sin));
5147 break;
5148 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005149
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005150#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 case AF_INET6:
5152 {
5153 struct sockaddr_in6 sin6;
5154 memset(&sin6, 0, sizeof(sin6));
5155 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005156#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5160 tmp = makeipaddr((struct sockaddr *)&sin6,
5161 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5164 memcpy((char *) addr, &sin6, sizeof(sin6));
5165 break;
5166 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005167#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005170 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 "unsupported address family");
5172 return NULL;
5173 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 if (tmp == NULL)
5176 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 status = PyList_Append(addr_list, tmp);
5179 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 if (status)
5182 goto err;
5183 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005184
Victor Stinner72400302016-01-28 15:41:01 +01005185 name = sock_decode_hostname(h->h_name);
5186 if (name == NULL)
5187 goto err;
5188 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005189
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005190 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 Py_XDECREF(name_list);
5192 Py_XDECREF(addr_list);
5193 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005194}
5195
5196
5197/* Python interface to gethostbyname_ex(name). */
5198
5199/*ARGSUSED*/
5200static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005201socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 char *name;
5204 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005205 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005207 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005208#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005210#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005212#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 char buf[16384];
5214 int buf_len = (sizeof buf) - 1;
5215 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005216#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005217#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005219#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005220#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005221
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005222 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005224 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005225 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005227#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005228#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005229 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005231#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005233#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 memset((void *) &data, '\0', sizeof(data));
5235 result = gethostbyname_r(name, &hp_allocated, &data);
5236 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005237#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005238#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005239#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005241#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005242 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005244#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 Py_END_ALLOW_THREADS
5246 /* Some C libraries would require addr.__ss_family instead of
5247 addr.ss_family.
5248 Therefore, we cast the sockaddr_storage into sockaddr to
5249 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005250 sa = SAS2SA(&addr);
5251 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005253#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005255#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005256finally:
5257 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005259}
5260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005261PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005262"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5263\n\
5264Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005265for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005266
5267
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005268/* Python interface to gethostbyaddr(IP). */
5269
5270/*ARGSUSED*/
5271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005272socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005273{
Charles-François Natali8b759652011-12-23 16:44:51 +01005274 sock_addr_t addr;
5275 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 char *ip_num;
5277 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005278 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005279#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005281#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005283#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 /* glibcs up to 2.10 assume that the buf argument to
5285 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5286 does not ensure. The attribute below instructs the compiler
5287 to maintain this alignment. */
5288 char buf[16384] Py_ALIGNED(8);
5289 int buf_len = (sizeof buf) - 1;
5290 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005291#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005292#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005294#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005295#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 char *ap;
5297 int al;
5298 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005299
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005300 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 return NULL;
5302 af = AF_UNSPEC;
5303 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005304 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 af = sa->sa_family;
5306 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005307 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 switch (af) {
5309 case AF_INET:
5310 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5311 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5312 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005313#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 case AF_INET6:
5315 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5316 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5317 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005320 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005321 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 }
5323 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005324#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005325#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005326 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 &hp_allocated, buf, buf_len,
5328 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005329#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 h = gethostbyaddr_r(ap, al, af,
5331 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005332#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 memset((void *) &data, '\0', sizeof(data));
5334 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5335 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005336#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005337#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005338#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005340#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005341 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005343#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005345 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005346#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005348#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005349finally:
5350 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005352}
5353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005354PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005355"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5356\n\
5357Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005358for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005359
Guido van Rossum30a685f1991-06-27 15:51:29 +00005360
5361/* Python interface to getservbyname(name).
5362 This only returns the port number, since the other info is already
5363 known or not useful (like the list of aliases). */
5364
5365/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005366static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005367socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 char *name, *proto=NULL;
5370 struct servent *sp;
5371 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5372 return NULL;
5373 Py_BEGIN_ALLOW_THREADS
5374 sp = getservbyname(name, proto);
5375 Py_END_ALLOW_THREADS
5376 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005377 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 return NULL;
5379 }
5380 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005381}
5382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005383PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005384"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005385\n\
5386Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005387The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5388otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005389
Guido van Rossum30a685f1991-06-27 15:51:29 +00005390
Barry Warsaw11b91a02004-06-28 00:50:43 +00005391/* Python interface to getservbyport(port).
5392 This only returns the service name, since the other info is already
5393 known or not useful (like the list of aliases). */
5394
5395/*ARGSUSED*/
5396static PyObject *
5397socket_getservbyport(PyObject *self, PyObject *args)
5398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 int port;
5400 char *proto=NULL;
5401 struct servent *sp;
5402 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5403 return NULL;
5404 if (port < 0 || port > 0xffff) {
5405 PyErr_SetString(
5406 PyExc_OverflowError,
5407 "getservbyport: port must be 0-65535.");
5408 return NULL;
5409 }
5410 Py_BEGIN_ALLOW_THREADS
5411 sp = getservbyport(htons((short)port), proto);
5412 Py_END_ALLOW_THREADS
5413 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005414 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 return NULL;
5416 }
5417 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005418}
5419
5420PyDoc_STRVAR(getservbyport_doc,
5421"getservbyport(port[, protocolname]) -> string\n\
5422\n\
5423Return the service name from a port number and protocol name.\n\
5424The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5425otherwise any protocol will match.");
5426
Guido van Rossum3901d851996-12-19 16:35:04 +00005427/* Python interface to getprotobyname(name).
5428 This only returns the protocol number, since the other info is
5429 already known or not useful (like the list of aliases). */
5430
5431/*ARGSUSED*/
5432static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005433socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 char *name;
5436 struct protoent *sp;
5437 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5438 return NULL;
5439 Py_BEGIN_ALLOW_THREADS
5440 sp = getprotobyname(name);
5441 Py_END_ALLOW_THREADS
5442 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005443 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 return NULL;
5445 }
5446 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005447}
5448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005449PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005450"getprotobyname(name) -> integer\n\
5451\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005452Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005453
Guido van Rossum3901d851996-12-19 16:35:04 +00005454
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005455#ifndef NO_DUP
5456/* dup() function for socket fds */
5457
5458static PyObject *
5459socket_dup(PyObject *self, PyObject *fdobj)
5460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 SOCKET_T fd, newfd;
5462 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005463#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005464 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005465#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 fd = PyLong_AsSocket_t(fdobj);
5468 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5469 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005470
Victor Stinnerdaf45552013-08-28 00:53:59 +02005471#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005472 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005473 return set_error();
5474
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005475 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005476 FROM_PROTOCOL_INFO,
5477 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 if (newfd == INVALID_SOCKET)
5479 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005480
Victor Stinnerdaf45552013-08-28 00:53:59 +02005481 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5482 closesocket(newfd);
5483 PyErr_SetFromWindowsErr(0);
5484 return NULL;
5485 }
5486#else
5487 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5488 newfd = _Py_dup(fd);
5489 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005490 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005491#endif
5492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 newfdobj = PyLong_FromSocket_t(newfd);
5494 if (newfdobj == NULL)
5495 SOCKETCLOSE(newfd);
5496 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005497}
5498
5499PyDoc_STRVAR(dup_doc,
5500"dup(integer) -> integer\n\
5501\n\
5502Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5503sockets; on some platforms os.dup() won't work for socket file descriptors.");
5504#endif
5505
5506
Dave Cole331708b2004-08-09 04:51:41 +00005507#ifdef HAVE_SOCKETPAIR
5508/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005509 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005510 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005511
5512/*ARGSUSED*/
5513static PyObject *
5514socket_socketpair(PyObject *self, PyObject *args)
5515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 PySocketSockObject *s0 = NULL, *s1 = NULL;
5517 SOCKET_T sv[2];
5518 int family, type = SOCK_STREAM, proto = 0;
5519 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005520#ifdef SOCK_CLOEXEC
5521 int *atomic_flag_works = &sock_cloexec_works;
5522#else
5523 int *atomic_flag_works = NULL;
5524#endif
5525 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005526
5527#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005529#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5533 &family, &type, &proto))
5534 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005537 Py_BEGIN_ALLOW_THREADS
5538#ifdef SOCK_CLOEXEC
5539 if (sock_cloexec_works != 0) {
5540 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5541 if (sock_cloexec_works == -1) {
5542 if (ret >= 0) {
5543 sock_cloexec_works = 1;
5544 }
5545 else if (errno == EINVAL) {
5546 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5547 sock_cloexec_works = 0;
5548 ret = socketpair(family, type, proto, sv);
5549 }
5550 }
5551 }
5552 else
5553#endif
5554 {
5555 ret = socketpair(family, type, proto, sv);
5556 }
5557 Py_END_ALLOW_THREADS
5558
5559 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005561
5562 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5563 goto finally;
5564 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5565 goto finally;
5566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 s0 = new_sockobject(sv[0], family, type, proto);
5568 if (s0 == NULL)
5569 goto finally;
5570 s1 = new_sockobject(sv[1], family, type, proto);
5571 if (s1 == NULL)
5572 goto finally;
5573 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005574
5575finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 if (res == NULL) {
5577 if (s0 == NULL)
5578 SOCKETCLOSE(sv[0]);
5579 if (s1 == NULL)
5580 SOCKETCLOSE(sv[1]);
5581 }
5582 Py_XDECREF(s0);
5583 Py_XDECREF(s1);
5584 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005585}
5586
5587PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005588"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005589\n\
5590Create a pair of socket objects from the sockets returned by the platform\n\
5591socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005592The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005593AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005594
5595#endif /* HAVE_SOCKETPAIR */
5596
5597
Guido van Rossum006bf911996-06-12 04:04:55 +00005598static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005599socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005600{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005601 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005602
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005603 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 return NULL;
5605 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005606 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005608 "ntohs: can't convert negative Python int to C "
5609 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 return NULL;
5611 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005612 if (x > 0xffff) {
5613 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5614 "ntohs: Python int too large to convert to C "
5615 "16-bit unsigned integer (The silent truncation "
5616 "is deprecated)",
5617 1)) {
5618 return NULL;
5619 }
5620 }
5621 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005622}
5623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005624PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005625"ntohs(integer) -> integer\n\
5626\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005627Convert a 16-bit unsigned integer from network to host byte order.\n\
5628Note that in case the received integer does not fit in 16-bit unsigned\n\
5629integer, but does fit in a positive C int, it is silently truncated to\n\
563016-bit unsigned integer.\n\
5631However, this silent truncation feature is deprecated, and will raise an \n\
5632exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005633
5634
Guido van Rossum006bf911996-06-12 04:04:55 +00005635static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005636socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 if (PyLong_Check(arg)) {
5641 x = PyLong_AsUnsignedLong(arg);
5642 if (x == (unsigned long) -1 && PyErr_Occurred())
5643 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005644#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 {
5646 unsigned long y;
5647 /* only want the trailing 32 bits */
5648 y = x & 0xFFFFFFFFUL;
5649 if (y ^ x)
5650 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005651 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 x = y;
5653 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 }
5656 else
5657 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005658 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005661}
5662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005663PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005664"ntohl(integer) -> integer\n\
5665\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005666Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005667
5668
Guido van Rossum006bf911996-06-12 04:04:55 +00005669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005670socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005671{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005672 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005673
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005674 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 return NULL;
5676 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005677 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005679 "htons: can't convert negative Python int to C "
5680 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 return NULL;
5682 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005683 if (x > 0xffff) {
5684 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5685 "htons: Python int too large to convert to C "
5686 "16-bit unsigned integer (The silent truncation "
5687 "is deprecated)",
5688 1)) {
5689 return NULL;
5690 }
5691 }
5692 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005693}
5694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005695PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005696"htons(integer) -> integer\n\
5697\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005698Convert a 16-bit unsigned integer from host to network byte order.\n\
5699Note that in case the received integer does not fit in 16-bit unsigned\n\
5700integer, but does fit in a positive C int, it is silently truncated to\n\
570116-bit unsigned integer.\n\
5702However, this silent truncation feature is deprecated, and will raise an \n\
5703exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005704
5705
Guido van Rossum006bf911996-06-12 04:04:55 +00005706static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005707socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 if (PyLong_Check(arg)) {
5712 x = PyLong_AsUnsignedLong(arg);
5713 if (x == (unsigned long) -1 && PyErr_Occurred())
5714 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005715#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 {
5717 unsigned long y;
5718 /* only want the trailing 32 bits */
5719 y = x & 0xFFFFFFFFUL;
5720 if (y ^ x)
5721 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005722 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 x = y;
5724 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 }
5727 else
5728 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005729 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 Py_TYPE(arg)->tp_name);
5731 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005732}
5733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005734PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005735"htonl(integer) -> integer\n\
5736\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005737Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005738
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005739/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005741PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005742"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005743\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005744Convert 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 +00005745binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005746
5747static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005748socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005749{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005750#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005752#endif
5753
5754#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005755#if (SIZEOF_INT != 4)
5756#error "Not sure if in_addr_t exists and int is not 32-bits."
5757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 /* Have to use inet_addr() instead */
5759 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5764 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005765
Tim Peters1df9fdd2003-02-13 03:13:40 +00005766
5767#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005768
5769#ifdef USE_INET_ATON_WEAKLINK
5770 if (inet_aton != NULL) {
5771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 if (inet_aton(ip_addr, &buf))
5773 return PyBytes_FromStringAndSize((char *)(&buf),
5774 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005775
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005776 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 "illegal IP address string passed to inet_aton");
5778 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005779
Thomas Wouters477c8d52006-05-27 19:21:47 +00005780#ifdef USE_INET_ATON_WEAKLINK
5781 } else {
5782#endif
5783
5784#endif
5785
5786#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 /* special-case this address as inet_addr might return INADDR_NONE
5789 * for this */
5790 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005791 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005793
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005794 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005798 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 "illegal IP address string passed to inet_aton");
5800 return NULL;
5801 }
5802 }
5803 return PyBytes_FromStringAndSize((char *) &packed_addr,
5804 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005805
5806#ifdef USE_INET_ATON_WEAKLINK
5807 }
5808#endif
5809
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005810#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005811}
5812
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005813PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005814"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005815\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005816Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005817
5818static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005819socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005820{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005821 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005823
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005824 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 return NULL;
5826 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005827
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005828 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005829 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005831 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 return NULL;
5833 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005834
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005835 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5836 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005837
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005838 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005840}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005841
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005842#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005843
5844PyDoc_STRVAR(inet_pton_doc,
5845"inet_pton(af, ip) -> packed IP address string\n\
5846\n\
5847Convert an IP address from string format to a packed string suitable\n\
5848for use with low-level network functions.");
5849
5850static PyObject *
5851socket_inet_pton(PyObject *self, PyObject *args)
5852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 int af;
5854 char* ip;
5855 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005856#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005857 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005858#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5862 return NULL;
5863 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005864
Martin v. Löwis04697e82004-06-02 12:35:29 +00005865#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005867 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 "can't use AF_INET6, IPv6 is disabled");
5869 return NULL;
5870 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005871#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 retval = inet_pton(af, ip, packed);
5874 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 return NULL;
5877 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005878 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 "illegal IP address string passed to inet_pton");
5880 return NULL;
5881 } else if (af == AF_INET) {
5882 return PyBytes_FromStringAndSize(packed,
5883 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005884#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 } else if (af == AF_INET6) {
5886 return PyBytes_FromStringAndSize(packed,
5887 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005890 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 return NULL;
5892 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005893}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005894
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005895PyDoc_STRVAR(inet_ntop_doc,
5896"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5897\n\
5898Convert a packed IP address of the given family to string format.");
5899
5900static PyObject *
5901socket_inet_ntop(PyObject *self, PyObject *args)
5902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005904 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005906#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005907 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005908#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005910#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5913 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005914
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005915 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 return NULL;
5917 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005920 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 PyErr_SetString(PyExc_ValueError,
5922 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005923 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 return NULL;
5925 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005926#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005928 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 PyErr_SetString(PyExc_ValueError,
5930 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005931 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 return NULL;
5933 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 } else {
5936 PyErr_Format(PyExc_ValueError,
5937 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005938 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 return NULL;
5940 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005941
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005942 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5943 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005945 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 return NULL;
5947 } else {
5948 return PyUnicode_FromString(retval);
5949 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005950}
5951
5952#endif /* HAVE_INET_PTON */
5953
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005954/* Python interface to getaddrinfo(host, port). */
5955
5956/*ARGSUSED*/
5957static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005958socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005959{
Victor Stinner77af1722011-05-26 14:05:59 +02005960 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005961 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 struct addrinfo hints, *res;
5963 struct addrinfo *res0 = NULL;
5964 PyObject *hobj = NULL;
5965 PyObject *pobj = (PyObject *)NULL;
5966 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005967 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 int family, socktype, protocol, flags;
5969 int error;
5970 PyObject *all = (PyObject *)NULL;
5971 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005972
Georg Brandl6083a4b2013-10-14 06:51:46 +02005973 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005975 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005976 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 &protocol, &flags)) {
5978 return NULL;
5979 }
5980 if (hobj == Py_None) {
5981 hptr = NULL;
5982 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005983 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 if (!idna)
5985 return NULL;
5986 assert(PyBytes_Check(idna));
5987 hptr = PyBytes_AS_STRING(idna);
5988 } else if (PyBytes_Check(hobj)) {
5989 hptr = PyBytes_AsString(hobj);
5990 } else {
5991 PyErr_SetString(PyExc_TypeError,
5992 "getaddrinfo() argument 1 must be string or None");
5993 return NULL;
5994 }
5995 if (PyLong_CheckExact(pobj)) {
5996 long value = PyLong_AsLong(pobj);
5997 if (value == -1 && PyErr_Occurred())
5998 goto err;
5999 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6000 pptr = pbuf;
6001 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006002 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006003 if (pptr == NULL)
6004 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006006 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 } else if (pobj == Py_None) {
6008 pptr = (char *)NULL;
6009 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006010 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 goto err;
6012 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006013#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006014 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6015 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006016 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6017 * This workaround avoids a segfault in libsystem.
6018 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006019 pptr = "00";
6020 }
6021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 memset(&hints, 0, sizeof(hints));
6023 hints.ai_family = family;
6024 hints.ai_socktype = socktype;
6025 hints.ai_protocol = protocol;
6026 hints.ai_flags = flags;
6027 Py_BEGIN_ALLOW_THREADS
6028 ACQUIRE_GETADDRINFO_LOCK
6029 error = getaddrinfo(hptr, pptr, &hints, &res0);
6030 Py_END_ALLOW_THREADS
6031 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6032 if (error) {
6033 set_gaierror(error);
6034 goto err;
6035 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006036
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006037 all = PyList_New(0);
6038 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 goto err;
6040 for (res = res0; res; res = res->ai_next) {
6041 PyObject *single;
6042 PyObject *addr =
6043 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6044 if (addr == NULL)
6045 goto err;
6046 single = Py_BuildValue("iiisO", res->ai_family,
6047 res->ai_socktype, res->ai_protocol,
6048 res->ai_canonname ? res->ai_canonname : "",
6049 addr);
6050 Py_DECREF(addr);
6051 if (single == NULL)
6052 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 if (PyList_Append(all, single))
6055 goto err;
6056 Py_XDECREF(single);
6057 }
6058 Py_XDECREF(idna);
6059 if (res0)
6060 freeaddrinfo(res0);
6061 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006062 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 Py_XDECREF(all);
6064 Py_XDECREF(idna);
6065 if (res0)
6066 freeaddrinfo(res0);
6067 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006068}
6069
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006070PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006071"getaddrinfo(host, port [, family, type, proto, flags])\n\
6072 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006073\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006074Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006075
6076/* Python interface to getnameinfo(sa, flags). */
6077
6078/*ARGSUSED*/
6079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006080socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 PyObject *sa = (PyObject *)NULL;
6083 int flags;
6084 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006085 int port;
6086 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6088 struct addrinfo hints, *res = NULL;
6089 int error;
6090 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006091 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 flags = flowinfo = scope_id = 0;
6094 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6095 return NULL;
6096 if (!PyTuple_Check(sa)) {
6097 PyErr_SetString(PyExc_TypeError,
6098 "getnameinfo() argument 1 must be a tuple");
6099 return NULL;
6100 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006101 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006103 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006105 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006106 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006107 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006108 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006109 return NULL;
6110 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6112 memset(&hints, 0, sizeof(hints));
6113 hints.ai_family = AF_UNSPEC;
6114 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006115 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 Py_BEGIN_ALLOW_THREADS
6117 ACQUIRE_GETADDRINFO_LOCK
6118 error = getaddrinfo(hostp, pbuf, &hints, &res);
6119 Py_END_ALLOW_THREADS
6120 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6121 if (error) {
6122 set_gaierror(error);
6123 goto fail;
6124 }
6125 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006126 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127 "sockaddr resolved to multiple addresses");
6128 goto fail;
6129 }
6130 switch (res->ai_family) {
6131 case AF_INET:
6132 {
6133 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006134 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 "IPv4 sockaddr must be 2 tuple");
6136 goto fail;
6137 }
6138 break;
6139 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006140#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 case AF_INET6:
6142 {
6143 struct sockaddr_in6 *sin6;
6144 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006145 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 sin6->sin6_scope_id = scope_id;
6147 break;
6148 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006151 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6153 if (error) {
6154 set_gaierror(error);
6155 goto fail;
6156 }
Victor Stinner72400302016-01-28 15:41:01 +01006157
6158 name = sock_decode_hostname(hbuf);
6159 if (name == NULL)
6160 goto fail;
6161 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006162
6163fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 if (res)
6165 freeaddrinfo(res);
6166 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006167}
6168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006169PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006170"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006171\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006172Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006173
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006174
6175/* Python API to getting and setting the default timeout value. */
6176
6177static PyObject *
6178socket_getdefaulttimeout(PyObject *self)
6179{
Victor Stinner71694d52015-03-28 01:18:54 +01006180 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006181 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 }
Victor Stinner71694d52015-03-28 01:18:54 +01006183 else {
6184 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6185 return PyFloat_FromDouble(seconds);
6186 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006187}
6188
6189PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006190"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006191\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006192Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006193A value of None indicates that new socket objects have no timeout.\n\
6194When the socket module is first imported, the default is None.");
6195
6196static PyObject *
6197socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6198{
Victor Stinner71694d52015-03-28 01:18:54 +01006199 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006200
Victor Stinner71694d52015-03-28 01:18:54 +01006201 if (socket_parse_timeout(&timeout, arg) < 0)
6202 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006205
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006206 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006207}
6208
6209PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006210"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006211\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006212Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006213A value of None indicates that new socket objects have no timeout.\n\
6214When the socket module is first imported, the default is None.");
6215
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006216#ifdef HAVE_IF_NAMEINDEX
6217/* Python API for getting interface indices and names */
6218
6219static PyObject *
6220socket_if_nameindex(PyObject *self, PyObject *arg)
6221{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006222 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006223 int i;
6224 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006225
Charles-François Natali60713592011-05-20 16:55:06 +02006226 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006227 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006228 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006229 return NULL;
6230 }
6231
6232 list = PyList_New(0);
6233 if (list == NULL) {
6234 if_freenameindex(ni);
6235 return NULL;
6236 }
6237
Charles-François Natali60713592011-05-20 16:55:06 +02006238 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6239 PyObject *ni_tuple = Py_BuildValue("IO&",
6240 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006241
6242 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6243 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006244 Py_DECREF(list);
6245 if_freenameindex(ni);
6246 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006247 }
6248 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006249 }
6250
6251 if_freenameindex(ni);
6252 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006253}
6254
6255PyDoc_STRVAR(if_nameindex_doc,
6256"if_nameindex()\n\
6257\n\
6258Returns a list of network interface information (index, name) tuples.");
6259
Charles-François Natali60713592011-05-20 16:55:06 +02006260static PyObject *
6261socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006262{
Charles-François Natali60713592011-05-20 16:55:06 +02006263 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006264 unsigned long index;
6265
Charles-François Natali60713592011-05-20 16:55:06 +02006266 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6267 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006268 return NULL;
6269
Charles-François Natali60713592011-05-20 16:55:06 +02006270 index = if_nametoindex(PyBytes_AS_STRING(oname));
6271 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006272 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006273 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006274 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006275 return NULL;
6276 }
6277
6278 return PyLong_FromUnsignedLong(index);
6279}
6280
6281PyDoc_STRVAR(if_nametoindex_doc,
6282"if_nametoindex(if_name)\n\
6283\n\
6284Returns the interface index corresponding to the interface name if_name.");
6285
Charles-François Natali60713592011-05-20 16:55:06 +02006286static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006287socket_if_indextoname(PyObject *self, PyObject *arg)
6288{
Charles-François Natali60713592011-05-20 16:55:06 +02006289 unsigned long index;
6290 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006291
Charles-François Natali60713592011-05-20 16:55:06 +02006292 index = PyLong_AsUnsignedLong(arg);
6293 if (index == (unsigned long) -1)
6294 return NULL;
6295
6296 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006297 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006298 return NULL;
6299 }
6300
Charles-François Natali60713592011-05-20 16:55:06 +02006301 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006302}
6303
6304PyDoc_STRVAR(if_indextoname_doc,
6305"if_indextoname(if_index)\n\
6306\n\
6307Returns the interface name corresponding to the interface index if_index.");
6308
6309#endif /* HAVE_IF_NAMEINDEX */
6310
6311
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006312#ifdef CMSG_LEN
6313/* Python interface to CMSG_LEN(length). */
6314
6315static PyObject *
6316socket_CMSG_LEN(PyObject *self, PyObject *args)
6317{
6318 Py_ssize_t length;
6319 size_t result;
6320
6321 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6322 return NULL;
6323 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6324 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6325 return NULL;
6326 }
6327 return PyLong_FromSize_t(result);
6328}
6329
6330PyDoc_STRVAR(CMSG_LEN_doc,
6331"CMSG_LEN(length) -> control message length\n\
6332\n\
6333Return the total length, without trailing padding, of an ancillary\n\
6334data item with associated data of the given length. This value can\n\
6335often be used as the buffer size for recvmsg() to receive a single\n\
6336item of ancillary data, but RFC 3542 requires portable applications to\n\
6337use CMSG_SPACE() and thus include space for padding, even when the\n\
6338item will be the last in the buffer. Raises OverflowError if length\n\
6339is outside the permissible range of values.");
6340
6341
6342#ifdef CMSG_SPACE
6343/* Python interface to CMSG_SPACE(length). */
6344
6345static PyObject *
6346socket_CMSG_SPACE(PyObject *self, PyObject *args)
6347{
6348 Py_ssize_t length;
6349 size_t result;
6350
6351 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6352 return NULL;
6353 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6354 PyErr_SetString(PyExc_OverflowError,
6355 "CMSG_SPACE() argument out of range");
6356 return NULL;
6357 }
6358 return PyLong_FromSize_t(result);
6359}
6360
6361PyDoc_STRVAR(CMSG_SPACE_doc,
6362"CMSG_SPACE(length) -> buffer size\n\
6363\n\
6364Return the buffer size needed for recvmsg() to receive an ancillary\n\
6365data item with associated data of the given length, along with any\n\
6366trailing padding. The buffer space needed to receive multiple items\n\
6367is the sum of the CMSG_SPACE() values for their associated data\n\
6368lengths. Raises OverflowError if length is outside the permissible\n\
6369range of values.");
6370#endif /* CMSG_SPACE */
6371#endif /* CMSG_LEN */
6372
6373
Guido van Rossum30a685f1991-06-27 15:51:29 +00006374/* List of functions exported by this module. */
6375
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006376static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 {"gethostbyname", socket_gethostbyname,
6378 METH_VARARGS, gethostbyname_doc},
6379 {"gethostbyname_ex", socket_gethostbyname_ex,
6380 METH_VARARGS, ghbn_ex_doc},
6381 {"gethostbyaddr", socket_gethostbyaddr,
6382 METH_VARARGS, gethostbyaddr_doc},
6383 {"gethostname", socket_gethostname,
6384 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006385#ifdef HAVE_SETHOSTNAME
6386 {"sethostname", socket_sethostname,
6387 METH_VARARGS, sethostname_doc},
6388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 {"getservbyname", socket_getservbyname,
6390 METH_VARARGS, getservbyname_doc},
6391 {"getservbyport", socket_getservbyport,
6392 METH_VARARGS, getservbyport_doc},
6393 {"getprotobyname", socket_getprotobyname,
6394 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006395#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 {"dup", socket_dup,
6397 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006398#endif
Dave Cole331708b2004-08-09 04:51:41 +00006399#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 {"socketpair", socket_socketpair,
6401 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 {"ntohs", socket_ntohs,
6404 METH_VARARGS, ntohs_doc},
6405 {"ntohl", socket_ntohl,
6406 METH_O, ntohl_doc},
6407 {"htons", socket_htons,
6408 METH_VARARGS, htons_doc},
6409 {"htonl", socket_htonl,
6410 METH_O, htonl_doc},
6411 {"inet_aton", socket_inet_aton,
6412 METH_VARARGS, inet_aton_doc},
6413 {"inet_ntoa", socket_inet_ntoa,
6414 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006415#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 {"inet_pton", socket_inet_pton,
6417 METH_VARARGS, inet_pton_doc},
6418 {"inet_ntop", socket_inet_ntop,
6419 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006420#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006421 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6422 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 {"getnameinfo", socket_getnameinfo,
6424 METH_VARARGS, getnameinfo_doc},
6425 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6426 METH_NOARGS, getdefaulttimeout_doc},
6427 {"setdefaulttimeout", socket_setdefaulttimeout,
6428 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006429#ifdef HAVE_IF_NAMEINDEX
6430 {"if_nameindex", socket_if_nameindex,
6431 METH_NOARGS, if_nameindex_doc},
6432 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006433 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006434 {"if_indextoname", socket_if_indextoname,
6435 METH_O, if_indextoname_doc},
6436#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006437#ifdef CMSG_LEN
6438 {"CMSG_LEN", socket_CMSG_LEN,
6439 METH_VARARGS, CMSG_LEN_doc},
6440#ifdef CMSG_SPACE
6441 {"CMSG_SPACE", socket_CMSG_SPACE,
6442 METH_VARARGS, CMSG_SPACE_doc},
6443#endif
6444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006446};
6447
Guido van Rossum30a685f1991-06-27 15:51:29 +00006448
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006449#ifdef MS_WINDOWS
6450#define OS_INIT_DEFINED
6451
6452/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006453
6454static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006455os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006458}
6459
6460static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006461os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 WSADATA WSAData;
6464 int ret;
6465 ret = WSAStartup(0x0101, &WSAData);
6466 switch (ret) {
6467 case 0: /* No error */
6468 Py_AtExit(os_cleanup);
6469 return 1; /* Success */
6470 case WSASYSNOTREADY:
6471 PyErr_SetString(PyExc_ImportError,
6472 "WSAStartup failed: network not ready");
6473 break;
6474 case WSAVERNOTSUPPORTED:
6475 case WSAEINVAL:
6476 PyErr_SetString(
6477 PyExc_ImportError,
6478 "WSAStartup failed: requested version not supported");
6479 break;
6480 default:
6481 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6482 break;
6483 }
6484 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006485}
6486
Guido van Rossum8d665e61996-06-26 18:22:49 +00006487#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006488
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006489
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006490
6491#ifndef OS_INIT_DEFINED
6492static int
6493os_init(void)
6494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006496}
6497#endif
6498
6499
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006500/* C API table - always add new things to the end for binary
6501 compatibility. */
6502static
6503PySocketModule_APIObject PySocketModuleAPI =
6504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006506 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006508};
6509
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006511/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006512
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006513 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006514 "socket.py" which implements some additional functionality.
6515 The import of "_socket" may fail with an ImportError exception if
6516 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006517 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006518 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006519*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006521PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006522"Implementation module for socket operations.\n\
6523\n\
6524See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006525
Martin v. Löwis1a214512008-06-11 05:26:20 +00006526static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 PyModuleDef_HEAD_INIT,
6528 PySocket_MODULE_NAME,
6529 socket_doc,
6530 -1,
6531 socket_methods,
6532 NULL,
6533 NULL,
6534 NULL,
6535 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006536};
6537
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006538PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006539PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 if (!os_init())
6544 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006545
Victor Stinnerdaf45552013-08-28 00:53:59 +02006546#ifdef MS_WINDOWS
6547 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006548#if defined(_MSC_VER) && _MSC_VER >= 1800
6549 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6550#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006551 DWORD version = GetVersion();
6552 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6553 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6554 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006555 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6556#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006557 }
6558#endif
6559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 Py_TYPE(&sock_type) = &PyType_Type;
6561 m = PyModule_Create(&socketmodule);
6562 if (m == NULL)
6563 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006564
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006565 Py_INCREF(PyExc_OSError);
6566 PySocketModuleAPI.error = PyExc_OSError;
6567 Py_INCREF(PyExc_OSError);
6568 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006570 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 if (socket_herror == NULL)
6572 return NULL;
6573 Py_INCREF(socket_herror);
6574 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006575 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576 NULL);
6577 if (socket_gaierror == NULL)
6578 return NULL;
6579 Py_INCREF(socket_gaierror);
6580 PyModule_AddObject(m, "gaierror", socket_gaierror);
6581 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006582 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 if (socket_timeout == NULL)
6584 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006585 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 Py_INCREF(socket_timeout);
6587 PyModule_AddObject(m, "timeout", socket_timeout);
6588 Py_INCREF((PyObject *)&sock_type);
6589 if (PyModule_AddObject(m, "SocketType",
6590 (PyObject *)&sock_type) != 0)
6591 return NULL;
6592 Py_INCREF((PyObject *)&sock_type);
6593 if (PyModule_AddObject(m, "socket",
6594 (PyObject *)&sock_type) != 0)
6595 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006596
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006597#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006599#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 Py_INCREF(has_ipv6);
6603 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 /* Export C API */
6606 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6607 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6608 ) != 0)
6609 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006612#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006614#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006616#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006618#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006619#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006622#endif
6623#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006625#endif
6626#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006629#endif
6630#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006633#endif
6634#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006637#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006638#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006641#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006642#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006646#ifdef HAVE_SOCKADDR_ALG
6647 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6648#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006652#endif
6653#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006655#endif
6656#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006659#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006660#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006663#endif
6664#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006667#endif
6668#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006671#endif
6672#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006675#endif
6676#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, AF_NETLINK);
6679 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006680#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006682#endif
6683#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006685#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6687 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006688#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006690#endif
6691#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006693#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006694#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006696#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006697#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006699#endif
6700#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006702#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006704#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006706#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006707#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006709#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006710#ifdef NETLINK_CRYPTO
6711 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6712#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006713#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006714
6715#ifdef AF_VSOCK
6716 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6717 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6718 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6719 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6720 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6721 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6722 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6723 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6724 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6725#endif
6726
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006727#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006730#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006731#ifdef AF_LINK
6732 PyModule_AddIntMacro(m, AF_LINK);
6733#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006734#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#endif
6738#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006741#endif
6742#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006744 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006745#endif
6746#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006749#endif
6750#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006753#endif
6754#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006757#endif
6758#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006761#endif
6762#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006765#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006766
Hye-Shik Chang81268602004-02-02 06:05:24 +00006767#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6769 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6770 PyModule_AddIntMacro(m, BTPROTO_HCI);
6771 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006772#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006774#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006775#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006776#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006778#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6780 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006781#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6784 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006785#endif
6786
Charles-François Natali47413c12011-10-06 19:47:44 +02006787#ifdef AF_CAN
6788 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006790#endif
6791#ifdef PF_CAN
6792 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006794#endif
6795
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006796/* Reliable Datagram Sockets */
6797#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006799#endif
6800#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006802#endif
6803
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006804/* Kernel event messages */
6805#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006807#endif
6808#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006810#endif
6811
Antoine Pitroub156a462010-10-27 20:13:57 +00006812#ifdef AF_PACKET
6813 PyModule_AddIntMacro(m, AF_PACKET);
6814#endif
6815#ifdef PF_PACKET
6816 PyModule_AddIntMacro(m, PF_PACKET);
6817#endif
6818#ifdef PACKET_HOST
6819 PyModule_AddIntMacro(m, PACKET_HOST);
6820#endif
6821#ifdef PACKET_BROADCAST
6822 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6823#endif
6824#ifdef PACKET_MULTICAST
6825 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6826#endif
6827#ifdef PACKET_OTHERHOST
6828 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6829#endif
6830#ifdef PACKET_OUTGOING
6831 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6832#endif
6833#ifdef PACKET_LOOPBACK
6834 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6835#endif
6836#ifdef PACKET_FASTROUTE
6837 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006838#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006839
Christian Heimes043d6f62008-01-07 17:19:16 +00006840#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6845 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6846 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006847
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6849 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6850 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, SOL_TIPC);
6854 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6855 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6856 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6857 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006858
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6860 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6861 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6862 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6866 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006867#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006870#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6872 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6873 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6874 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6875 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6876 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006877#endif
6878
Christian Heimesdffa3942016-09-05 23:54:41 +02006879#ifdef HAVE_SOCKADDR_ALG
6880 /* Socket options */
6881 PyModule_AddIntMacro(m, ALG_SET_KEY);
6882 PyModule_AddIntMacro(m, ALG_SET_IV);
6883 PyModule_AddIntMacro(m, ALG_SET_OP);
6884 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6885 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6886 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6887
6888 /* Operations */
6889 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6890 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6891 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6892 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6893#endif
6894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, SOCK_STREAM);
6897 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006898/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006899#ifdef SOCK_RAW
6900 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006902#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006904#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006906#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006907#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006909#endif
6910#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006912#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006914#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006922#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006923#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006925#endif
6926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006945#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006976#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006977#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006979#endif
6980#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006982#endif
6983#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006985#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006986#ifdef SO_PASSSEC
6987 PyModule_AddIntMacro(m, SO_PASSSEC);
6988#endif
6989#ifdef SO_PEERSEC
6990 PyModule_AddIntMacro(m, SO_PEERSEC);
6991#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006992#ifdef SO_BINDTODEVICE
6993 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6994#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006995#ifdef SO_PRIORITY
6996 PyModule_AddIntMacro(m, SO_PRIORITY);
6997#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006998#ifdef SO_MARK
6999 PyModule_AddIntMacro(m, SO_MARK);
7000#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007001#ifdef SO_DOMAIN
7002 PyModule_AddIntMacro(m, SO_DOMAIN);
7003#endif
7004#ifdef SO_PROTOCOL
7005 PyModule_AddIntMacro(m, SO_PROTOCOL);
7006#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008 /* Maximum number of connections for "listen" */
7009#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007012 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007013#endif
7014
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007015 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007016#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007017 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007018#endif
7019#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007021#endif
7022#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007024#endif
7025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007026 /* Flags for send, recv */
7027#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007045#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007056#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007057#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007059#endif
7060#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007062#endif
7063#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007065#endif
7066#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007068#endif
7069#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007071#endif
7072#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007074#endif
7075#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007077#endif
7078#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007080#endif
7081#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007083#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007084#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007086#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 /* Protocol level and numbers, usable for [gs]etsockopt */
7089#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007094#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007096#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007103#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007109#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007122#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007124#endif
7125#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7127 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007128#endif
7129#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7131 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7132 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007133
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7135 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7136 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007137#ifdef CAN_ISOTP
7138 PyModule_AddIntMacro(m, CAN_ISOTP);
7139#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007140#endif
7141#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7143 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7144 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7145 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007146#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007147#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7148 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7149#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007150#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007151 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007152 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7153 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7154 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7155 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7156 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7157 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7158 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7159 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7160 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7161 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7162 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7163 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7164#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007165#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007167#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007168#ifdef HAVE_SOCKADDR_ALG
7169 PyModule_AddIntMacro(m, SOL_ALG);
7170#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007171#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007173#endif
7174#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007176#endif
7177#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007179#endif
7180#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007182#endif
7183#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007185#endif
7186#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007191#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007194#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007199#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007219#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007230#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007284#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007289#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007290#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007295#endif
7296/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007299#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007304#endif
7305
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007306#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007308#endif
7309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 /* Some port configuration */
7311#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007318#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007319 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#endif
7321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322 /* Some reserved IP v.4 addresses */
7323#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007330#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007340#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343#ifdef INADDR_ALLHOSTS_GROUP
7344 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7345 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007346#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007351#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007356#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007358#endif
7359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360 /* IPv4 [gs]etsockopt options */
7361#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007376#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007379#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007382#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007385#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007391#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007394#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007408#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007409#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007411#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007413 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7414#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007417#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007433#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007437#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007439#endif
7440#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007442#endif
7443#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007445#endif
7446#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007448#endif
7449#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007451#endif
7452#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007454#endif
7455#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007457#endif
7458#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007460#endif
7461#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007463#endif
7464#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007466#endif
7467#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007469#endif
7470#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007472#endif
7473#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007475#endif
7476#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007478#endif
7479#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007481#endif
7482#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007484#endif
7485#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007487#endif
7488#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007490#endif
7491#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007493#endif
7494#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007496#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498 /* TCP options */
7499#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007508#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007534#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007535#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007537#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007538#ifdef TCP_CONGESTION
7539 PyModule_AddIntMacro(m, TCP_CONGESTION);
7540#endif
7541#ifdef TCP_USER_TIMEOUT
7542 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7543#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007544#ifdef TCP_NOTSENT_LOWAT
7545 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7546#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548 /* IPX options */
7549#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007551#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007552
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007553/* Reliable Datagram Sockets */
7554#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007556#endif
7557#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007558 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007559#endif
7560#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007562#endif
7563#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007565#endif
7566#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007568#endif
7569#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007571#endif
7572#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007574#endif
7575#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007577#endif
7578#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007580#endif
7581#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007583#endif
7584#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007586#endif
7587#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007589#endif
7590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007592#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007594#endif
7595#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007597#endif
7598#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007600#endif
7601#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007603#endif
7604#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007606#endif
7607#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007609#endif
7610#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007612#endif
7613#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007615#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007616#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007618#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007621#endif
7622#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007624#endif
7625#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007627#endif
7628#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007630#endif
7631#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007633#endif
7634#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007636#endif
7637#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007639#endif
7640#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007642#endif
7643#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007645#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007646#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007648#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007651#endif
7652#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007654#endif
7655#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007657#endif
7658#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007660#endif
7661#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007663#endif
7664#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007666#endif
7667#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007669#endif
7670#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007672#endif
7673#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007675#endif
7676#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007678#endif
7679#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007681#endif
7682#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007684#endif
7685#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007687#endif
7688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007689 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007690#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007692#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007694#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007695 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007696#endif
7697#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007699#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007701#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007703#endif
7704#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007708#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007710#endif
7711
Christian Heimesfaf2f632008-01-06 16:59:19 +00007712#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007713 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007714 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7715#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007716 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007717#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007718 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007719 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7720#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007721 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007722#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007723 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007725 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726 PyObject *tmp;
7727 tmp = PyLong_FromUnsignedLong(codes[i]);
7728 if (tmp == NULL)
7729 return NULL;
7730 PyModule_AddObject(m, names[i], tmp);
7731 }
7732 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, RCVALL_OFF);
7734 PyModule_AddIntMacro(m, RCVALL_ON);
7735 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007736#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007737 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007738#endif
7739#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007740 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007741#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007742#endif /* _MSTCPIP_ */
7743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007745#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007749}