blob: 0758f9bd4099c19fa44b46482e9000848277ce9f [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:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627
Yury Selivanovfa22b292016-10-18 16:03:52 -0400628 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200629#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400630 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200631#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400632 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200633#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400634 }
635
636 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000637}
638
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000639static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200640internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
641 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100644#ifdef HAVE_POLL
645 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200646 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100647#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200648 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200649 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100650#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000651
Victor Stinnerb7df3142015-03-27 22:59:32 +0100652 /* must be called with the GIL held */
653 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100654
Victor Stinner416f2e62015-03-31 13:56:29 +0200655 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200656 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200659 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 /* Prefer poll, if available, since you can poll() any fd
663 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000664#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100665 pollfd.fd = s->sock_fd;
666 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200667 if (connect) {
668 /* On Windows, the socket becomes writable on connection success,
669 but a connection failure is notified as an error. On POSIX, the
670 socket becomes writable on connection success or on connection
671 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200672 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200673 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674
Victor Stinner71694d52015-03-28 01:18:54 +0100675 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200676 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200677 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678
Victor Stinner71694d52015-03-28 01:18:54 +0100679 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200680 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100681 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000682#else
Victor Stinnerced11742015-04-09 10:27:25 +0200683 if (interval >= 0) {
684 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
685 tvp = &tv;
686 }
687 else
688 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689
Victor Stinner71694d52015-03-28 01:18:54 +0100690 FD_ZERO(&fds);
691 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200693 if (connect) {
694 /* On Windows, the socket becomes writable on connection success,
695 but a connection failure is notified as an error. On POSIX, the
696 socket becomes writable on connection success or on connection
697 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200698 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200699 }
Victor Stinner71694d52015-03-28 01:18:54 +0100700
701 /* See if the socket is ready */
702 Py_BEGIN_ALLOW_THREADS;
703 if (writing)
704 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200705 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100706 else
707 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200708 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100709 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 if (n < 0)
713 return -1;
714 if (n == 0)
715 return 1;
716 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000717}
718
Victor Stinner31bf2d52015-04-01 21:57:09 +0200719/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000720
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 On error, raise an exception and return -1 if err is set, or fill err and
722 return -1 otherwise. If a signal was received and the signal handler raised
723 an exception, return -1, and set err to -1 if err is set.
724
725 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100726
Victor Stinner31bf2d52015-04-01 21:57:09 +0200727 If the socket has a timeout, wait until the socket is ready before calling
728 the function: wait until the socket is writable if writing is nonzero, wait
729 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100730
Victor Stinner81c41db2015-04-02 11:50:57 +0200731 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200732 the function, except if the signal handler raised an exception (PEP 475).
733
734 When the function is retried, recompute the timeout using a monotonic clock.
735
Victor Stinner81c41db2015-04-02 11:50:57 +0200736 sock_call_ex() must be called with the GIL held. The socket function is
737 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200739sock_call_ex(PySocketSockObject *s,
740 int writing,
741 int (*sock_func) (PySocketSockObject *s, void *data),
742 void *data,
743 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200744 int *err,
745 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200746{
Victor Stinner8912d142015-04-06 23:16:34 +0200747 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200748 _PyTime_t deadline = 0;
749 int deadline_initialized = 0;
750 int res;
751
752 /* sock_call() must be called with the GIL held. */
753 assert(PyGILState_Check());
754
755 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200756 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 /* For connect(), poll even for blocking socket. The connection
759 runs asynchronously. */
760 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200761 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200762 _PyTime_t interval;
763
Victor Stinner81c41db2015-04-02 11:50:57 +0200764 if (deadline_initialized) {
765 /* recompute the timeout */
766 interval = deadline - _PyTime_GetMonotonicClock();
767 }
768 else {
769 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200770 deadline = _PyTime_GetMonotonicClock() + timeout;
771 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200772 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773
Victor Stinner10550cd2015-04-03 13:22:27 +0200774 if (interval >= 0)
775 res = internal_select(s, writing, interval, connect);
776 else
777 res = 1;
778 }
779 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200780 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200781 }
782
Victor Stinner31bf2d52015-04-01 21:57:09 +0200783 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200784 if (err)
785 *err = GET_SOCK_ERROR;
786
Victor Stinner31bf2d52015-04-01 21:57:09 +0200787 if (CHECK_ERRNO(EINTR)) {
788 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200789 if (PyErr_CheckSignals()) {
790 if (err)
791 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200794
795 /* retry select() */
796 continue;
797 }
798
799 /* select() failed */
800 s->errorhandler();
801 return -1;
802 }
803
804 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200805 if (err)
806 *err = SOCK_TIMEOUT_ERR;
807 else
808 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200809 return -1;
810 }
811
812 /* the socket is ready */
813 }
814
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 /* inner loop to retry sock_func() when sock_func() is interrupted
816 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200817 while (1) {
818 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200819 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820 Py_END_ALLOW_THREADS
821
822 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 /* sock_func() succeeded */
824 if (err)
825 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826 return 0;
827 }
828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 if (err)
830 *err = GET_SOCK_ERROR;
831
Victor Stinner31bf2d52015-04-01 21:57:09 +0200832 if (!CHECK_ERRNO(EINTR))
833 break;
834
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 /* sock_func() was interrupted by a signal */
836 if (PyErr_CheckSignals()) {
837 if (err)
838 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200841
Victor Stinner81c41db2015-04-02 11:50:57 +0200842 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200843 }
844
845 if (s->sock_timeout > 0
846 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200847 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848
849 For example, select() could indicate a socket is ready for
850 reading, but the data then discarded by the OS because of a
851 wrong checksum.
852
853 Loop on select() to recheck for socket readyness. */
854 continue;
855 }
856
Victor Stinner81c41db2015-04-02 11:50:57 +0200857 /* sock_func() failed */
858 if (!err)
859 s->errorhandler();
860 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000861 return -1;
862 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200863}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000864
Victor Stinner81c41db2015-04-02 11:50:57 +0200865static int
866sock_call(PySocketSockObject *s,
867 int writing,
868 int (*func) (PySocketSockObject *s, void *data),
869 void *data)
870{
Victor Stinner8912d142015-04-06 23:16:34 +0200871 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200872}
873
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000874
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000875/* Initialize a new socket object. */
876
Victor Stinner88ed6402015-04-09 10:23:12 +0200877/* Default timeout for new sockets */
878static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000879
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200880static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000881init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 s->sock_fd = fd;
885 s->sock_family = family;
886 s->sock_type = type;
887 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000890#ifdef SOCK_NONBLOCK
891 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100892 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000893 else
894#endif
895 {
896 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200897 if (defaulttimeout >= 0) {
898 if (internal_setblocking(s, 0) == -1) {
899 return -1;
900 }
901 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000902 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200903 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000904}
905
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907/* Create a new socket object.
908 This just creates the object and initializes it.
909 If the creation fails, return NULL and set an exception (implicit
910 in NEWOBJ()). */
911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000913new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PySocketSockObject *s;
916 s = (PySocketSockObject *)
917 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200918 if (s == NULL)
919 return NULL;
920 if (init_sockobject(s, fd, family, type, proto) == -1) {
921 Py_DECREF(s);
922 return NULL;
923 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925}
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927
Guido van Rossum48a680c2001-03-02 06:34:14 +0000928/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000929 thread to be in gethostbyname or getaddrinfo */
930#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200931static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000932#endif
933
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935/* Convert a string specifying a host name or one of a few symbolic
936 names to a numeric IP address. This usually calls gethostbyname()
937 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000938 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939 an error occurred; then an exception is raised. */
940
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200942setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 struct addrinfo hints, *res;
945 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
948 if (name[0] == '\0') {
949 int siz;
950 memset(&hints, 0, sizeof(hints));
951 hints.ai_family = af;
952 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
953 hints.ai_flags = AI_PASSIVE;
954 Py_BEGIN_ALLOW_THREADS
955 ACQUIRE_GETADDRINFO_LOCK
956 error = getaddrinfo(NULL, "0", &hints, &res);
957 Py_END_ALLOW_THREADS
958 /* We assume that those thread-unsafe getaddrinfo() versions
959 *are* safe regarding their return value, ie. that a
960 subsequent call to getaddrinfo() does not destroy the
961 outcome of the first call. */
962 RELEASE_GETADDRINFO_LOCK
963 if (error) {
964 set_gaierror(error);
965 return -1;
966 }
967 switch (res->ai_family) {
968 case AF_INET:
969 siz = 4;
970 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000971#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case AF_INET6:
973 siz = 16;
974 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 default:
977 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200978 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 "unsupported address family");
980 return -1;
981 }
982 if (res->ai_next) {
983 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200984 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 "wildcard resolved to multiple address");
986 return -1;
987 }
988 if (res->ai_addrlen < addr_ret_size)
989 addr_ret_size = res->ai_addrlen;
990 memcpy(addr_ret, res->ai_addr, addr_ret_size);
991 freeaddrinfo(res);
992 return siz;
993 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200994 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100995 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200996 if (strcmp(name, "255.255.255.255") == 0 ||
997 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 struct sockaddr_in *sin;
999 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001000 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 "address family mismatched");
1002 return -1;
1003 }
1004 sin = (struct sockaddr_in *)addr_ret;
1005 memset((void *) sin, '\0', sizeof(*sin));
1006 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001007#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 sin->sin_addr.s_addr = INADDR_BROADCAST;
1011 return sizeof(sin->sin_addr);
1012 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001013
1014 /* avoid a name resolution in case of numeric address */
1015#ifdef HAVE_INET_PTON
1016 /* check for an IPv4 address */
1017 if (af == AF_UNSPEC || af == AF_INET) {
1018 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1019 memset(sin, 0, sizeof(*sin));
1020 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1021 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001022#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001023 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001024#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001025 return 4;
1026 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001028#ifdef ENABLE_IPV6
1029 /* check for an IPv6 address - if the address contains a scope ID, we
1030 * fallback to getaddrinfo(), which can handle translation from interface
1031 * name to interface index */
1032 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1033 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1034 memset(sin, 0, sizeof(*sin));
1035 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1036 sin->sin6_family = AF_INET6;
1037#ifdef HAVE_SOCKADDR_SA_LEN
1038 sin->sin6_len = sizeof(*sin);
1039#endif
1040 return 16;
1041 }
1042 }
1043#endif /* ENABLE_IPV6 */
1044#else /* HAVE_INET_PTON */
1045 /* check for an IPv4 address */
1046 if (af == AF_INET || af == AF_UNSPEC) {
1047 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1048 memset(sin, 0, sizeof(*sin));
1049 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1050 sin->sin_family = AF_INET;
1051#ifdef HAVE_SOCKADDR_SA_LEN
1052 sin->sin_len = sizeof(*sin);
1053#endif
1054 return 4;
1055 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001056 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001057#endif /* HAVE_INET_PTON */
1058
1059 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 memset(&hints, 0, sizeof(hints));
1061 hints.ai_family = af;
1062 Py_BEGIN_ALLOW_THREADS
1063 ACQUIRE_GETADDRINFO_LOCK
1064 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001065#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 if (error == EAI_NONAME && af == AF_UNSPEC) {
1067 /* On Tru64 V5.1, numeric-to-addr conversion fails
1068 if no address family is given. Assume IPv4 for now.*/
1069 hints.ai_family = AF_INET;
1070 error = getaddrinfo(name, NULL, &hints, &res);
1071 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 Py_END_ALLOW_THREADS
1074 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1075 if (error) {
1076 set_gaierror(error);
1077 return -1;
1078 }
1079 if (res->ai_addrlen < addr_ret_size)
1080 addr_ret_size = res->ai_addrlen;
1081 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1082 freeaddrinfo(res);
1083 switch (addr_ret->sa_family) {
1084 case AF_INET:
1085 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001086#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 case AF_INET6:
1088 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001091 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 return -1;
1093 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001094}
1095
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097/* Create a string object representing an IP address.
1098 This is always a string of the form 'dd.dd.dd.dd' (with variable
1099 size numbers). */
1100
Guido van Rossum73624e91994-10-10 17:59:00 +00001101static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001102makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 char buf[NI_MAXHOST];
1105 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1108 NI_NUMERICHOST);
1109 if (error) {
1110 set_gaierror(error);
1111 return NULL;
1112 }
1113 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114}
1115
1116
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117#ifdef USE_BLUETOOTH
1118/* Convert a string representation of a Bluetooth address into a numeric
1119 address. Returns the length (6), or raises an exception and returns -1 if
1120 an error occurred. */
1121
1122static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001123setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 unsigned int b0, b1, b2, b3, b4, b5;
1126 char ch;
1127 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1130 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1131 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1132 bdaddr->b[0] = b0;
1133 bdaddr->b[1] = b1;
1134 bdaddr->b[2] = b2;
1135 bdaddr->b[3] = b3;
1136 bdaddr->b[4] = b4;
1137 bdaddr->b[5] = b5;
1138 return 6;
1139 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001140 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 return -1;
1142 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001143}
1144
1145/* Create a string representation of the Bluetooth address. This is always a
1146 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1147 value (zero padded if necessary). */
1148
1149static PyObject *
1150makebdaddr(bdaddr_t *bdaddr)
1151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1155 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1156 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1157 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001158}
1159#endif
1160
1161
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162/* Create an object representing the given socket address,
1163 suitable for passing it back to bind(), connect() etc.
1164 The family field of the sockaddr structure is inspected
1165 to determine what kind of address it really is. */
1166
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001168static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001169makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 if (addrlen == 0) {
1172 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001173 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 case AF_INET:
1179 {
1180 struct sockaddr_in *a;
1181 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1182 PyObject *ret = NULL;
1183 if (addrobj) {
1184 a = (struct sockaddr_in *)addr;
1185 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1186 Py_DECREF(addrobj);
1187 }
1188 return ret;
1189 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001191#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 case AF_UNIX:
1193 {
1194 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001195#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001196 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1197 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1198 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 }
1200 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001201#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 {
1203 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001204 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 }
1206 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001207#endif /* AF_UNIX */
1208
Martin v. Löwis11017b12006-01-14 18:12:57 +00001209#if defined(AF_NETLINK)
1210 case AF_NETLINK:
1211 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1213 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001214 }
1215#endif /* AF_NETLINK */
1216
caaveryeffc12f2017-09-06 18:18:10 -04001217#if defined(AF_VSOCK)
1218 case AF_VSOCK:
1219 {
1220 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1221 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1222 }
1223#endif /* AF_VSOCK */
1224
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001225#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 case AF_INET6:
1227 {
1228 struct sockaddr_in6 *a;
1229 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1230 PyObject *ret = NULL;
1231 if (addrobj) {
1232 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001233 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 addrobj,
1235 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001236 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 a->sin6_scope_id);
1238 Py_DECREF(addrobj);
1239 }
1240 return ret;
1241 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001242#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001244#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 case AF_BLUETOOTH:
1246 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 case BTPROTO_L2CAP:
1249 {
1250 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1251 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1252 PyObject *ret = NULL;
1253 if (addrobj) {
1254 ret = Py_BuildValue("Oi",
1255 addrobj,
1256 _BT_L2_MEMB(a, psm));
1257 Py_DECREF(addrobj);
1258 }
1259 return ret;
1260 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 case BTPROTO_RFCOMM:
1263 {
1264 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1265 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1266 PyObject *ret = NULL;
1267 if (addrobj) {
1268 ret = Py_BuildValue("Oi",
1269 addrobj,
1270 _BT_RC_MEMB(a, channel));
1271 Py_DECREF(addrobj);
1272 }
1273 return ret;
1274 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 case BTPROTO_HCI:
1277 {
1278 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001279#if defined(__NetBSD__) || defined(__DragonFly__)
1280 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1281#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 PyObject *ret = NULL;
1283 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1284 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001287
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001288#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 case BTPROTO_SCO:
1290 {
1291 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1292 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1293 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001294#endif
1295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 default:
1297 PyErr_SetString(PyExc_ValueError,
1298 "Unknown Bluetooth protocol");
1299 return NULL;
1300 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001301#endif
1302
Antoine Pitroub156a462010-10-27 20:13:57 +00001303#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 case AF_PACKET:
1305 {
1306 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1307 char *ifname = "";
1308 struct ifreq ifr;
1309 /* need to look up interface name give index */
1310 if (a->sll_ifindex) {
1311 ifr.ifr_ifindex = a->sll_ifindex;
1312 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1313 ifname = ifr.ifr_name;
1314 }
1315 return Py_BuildValue("shbhy#",
1316 ifname,
1317 ntohs(a->sll_protocol),
1318 a->sll_pkttype,
1319 a->sll_hatype,
1320 a->sll_addr,
1321 a->sll_halen);
1322 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001323#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001324
Christian Heimes043d6f62008-01-07 17:19:16 +00001325#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 case AF_TIPC:
1327 {
1328 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1329 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1330 return Py_BuildValue("IIIII",
1331 a->addrtype,
1332 a->addr.nameseq.type,
1333 a->addr.nameseq.lower,
1334 a->addr.nameseq.upper,
1335 a->scope);
1336 } else if (a->addrtype == TIPC_ADDR_NAME) {
1337 return Py_BuildValue("IIIII",
1338 a->addrtype,
1339 a->addr.name.name.type,
1340 a->addr.name.name.instance,
1341 a->addr.name.name.instance,
1342 a->scope);
1343 } else if (a->addrtype == TIPC_ADDR_ID) {
1344 return Py_BuildValue("IIIII",
1345 a->addrtype,
1346 a->addr.id.node,
1347 a->addr.id.ref,
1348 0,
1349 a->scope);
1350 } else {
1351 PyErr_SetString(PyExc_ValueError,
1352 "Invalid address type");
1353 return NULL;
1354 }
1355 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001356#endif
1357
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001358#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001359 case AF_CAN:
1360 {
1361 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1362 char *ifname = "";
1363 struct ifreq ifr;
1364 /* need to look up interface name given index */
1365 if (a->can_ifindex) {
1366 ifr.ifr_ifindex = a->can_ifindex;
1367 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1368 ifname = ifr.ifr_name;
1369 }
1370
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001371 switch (proto) {
1372#ifdef CAN_ISOTP
1373 case CAN_ISOTP:
1374 {
1375 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1376 ifname,
1377 a->can_addr.tp.rx_id,
1378 a->can_addr.tp.tx_id);
1379 }
1380#endif
1381 default:
1382 {
1383 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1384 ifname);
1385 }
1386 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001387 }
1388#endif
1389
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001390#ifdef PF_SYSTEM
1391 case PF_SYSTEM:
1392 switch(proto) {
1393#ifdef SYSPROTO_CONTROL
1394 case SYSPROTO_CONTROL:
1395 {
1396 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1397 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1398 }
1399#endif
1400 default:
1401 PyErr_SetString(PyExc_ValueError,
1402 "Invalid address type");
1403 return 0;
1404 }
1405#endif
1406
Christian Heimesdffa3942016-09-05 23:54:41 +02001407#ifdef HAVE_SOCKADDR_ALG
1408 case AF_ALG:
1409 {
1410 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1411 return Py_BuildValue("s#s#HH",
1412 a->salg_type,
1413 strnlen((const char*)a->salg_type,
1414 sizeof(a->salg_type)),
1415 a->salg_name,
1416 strnlen((const char*)a->salg_name,
1417 sizeof(a->salg_name)),
1418 a->salg_feat,
1419 a->salg_mask);
1420 }
1421#endif
1422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 default:
1426 /* If we don't know the address family, don't raise an
1427 exception -- return it as an (int, bytes) tuple. */
1428 return Py_BuildValue("iy#",
1429 addr->sa_family,
1430 addr->sa_data,
1431 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001434}
1435
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001436/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1437 (in particular, numeric IP addresses). */
1438struct maybe_idna {
1439 PyObject *obj;
1440 char *buf;
1441};
1442
1443static void
1444idna_cleanup(struct maybe_idna *data)
1445{
1446 Py_CLEAR(data->obj);
1447}
1448
1449static int
1450idna_converter(PyObject *obj, struct maybe_idna *data)
1451{
1452 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001453 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001454 if (obj == NULL) {
1455 idna_cleanup(data);
1456 return 1;
1457 }
1458 data->obj = NULL;
1459 len = -1;
1460 if (PyBytes_Check(obj)) {
1461 data->buf = PyBytes_AsString(obj);
1462 len = PyBytes_Size(obj);
1463 }
1464 else if (PyByteArray_Check(obj)) {
1465 data->buf = PyByteArray_AsString(obj);
1466 len = PyByteArray_Size(obj);
1467 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001468 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001469 if (PyUnicode_READY(obj) == -1) {
1470 return 0;
1471 }
1472 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001473 data->buf = PyUnicode_DATA(obj);
1474 len = PyUnicode_GET_LENGTH(obj);
1475 }
1476 else {
1477 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1478 if (!obj2) {
1479 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1480 return 0;
1481 }
1482 assert(PyBytes_Check(obj2));
1483 data->obj = obj2;
1484 data->buf = PyBytes_AS_STRING(obj2);
1485 len = PyBytes_GET_SIZE(obj2);
1486 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001487 }
1488 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001489 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1490 obj->ob_type->tp_name);
1491 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001492 }
1493 if (strlen(data->buf) != len) {
1494 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001495 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001496 return 0;
1497 }
1498 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001499}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001500
1501/* Parse a socket address argument according to the socket object's
1502 address family. Return 1 if the address was in the proper format,
1503 0 of not. The address is returned through addr_ret, its length
1504 through len_ret. */
1505
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001506static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001511
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001512#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 case AF_UNIX:
1514 {
1515 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001516 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001517 int retval = 0;
1518
1519 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1520 allow embedded nulls on Linux. */
1521 if (PyUnicode_Check(args)) {
1522 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1523 return 0;
1524 }
1525 else
1526 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001527 if (!PyArg_Parse(args, "y*", &path)) {
1528 Py_DECREF(args);
1529 return retval;
1530 }
1531 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001534#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001537 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001538 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001540 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 }
1542 }
1543 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001544#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 {
1546 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001547 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001548 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001550 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 }
1554 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001555 memcpy(addr->sun_path, path.buf, path.len);
1556 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001557 retval = 1;
1558 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001559 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001560 Py_DECREF(args);
1561 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001563#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564
Martin v. Löwis11017b12006-01-14 18:12:57 +00001565#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 case AF_NETLINK:
1567 {
1568 struct sockaddr_nl* addr;
1569 int pid, groups;
1570 addr = (struct sockaddr_nl *)addr_ret;
1571 if (!PyTuple_Check(args)) {
1572 PyErr_Format(
1573 PyExc_TypeError,
1574 "getsockaddrarg: "
1575 "AF_NETLINK address must be tuple, not %.500s",
1576 Py_TYPE(args)->tp_name);
1577 return 0;
1578 }
1579 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1580 return 0;
1581 addr->nl_family = AF_NETLINK;
1582 addr->nl_pid = pid;
1583 addr->nl_groups = groups;
1584 *len_ret = sizeof(*addr);
1585 return 1;
1586 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001587#endif
1588
caaveryeffc12f2017-09-06 18:18:10 -04001589#if defined(AF_VSOCK)
1590 case AF_VSOCK:
1591 {
1592 struct sockaddr_vm* addr;
1593 int port, cid;
1594 addr = (struct sockaddr_vm *)addr_ret;
1595 memset(addr, 0, sizeof(struct sockaddr_vm));
1596 if (!PyTuple_Check(args)) {
1597 PyErr_Format(
1598 PyExc_TypeError,
1599 "getsockaddrarg: "
1600 "AF_VSOCK address must be tuple, not %.500s",
1601 Py_TYPE(args)->tp_name);
1602 return 0;
1603 }
1604 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1605 return 0;
1606 addr->svm_family = s->sock_family;
1607 addr->svm_port = port;
1608 addr->svm_cid = cid;
1609 *len_ret = sizeof(*addr);
1610 return 1;
1611 }
1612#endif
1613
1614
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001615#ifdef AF_RDS
1616 case AF_RDS:
1617 /* RDS sockets use sockaddr_in: fall-through */
1618#endif
1619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 case AF_INET:
1621 {
1622 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 int port, result;
1625 if (!PyTuple_Check(args)) {
1626 PyErr_Format(
1627 PyExc_TypeError,
1628 "getsockaddrarg: "
1629 "AF_INET address must be tuple, not %.500s",
1630 Py_TYPE(args)->tp_name);
1631 return 0;
1632 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001633 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1634 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 return 0;
1636 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 if (result < 0)
1641 return 0;
1642 if (port < 0 || port > 0xffff) {
1643 PyErr_SetString(
1644 PyExc_OverflowError,
1645 "getsockaddrarg: port must be 0-65535.");
1646 return 0;
1647 }
1648 addr->sin_family = AF_INET;
1649 addr->sin_port = htons((short)port);
1650 *len_ret = sizeof *addr;
1651 return 1;
1652 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001654#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 case AF_INET6:
1656 {
1657 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001658 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001659 int port, result;
1660 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 flowinfo = scope_id = 0;
1662 if (!PyTuple_Check(args)) {
1663 PyErr_Format(
1664 PyExc_TypeError,
1665 "getsockaddrarg: "
1666 "AF_INET6 address must be tuple, not %.500s",
1667 Py_TYPE(args)->tp_name);
1668 return 0;
1669 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001670 if (!PyArg_ParseTuple(args, "O&i|II",
1671 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 &scope_id)) {
1673 return 0;
1674 }
1675 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001676 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001678 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 if (result < 0)
1680 return 0;
1681 if (port < 0 || port > 0xffff) {
1682 PyErr_SetString(
1683 PyExc_OverflowError,
1684 "getsockaddrarg: port must be 0-65535.");
1685 return 0;
1686 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001687 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001688 PyErr_SetString(
1689 PyExc_OverflowError,
1690 "getsockaddrarg: flowinfo must be 0-1048575.");
1691 return 0;
1692 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 addr->sin6_family = s->sock_family;
1694 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001695 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 addr->sin6_scope_id = scope_id;
1697 *len_ret = sizeof *addr;
1698 return 1;
1699 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001700#endif
1701
Hye-Shik Chang81268602004-02-02 06:05:24 +00001702#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 case AF_BLUETOOTH:
1704 {
1705 switch (s->sock_proto) {
1706 case BTPROTO_L2CAP:
1707 {
1708 struct sockaddr_l2 *addr;
1709 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 addr = (struct sockaddr_l2 *)addr_ret;
1712 memset(addr, 0, sizeof(struct sockaddr_l2));
1713 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1714 if (!PyArg_ParseTuple(args, "si", &straddr,
1715 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001716 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 "wrong format");
1718 return 0;
1719 }
1720 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1721 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 *len_ret = sizeof *addr;
1724 return 1;
1725 }
1726 case BTPROTO_RFCOMM:
1727 {
1728 struct sockaddr_rc *addr;
1729 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 addr = (struct sockaddr_rc *)addr_ret;
1732 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1733 if (!PyArg_ParseTuple(args, "si", &straddr,
1734 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001735 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 "wrong format");
1737 return 0;
1738 }
1739 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1740 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 *len_ret = sizeof *addr;
1743 return 1;
1744 }
1745 case BTPROTO_HCI:
1746 {
1747 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001748#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001749 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001750
Alexander Belopolskye239d232010-12-08 23:31:48 +00001751 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001752 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001753 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001754 "wrong format");
1755 return 0;
1756 }
1757 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1758 return 0;
1759#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1761 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001762 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 "wrong format");
1764 return 0;
1765 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 *len_ret = sizeof *addr;
1768 return 1;
1769 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001770#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 case BTPROTO_SCO:
1772 {
1773 struct sockaddr_sco *addr;
1774 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 addr = (struct sockaddr_sco *)addr_ret;
1777 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1778 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001779 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 "wrong format");
1781 return 0;
1782 }
1783 straddr = PyBytes_AS_STRING(args);
1784 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1785 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 *len_ret = sizeof *addr;
1788 return 1;
1789 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001792 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 return 0;
1794 }
1795 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001796#endif
1797
Antoine Pitroub156a462010-10-27 20:13:57 +00001798#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 case AF_PACKET:
1800 {
1801 struct sockaddr_ll* addr;
1802 struct ifreq ifr;
1803 char *interfaceName;
1804 int protoNumber;
1805 int hatype = 0;
1806 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001807 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (!PyTuple_Check(args)) {
1810 PyErr_Format(
1811 PyExc_TypeError,
1812 "getsockaddrarg: "
1813 "AF_PACKET address must be tuple, not %.500s",
1814 Py_TYPE(args)->tp_name);
1815 return 0;
1816 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001817 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001819 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return 0;
1821 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1822 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1823 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1824 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001825 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 return 0;
1827 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 if (haddr.buf && haddr.len > 8) {
1829 PyErr_SetString(PyExc_ValueError,
1830 "Hardware address must be 8 bytes or less");
1831 PyBuffer_Release(&haddr);
1832 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 }
1834 if (protoNumber < 0 || protoNumber > 0xffff) {
1835 PyErr_SetString(
1836 PyExc_OverflowError,
1837 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001838 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return 0;
1840 }
1841 addr = (struct sockaddr_ll*)addr_ret;
1842 addr->sll_family = AF_PACKET;
1843 addr->sll_protocol = htons((short)protoNumber);
1844 addr->sll_ifindex = ifr.ifr_ifindex;
1845 addr->sll_pkttype = pkttype;
1846 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001847 if (haddr.buf) {
1848 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1849 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001851 else
1852 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001854 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 return 1;
1856 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001857#endif
1858
Christian Heimes043d6f62008-01-07 17:19:16 +00001859#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 case AF_TIPC:
1861 {
1862 unsigned int atype, v1, v2, v3;
1863 unsigned int scope = TIPC_CLUSTER_SCOPE;
1864 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (!PyTuple_Check(args)) {
1867 PyErr_Format(
1868 PyExc_TypeError,
1869 "getsockaddrarg: "
1870 "AF_TIPC address must be tuple, not %.500s",
1871 Py_TYPE(args)->tp_name);
1872 return 0;
1873 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 if (!PyArg_ParseTuple(args,
1876 "IIII|I;Invalid TIPC address format",
1877 &atype, &v1, &v2, &v3, &scope))
1878 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 addr = (struct sockaddr_tipc *) addr_ret;
1881 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 addr->family = AF_TIPC;
1884 addr->scope = scope;
1885 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 if (atype == TIPC_ADDR_NAMESEQ) {
1888 addr->addr.nameseq.type = v1;
1889 addr->addr.nameseq.lower = v2;
1890 addr->addr.nameseq.upper = v3;
1891 } else if (atype == TIPC_ADDR_NAME) {
1892 addr->addr.name.name.type = v1;
1893 addr->addr.name.name.instance = v2;
1894 } else if (atype == TIPC_ADDR_ID) {
1895 addr->addr.id.node = v1;
1896 addr->addr.id.ref = v2;
1897 } else {
1898 /* Shouldn't happen */
1899 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1900 return 0;
1901 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 1;
1906 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001907#endif
1908
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001909#ifdef AF_CAN
1910
1911#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001912 case AF_CAN:
1913 switch (s->sock_proto) {
1914 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001915 /* fall-through */
1916 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001917 {
1918 struct sockaddr_can *addr;
1919 PyObject *interfaceName;
1920 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001921 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001922 addr = (struct sockaddr_can *)addr_ret;
1923
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1925 &interfaceName))
1926 return 0;
1927
1928 len = PyBytes_GET_SIZE(interfaceName);
1929
1930 if (len == 0) {
1931 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001932 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001933 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1934 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001935 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1936 s->errorhandler();
1937 Py_DECREF(interfaceName);
1938 return 0;
1939 }
1940 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001941 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001942 "AF_CAN interface name too long");
1943 Py_DECREF(interfaceName);
1944 return 0;
1945 }
1946
1947 addr->can_family = AF_CAN;
1948 addr->can_ifindex = ifr.ifr_ifindex;
1949
1950 *len_ret = sizeof(*addr);
1951 Py_DECREF(interfaceName);
1952 return 1;
1953 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001954#endif
1955
1956#ifdef CAN_ISOTP
1957 case CAN_ISOTP:
1958 {
1959 struct sockaddr_can *addr;
1960 PyObject *interfaceName;
1961 struct ifreq ifr;
1962 Py_ssize_t len;
1963 unsigned long int rx_id, tx_id;
1964
1965 addr = (struct sockaddr_can *)addr_ret;
1966
1967 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1968 &interfaceName,
1969 &rx_id,
1970 &tx_id))
1971 return 0;
1972
1973 len = PyBytes_GET_SIZE(interfaceName);
1974
1975 if (len == 0) {
1976 ifr.ifr_ifindex = 0;
1977 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1978 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1979 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1980 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1981 s->errorhandler();
1982 Py_DECREF(interfaceName);
1983 return 0;
1984 }
1985 } else {
1986 PyErr_SetString(PyExc_OSError,
1987 "AF_CAN interface name too long");
1988 Py_DECREF(interfaceName);
1989 return 0;
1990 }
1991
1992 addr->can_family = AF_CAN;
1993 addr->can_ifindex = ifr.ifr_ifindex;
1994 addr->can_addr.tp.rx_id = rx_id;
1995 addr->can_addr.tp.tx_id = tx_id;
1996
1997 *len_ret = sizeof(*addr);
1998 Py_DECREF(interfaceName);
1999 return 1;
2000 }
2001#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002003 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002004 "getsockaddrarg: unsupported CAN protocol");
2005 return 0;
2006 }
2007#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002008
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002009#ifdef PF_SYSTEM
2010 case PF_SYSTEM:
2011 switch (s->sock_proto) {
2012#ifdef SYSPROTO_CONTROL
2013 case SYSPROTO_CONTROL:
2014 {
2015 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002016
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002017 addr = (struct sockaddr_ctl *)addr_ret;
2018 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002019 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002020
2021 if (PyUnicode_Check(args)) {
2022 struct ctl_info info;
2023 PyObject *ctl_name;
2024
2025 if (!PyArg_Parse(args, "O&",
2026 PyUnicode_FSConverter, &ctl_name)) {
2027 return 0;
2028 }
2029
Victor Stinnerf50e1872015-03-20 11:32:24 +01002030 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002031 PyErr_SetString(PyExc_ValueError,
2032 "provided string is too long");
2033 Py_DECREF(ctl_name);
2034 return 0;
2035 }
2036 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2037 sizeof(info.ctl_name));
2038 Py_DECREF(ctl_name);
2039
2040 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2041 PyErr_SetString(PyExc_OSError,
2042 "cannot find kernel control with provided name");
2043 return 0;
2044 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002045
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002046 addr->sc_id = info.ctl_id;
2047 addr->sc_unit = 0;
2048 } else if (!PyArg_ParseTuple(args, "II",
2049 &(addr->sc_id), &(addr->sc_unit))) {
2050 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2051 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002052
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002053 return 0;
2054 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002055
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002056 *len_ret = sizeof(*addr);
2057 return 1;
2058 }
2059#endif
2060 default:
2061 PyErr_SetString(PyExc_OSError,
2062 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2063 return 0;
2064 }
2065#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002066#ifdef HAVE_SOCKADDR_ALG
2067 case AF_ALG:
2068 {
2069 struct sockaddr_alg *sa;
2070 char *type;
2071 char *name;
2072 sa = (struct sockaddr_alg *)addr_ret;
2073
2074 memset(sa, 0, sizeof(*sa));
2075 sa->salg_family = AF_ALG;
2076
2077 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2078 &type, &name, &sa->salg_feat, &sa->salg_mask))
2079 return 0;
2080 /* sockaddr_alg has fixed-sized char arrays for type and name */
2081 if (strlen(type) > sizeof(sa->salg_type)) {
2082 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2083 return 0;
2084 }
2085 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2086 if (strlen(name) > sizeof(sa->salg_name)) {
2087 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2088 return 0;
2089 }
2090 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2091
2092 *len_ret = sizeof(*sa);
2093 return 1;
2094 }
2095#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002100 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002104}
2105
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106
Guido van Rossum48a680c2001-03-02 06:34:14 +00002107/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002108 Return 1 if the family is known, 0 otherwise. The length is returned
2109 through len_ret. */
2110
2111static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002112getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002115
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002116#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 case AF_UNIX:
2118 {
2119 *len_ret = sizeof (struct sockaddr_un);
2120 return 1;
2121 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002122#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002123
Martin v. Löwis11017b12006-01-14 18:12:57 +00002124#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002125 case AF_NETLINK:
2126 {
2127 *len_ret = sizeof (struct sockaddr_nl);
2128 return 1;
2129 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002130#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002131
caaveryeffc12f2017-09-06 18:18:10 -04002132#if defined(AF_VSOCK)
2133 case AF_VSOCK:
2134 {
2135 *len_ret = sizeof (struct sockaddr_vm);
2136 return 1;
2137 }
2138#endif
2139
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002140#ifdef AF_RDS
2141 case AF_RDS:
2142 /* RDS sockets use sockaddr_in: fall-through */
2143#endif
2144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 case AF_INET:
2146 {
2147 *len_ret = sizeof (struct sockaddr_in);
2148 return 1;
2149 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002150
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002151#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 case AF_INET6:
2153 {
2154 *len_ret = sizeof (struct sockaddr_in6);
2155 return 1;
2156 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002157#endif
2158
Hye-Shik Chang81268602004-02-02 06:05:24 +00002159#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 case AF_BLUETOOTH:
2161 {
2162 switch(s->sock_proto)
2163 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 case BTPROTO_L2CAP:
2166 *len_ret = sizeof (struct sockaddr_l2);
2167 return 1;
2168 case BTPROTO_RFCOMM:
2169 *len_ret = sizeof (struct sockaddr_rc);
2170 return 1;
2171 case BTPROTO_HCI:
2172 *len_ret = sizeof (struct sockaddr_hci);
2173 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002174#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 case BTPROTO_SCO:
2176 *len_ret = sizeof (struct sockaddr_sco);
2177 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002180 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 "unknown BT protocol");
2182 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 }
2185 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002186#endif
2187
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002188#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 case AF_PACKET:
2190 {
2191 *len_ret = sizeof (struct sockaddr_ll);
2192 return 1;
2193 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002194#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002195
Christian Heimes043d6f62008-01-07 17:19:16 +00002196#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 case AF_TIPC:
2198 {
2199 *len_ret = sizeof (struct sockaddr_tipc);
2200 return 1;
2201 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002202#endif
2203
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002204#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002205 case AF_CAN:
2206 {
2207 *len_ret = sizeof (struct sockaddr_can);
2208 return 1;
2209 }
2210#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002211
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002212#ifdef PF_SYSTEM
2213 case PF_SYSTEM:
2214 switch(s->sock_proto) {
2215#ifdef SYSPROTO_CONTROL
2216 case SYSPROTO_CONTROL:
2217 *len_ret = sizeof (struct sockaddr_ctl);
2218 return 1;
2219#endif
2220 default:
2221 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2222 "unknown PF_SYSTEM protocol");
2223 return 0;
2224 }
2225#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002226#ifdef HAVE_SOCKADDR_ALG
2227 case AF_ALG:
2228 {
2229 *len_ret = sizeof (struct sockaddr_alg);
2230 return 1;
2231 }
2232#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002237 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002241}
2242
2243
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002244/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2245 Currently, these methods are only compiled if the RFC 2292/3542
2246 CMSG_LEN() macro is available. Older systems seem to have used
2247 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2248 it may be possible to define CMSG_LEN() that way if it's not
2249 provided. Some architectures might need extra padding after the
2250 cmsghdr, however, and CMSG_LEN() would have to take account of
2251 this. */
2252#ifdef CMSG_LEN
2253/* If length is in range, set *result to CMSG_LEN(length) and return
2254 true; otherwise, return false. */
2255static int
2256get_CMSG_LEN(size_t length, size_t *result)
2257{
2258 size_t tmp;
2259
2260 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2261 return 0;
2262 tmp = CMSG_LEN(length);
2263 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2264 return 0;
2265 *result = tmp;
2266 return 1;
2267}
2268
2269#ifdef CMSG_SPACE
2270/* If length is in range, set *result to CMSG_SPACE(length) and return
2271 true; otherwise, return false. */
2272static int
2273get_CMSG_SPACE(size_t length, size_t *result)
2274{
2275 size_t tmp;
2276
2277 /* Use CMSG_SPACE(1) here in order to take account of the padding
2278 necessary before *and* after the data. */
2279 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2280 return 0;
2281 tmp = CMSG_SPACE(length);
2282 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2283 return 0;
2284 *result = tmp;
2285 return 1;
2286}
2287#endif
2288
2289/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2290 pointer in msg->msg_control with at least "space" bytes after it,
2291 and its cmsg_len member inside the buffer. */
2292static int
2293cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2294{
2295 size_t cmsg_offset;
2296 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2297 sizeof(cmsgh->cmsg_len));
2298
Charles-François Natali466517d2011-08-28 18:23:43 +02002299 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002300 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002301 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002302 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2303 annoying under OS X as it's unsigned there and so it triggers a
2304 tautological comparison warning under Clang when compared against 0.
2305 Since the check is valid on other platforms, silence the warning under
2306 Clang. */
2307 #ifdef __clang__
2308 #pragma clang diagnostic push
2309 #pragma clang diagnostic ignored "-Wtautological-compare"
2310 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002311 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002312 #pragma GCC diagnostic push
2313 #pragma GCC diagnostic ignored "-Wtype-limits"
2314 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002315 if (msg->msg_controllen < 0)
2316 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002317 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002318 #pragma GCC diagnostic pop
2319 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002320 #ifdef __clang__
2321 #pragma clang diagnostic pop
2322 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002323 if (space < cmsg_len_end)
2324 space = cmsg_len_end;
2325 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2326 return (cmsg_offset <= (size_t)-1 - space &&
2327 cmsg_offset + space <= msg->msg_controllen);
2328}
2329
2330/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2331 *space to number of bytes following it in the buffer and return
2332 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2333 msg->msg_controllen are valid. */
2334static int
2335get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2336{
2337 size_t data_offset;
2338 char *data_ptr;
2339
2340 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2341 return 0;
2342 data_offset = data_ptr - (char *)msg->msg_control;
2343 if (data_offset > msg->msg_controllen)
2344 return 0;
2345 *space = msg->msg_controllen - data_offset;
2346 return 1;
2347}
2348
2349/* If cmsgh is invalid or not contained in the buffer pointed to by
2350 msg->msg_control, return -1. If cmsgh is valid and its associated
2351 data is entirely contained in the buffer, set *data_len to the
2352 length of the associated data and return 0. If only part of the
2353 associated data is contained in the buffer but cmsgh is otherwise
2354 valid, set *data_len to the length contained in the buffer and
2355 return 1. */
2356static int
2357get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2358{
2359 size_t space, cmsg_data_len;
2360
2361 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2362 cmsgh->cmsg_len < CMSG_LEN(0))
2363 return -1;
2364 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2365 if (!get_cmsg_data_space(msg, cmsgh, &space))
2366 return -1;
2367 if (space >= cmsg_data_len) {
2368 *data_len = cmsg_data_len;
2369 return 0;
2370 }
2371 *data_len = space;
2372 return 1;
2373}
2374#endif /* CMSG_LEN */
2375
2376
Victor Stinner31bf2d52015-04-01 21:57:09 +02002377struct sock_accept {
2378 socklen_t *addrlen;
2379 sock_addr_t *addrbuf;
2380 SOCKET_T result;
2381};
2382
2383#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2384/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2385static int accept4_works = -1;
2386#endif
2387
2388static int
2389sock_accept_impl(PySocketSockObject *s, void *data)
2390{
2391 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002392 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2393 socklen_t *paddrlen = ctx->addrlen;
2394#ifdef HAVE_SOCKADDR_ALG
2395 /* AF_ALG does not support accept() with addr and raises
2396 * ECONNABORTED instead. */
2397 if (s->sock_family == AF_ALG) {
2398 addr = NULL;
2399 paddrlen = NULL;
2400 *ctx->addrlen = 0;
2401 }
2402#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002403
2404#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2405 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002406 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002407 SOCK_CLOEXEC);
2408 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2409 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2410 accept4_works = (errno != ENOSYS);
2411 }
2412 }
2413 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002414 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002415#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002416 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002417#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002418
2419#ifdef MS_WINDOWS
2420 return (ctx->result != INVALID_SOCKET);
2421#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002422 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002423#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002424}
2425
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002426/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002427
Guido van Rossum73624e91994-10-10 17:59:00 +00002428static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002429sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002432 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 socklen_t addrlen;
2434 PyObject *sock = NULL;
2435 PyObject *addr = NULL;
2436 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002437 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 if (!getsockaddrlen(s, &addrlen))
2440 return NULL;
2441 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 if (!IS_SELECTABLE(s))
2444 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002445
Victor Stinner31bf2d52015-04-01 21:57:09 +02002446 ctx.addrlen = &addrlen;
2447 ctx.addrbuf = &addrbuf;
2448 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002450 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002451
Victor Stinnerdaf45552013-08-28 00:53:59 +02002452#ifdef MS_WINDOWS
2453 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2454 PyErr_SetFromWindowsErr(0);
2455 SOCKETCLOSE(newfd);
2456 goto finally;
2457 }
2458#else
2459
2460#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2461 if (!accept4_works)
2462#endif
2463 {
2464 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2465 SOCKETCLOSE(newfd);
2466 goto finally;
2467 }
2468 }
2469#endif
2470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 sock = PyLong_FromSocket_t(newfd);
2472 if (sock == NULL) {
2473 SOCKETCLOSE(newfd);
2474 goto finally;
2475 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2478 addrlen, s->sock_proto);
2479 if (addr == NULL)
2480 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002483
Guido van Rossum67f7a382002-06-06 21:08:16 +00002484finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 Py_XDECREF(sock);
2486 Py_XDECREF(addr);
2487 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002488}
2489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002490PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002491"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002492\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002493Wait for an incoming connection. Return a new socket file descriptor\n\
2494representing the connection, and the address of the client.\n\
2495For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002496
Guido van Rossum11ba0942002-06-13 15:07:44 +00002497/* s.setblocking(flag) method. Argument:
2498 False -- non-blocking mode; same as settimeout(0)
2499 True -- blocking mode; same as settimeout(None)
2500*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002501
Guido van Rossum73624e91994-10-10 17:59:00 +00002502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002504{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002505 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 block = PyLong_AsLong(arg);
2508 if (block == -1 && PyErr_Occurred())
2509 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510
Victor Stinner9001d802015-04-06 23:06:01 +02002511 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002512 if (internal_setblocking(s, block) == -1) {
2513 return NULL;
2514 }
2515 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002516}
Guido van Rossume4485b01994-09-07 14:32:49 +00002517
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002518PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002519"setblocking(flag)\n\
2520\n\
2521Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002522setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
Victor Stinner71694d52015-03-28 01:18:54 +01002525static int
2526socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2527{
2528#ifdef MS_WINDOWS
2529 struct timeval tv;
2530#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002531#ifndef HAVE_POLL
2532 _PyTime_t ms;
2533#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002534 int overflow = 0;
2535
2536 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002537 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002538 return 0;
2539 }
2540
Victor Stinner869e1772015-03-30 03:49:14 +02002541 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002542 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002543 return -1;
2544
2545 if (*timeout < 0) {
2546 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2547 return -1;
2548 }
2549
2550#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002551 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002552#endif
2553#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002554 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002555 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002556#endif
2557 if (overflow) {
2558 PyErr_SetString(PyExc_OverflowError,
2559 "timeout doesn't fit into C timeval");
2560 return -1;
2561 }
2562
2563 return 0;
2564}
2565
Guido van Rossum11ba0942002-06-13 15:07:44 +00002566/* s.settimeout(timeout) method. Argument:
2567 None -- no timeout, blocking mode; same as setblocking(True)
2568 0.0 -- non-blocking mode; same as setblocking(False)
2569 > 0 -- timeout mode; operations time out after timeout seconds
2570 < 0 -- illegal; raises an exception
2571*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002573sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002574{
Victor Stinner71694d52015-03-28 01:18:54 +01002575 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002576
Victor Stinner71694d52015-03-28 01:18:54 +01002577 if (socket_parse_timeout(&timeout, arg) < 0)
2578 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002581 if (internal_setblocking(s, timeout < 0) == -1) {
2582 return NULL;
2583 }
2584 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002585}
2586
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002587PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002588"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002589\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002590Set a timeout on socket operations. 'timeout' can be a float,\n\
2591giving in seconds, or None. Setting a timeout of None disables\n\
2592the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002593Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002594
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002595/* s.gettimeout() method.
2596 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002598sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599{
Victor Stinner71694d52015-03-28 01:18:54 +01002600 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002601 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 }
Victor Stinner71694d52015-03-28 01:18:54 +01002603 else {
2604 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2605 return PyFloat_FromDouble(seconds);
2606 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002607}
2608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002609PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002610"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002611\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002612Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002613operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002614operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002615
Guido van Rossumaee08791992-09-08 09:05:33 +00002616/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002617 With an integer third argument, sets an integer optval with optlen=4.
2618 With None as third argument and an integer fourth argument, set
2619 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002620 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002621 use optional built-in module 'struct' to encode the string.
2622*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002623
Guido van Rossum73624e91994-10-10 17:59:00 +00002624static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002625sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 int level;
2628 int optname;
2629 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002630 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002632 unsigned int optlen;
2633 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002634
caaveryeffc12f2017-09-06 18:18:10 -04002635#ifdef AF_VSOCK
2636 if (s->sock_family == AF_VSOCK) {
2637 uint64_t vflag; // Must be set width of 64 bits
2638 /* setsockopt(level, opt, flag) */
2639 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2640 &level, &optname, &vflag)) {
2641 // level should always be set to AF_VSOCK
2642 res = setsockopt(s->sock_fd, level, optname,
2643 (void*)&vflag, sizeof vflag);
2644 goto done;
2645 }
2646 return NULL;
2647 }
2648#endif
2649
Christian Heimesdffa3942016-09-05 23:54:41 +02002650 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 if (PyArg_ParseTuple(args, "iii:setsockopt",
2652 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002653 res = setsockopt(s->sock_fd, level, optname,
2654 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002655 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002657
2658 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002659 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002660 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2661 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2662 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002663 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002664 NULL, (socklen_t)optlen);
2665 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002667
2668 PyErr_Clear();
2669 /* setsockopt(level, opt, buffer) */
2670 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2671 &level, &optname, &optval))
2672 return NULL;
2673
2674#ifdef MS_WINDOWS
2675 if (optval.len > INT_MAX) {
2676 PyBuffer_Release(&optval);
2677 PyErr_Format(PyExc_OverflowError,
2678 "socket option is larger than %i bytes",
2679 INT_MAX);
2680 return NULL;
2681 }
2682 res = setsockopt(s->sock_fd, level, optname,
2683 optval.buf, (int)optval.len);
2684#else
2685 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2686#endif
2687 PyBuffer_Release(&optval);
2688
2689done:
Victor Stinnercc739322016-03-23 21:35:29 +01002690 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002692 }
2693
2694 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002695}
2696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002697PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002698"setsockopt(level, option, value: int)\n\
2699setsockopt(level, option, value: buffer)\n\
2700setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002701\n\
2702Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002703The value argument can either be an integer, a string buffer, or \n\
2704None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002705
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002706
Guido van Rossumaee08791992-09-08 09:05:33 +00002707/* s.getsockopt() method.
2708 With two arguments, retrieves an integer option.
2709 With a third integer argument, retrieves a string buffer of that size;
2710 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002711
Guido van Rossum73624e91994-10-10 17:59:00 +00002712static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002713sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 int level;
2716 int optname;
2717 int res;
2718 PyObject *buf;
2719 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002720 int flag = 0;
2721 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2724 &level, &optname, &buflen))
2725 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002728#ifdef AF_VSOCK
2729 if (s->sock_family == AF_VSOCK) {
2730 uint64_t vflag = 0; // Must be set width of 64 bits
2731 flagsize = sizeof vflag;
2732 res = getsockopt(s->sock_fd, level, optname,
2733 (void *)&vflag, &flagsize);
2734 if (res < 0)
2735 return s->errorhandler();
2736 return PyLong_FromUnsignedLong(vflag);
2737 }
2738#endif
2739 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 res = getsockopt(s->sock_fd, level, optname,
2741 (void *)&flag, &flagsize);
2742 if (res < 0)
2743 return s->errorhandler();
2744 return PyLong_FromLong(flag);
2745 }
caaveryeffc12f2017-09-06 18:18:10 -04002746#ifdef AF_VSOCK
2747 if (s->sock_family == AF_VSOCK) {
2748 PyErr_SetString(PyExc_OSError,
2749 "getsockopt string buffer not allowed");
2750 return NULL;
2751 }
2752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002754 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 "getsockopt buflen out of range");
2756 return NULL;
2757 }
2758 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2759 if (buf == NULL)
2760 return NULL;
2761 res = getsockopt(s->sock_fd, level, optname,
2762 (void *)PyBytes_AS_STRING(buf), &buflen);
2763 if (res < 0) {
2764 Py_DECREF(buf);
2765 return s->errorhandler();
2766 }
2767 _PyBytes_Resize(&buf, buflen);
2768 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002769}
2770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002771PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002772"getsockopt(level, option[, buffersize]) -> value\n\
2773\n\
2774Get a socket option. See the Unix manual for level and option.\n\
2775If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002776string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002777
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002778
Fred Drake728819a2000-07-01 03:40:12 +00002779/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002780
Guido van Rossum73624e91994-10-10 17:59:00 +00002781static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002782sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 sock_addr_t addrbuf;
2785 int addrlen;
2786 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2789 return NULL;
2790 Py_BEGIN_ALLOW_THREADS
2791 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2792 Py_END_ALLOW_THREADS
2793 if (res < 0)
2794 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002795 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002796}
2797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799"bind(address)\n\
2800\n\
2801Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002802pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002803sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002804
Guido van Rossum30a685f1991-06-27 15:51:29 +00002805
2806/* s.close() method.
2807 Set the file descriptor to -1 so operations tried subsequently
2808 will surely fail. */
2809
Guido van Rossum73624e91994-10-10 17:59:00 +00002810static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002811sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002814 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002815
Victor Stinner19a8e842016-03-21 16:36:48 +01002816 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002817 if (fd != INVALID_SOCKET) {
2818 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002819
2820 /* We do not want to retry upon EINTR: see
2821 http://lwn.net/Articles/576478/ and
2822 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2823 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002825 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002827 /* bpo-30319: The peer can already have closed the connection.
2828 Python ignores ECONNRESET on close(). */
2829 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002830 return s->errorhandler();
2831 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002833 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002834}
2835
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002836PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002837"close()\n\
2838\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002839Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002840
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002841static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002842sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002843{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002844 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002845 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002846 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002847}
2848
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002849PyDoc_STRVAR(detach_doc,
2850"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002851\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002852Close the socket object without closing the underlying file descriptor.\n\
2853The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002854can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002855
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002856static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002857sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002858{
Victor Stinner81c41db2015-04-02 11:50:57 +02002859 int err;
2860 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002861
Victor Stinner81c41db2015-04-02 11:50:57 +02002862 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2863 /* getsockopt() failed */
2864 return 0;
2865 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002866
Victor Stinner81c41db2015-04-02 11:50:57 +02002867 if (err == EISCONN)
2868 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002869 if (err != 0) {
2870 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2871 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002872 return 0;
2873 }
2874 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002875}
2876
2877static int
2878internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2879 int raise)
2880{
2881 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002882
2883 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002885 Py_END_ALLOW_THREADS
2886
Victor Stinner70a46f62015-03-31 22:03:59 +02002887 if (!res) {
2888 /* connect() succeeded, the socket is connected */
2889 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002891
Victor Stinner81c41db2015-04-02 11:50:57 +02002892 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002893
Victor Stinner81c41db2015-04-02 11:50:57 +02002894 /* save error, PyErr_CheckSignals() can replace it */
2895 err = GET_SOCK_ERROR;
2896 if (CHECK_ERRNO(EINTR)) {
2897 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002898 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002899
2900 /* Issue #23618: when connect() fails with EINTR, the connection is
2901 running asynchronously.
2902
2903 If the socket is blocking or has a timeout, wait until the
2904 connection completes, fails or timed out using select(), and then
2905 get the connection status using getsockopt(SO_ERROR).
2906
2907 If the socket is non-blocking, raise InterruptedError. The caller is
2908 responsible to wait until the connection completes, fails or timed
2909 out (it's the case in asyncio for example). */
2910 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2911 }
2912 else {
2913 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2914 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002915 }
2916
Victor Stinner81c41db2015-04-02 11:50:57 +02002917 if (!wait_connect) {
2918 if (raise) {
2919 /* restore error, maybe replaced by PyErr_CheckSignals() */
2920 SET_SOCK_ERROR(err);
2921 s->errorhandler();
2922 return -1;
2923 }
2924 else
2925 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002926 }
2927
Victor Stinner81c41db2015-04-02 11:50:57 +02002928 if (raise) {
2929 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002930 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2931 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002932 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002933 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002934 else {
2935 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002936 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2937 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002938 return err;
2939 }
2940 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002941}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002942
Fred Drake728819a2000-07-01 03:40:12 +00002943/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002944
Guido van Rossum73624e91994-10-10 17:59:00 +00002945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 sock_addr_t addrbuf;
2949 int addrlen;
2950 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2953 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002954
Victor Stinner81c41db2015-04-02 11:50:57 +02002955 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002956 if (res < 0)
2957 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002958
Victor Stinneree699e92015-03-31 21:28:42 +02002959 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002960}
2961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963"connect(address)\n\
2964\n\
2965Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002966is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002967
Guido van Rossum30a685f1991-06-27 15:51:29 +00002968
Fred Drake728819a2000-07-01 03:40:12 +00002969/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002970
2971static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002972sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 sock_addr_t addrbuf;
2975 int addrlen;
2976 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2979 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002980
Victor Stinner81c41db2015-04-02 11:50:57 +02002981 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002982 if (res < 0)
2983 return NULL;
2984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002986}
2987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002988PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002989"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002990\n\
2991This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002992instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002993
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002994
Guido van Rossumed233a51992-06-23 09:07:03 +00002995/* s.fileno() method */
2996
Guido van Rossum73624e91994-10-10 17:59:00 +00002997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002998sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003001}
3002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003003PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003004"fileno() -> integer\n\
3005\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007
Guido van Rossumed233a51992-06-23 09:07:03 +00003008
Guido van Rossumc89705d1992-11-26 08:54:07 +00003009/* s.getsockname() method */
3010
Guido van Rossum73624e91994-10-10 17:59:00 +00003011static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 sock_addr_t addrbuf;
3015 int res;
3016 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 if (!getsockaddrlen(s, &addrlen))
3019 return NULL;
3020 memset(&addrbuf, 0, addrlen);
3021 Py_BEGIN_ALLOW_THREADS
3022 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3023 Py_END_ALLOW_THREADS
3024 if (res < 0)
3025 return s->errorhandler();
3026 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3027 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003028}
3029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003031"getsockname() -> address info\n\
3032\n\
3033Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003034info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003035
Guido van Rossumc89705d1992-11-26 08:54:07 +00003036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003038/* s.getpeername() method */
3039
Guido van Rossum73624e91994-10-10 17:59:00 +00003040static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003041sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 sock_addr_t addrbuf;
3044 int res;
3045 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 if (!getsockaddrlen(s, &addrlen))
3048 return NULL;
3049 memset(&addrbuf, 0, addrlen);
3050 Py_BEGIN_ALLOW_THREADS
3051 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3052 Py_END_ALLOW_THREADS
3053 if (res < 0)
3054 return s->errorhandler();
3055 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3056 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003057}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003059PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003060"getpeername() -> address info\n\
3061\n\
3062Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003063info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003064
Guido van Rossumb6775db1994-08-01 11:34:53 +00003065#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003066
3067
Guido van Rossum30a685f1991-06-27 15:51:29 +00003068/* s.listen(n) method */
3069
Guido van Rossum73624e91994-10-10 17:59:00 +00003070static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003071sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003072{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003073 /* We try to choose a default backlog high enough to avoid connection drops
3074 * for common workloads, yet not too high to limit resource usage. */
3075 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003077
Charles-François Natali644b8f52014-05-22 19:45:39 +01003078 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003082 /* To avoid problems on systems that don't allow a negative backlog
3083 * (which doesn't make sense anyway) we force a minimum value of 0. */
3084 if (backlog < 0)
3085 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 res = listen(s->sock_fd, backlog);
3087 Py_END_ALLOW_THREADS
3088 if (res < 0)
3089 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003090 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003091}
3092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003093PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003094"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003095\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003096Enable a server to accept connections. If backlog is specified, it must be\n\
3097at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003098unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003099connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003100
Victor Stinner31bf2d52015-04-01 21:57:09 +02003101struct sock_recv {
3102 char *cbuf;
3103 Py_ssize_t len;
3104 int flags;
3105 Py_ssize_t result;
3106};
3107
3108static int
3109sock_recv_impl(PySocketSockObject *s, void *data)
3110{
3111 struct sock_recv *ctx = data;
3112
3113#ifdef MS_WINDOWS
3114 if (ctx->len > INT_MAX)
3115 ctx->len = INT_MAX;
3116 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3117#else
3118 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3119#endif
3120 return (ctx->result >= 0);
3121}
3122
Guido van Rossum82a5c661998-07-07 20:45:43 +00003123
Thomas Wouters477c8d52006-05-27 19:21:47 +00003124/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003125 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003126 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003127 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003128 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129 * also possible that we return a number of bytes smaller than the request
3130 * bytes.
3131 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003132
Antoine Pitrou19467d22010-08-17 19:33:30 +00003133static Py_ssize_t
3134sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003136 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 if (!IS_SELECTABLE(s)) {
3139 select_error();
3140 return -1;
3141 }
3142 if (len == 0) {
3143 /* If 0 bytes were requested, do nothing. */
3144 return 0;
3145 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003146
Victor Stinner31bf2d52015-04-01 21:57:09 +02003147 ctx.cbuf = cbuf;
3148 ctx.len = len;
3149 ctx.flags = flags;
3150 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003152
3153 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003154}
3155
Guido van Rossum48a680c2001-03-02 06:34:14 +00003156
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003157/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003158
Guido van Rossum73624e91994-10-10 17:59:00 +00003159static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003160sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003161{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003162 Py_ssize_t recvlen, outlen;
3163 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003165
Antoine Pitrou19467d22010-08-17 19:33:30 +00003166 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 if (recvlen < 0) {
3170 PyErr_SetString(PyExc_ValueError,
3171 "negative buffersize in recv");
3172 return NULL;
3173 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 /* Allocate a new string. */
3176 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3177 if (buf == NULL)
3178 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 /* Call the guts */
3181 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3182 if (outlen < 0) {
3183 /* An error occurred, release the string and return an
3184 error. */
3185 Py_DECREF(buf);
3186 return NULL;
3187 }
3188 if (outlen != recvlen) {
3189 /* We did not read as many bytes as we anticipated, resize the
3190 string if possible and be successful. */
3191 _PyBytes_Resize(&buf, outlen);
3192 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003195}
3196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003197PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003198"recv(buffersize[, flags]) -> data\n\
3199\n\
3200Receive up to buffersize bytes from the socket. For the optional flags\n\
3201argument, see the Unix manual. When no data is available, block until\n\
3202at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003203the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003204
Guido van Rossum30a685f1991-06-27 15:51:29 +00003205
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003206/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003207
Thomas Wouters477c8d52006-05-27 19:21:47 +00003208static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003209sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003212
Antoine Pitrou19467d22010-08-17 19:33:30 +00003213 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 Py_buffer pbuf;
3215 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003216 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003219 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 &pbuf, &recvlen, &flags))
3221 return NULL;
3222 buf = pbuf.buf;
3223 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 if (recvlen < 0) {
3226 PyBuffer_Release(&pbuf);
3227 PyErr_SetString(PyExc_ValueError,
3228 "negative buffersize in recv_into");
3229 return NULL;
3230 }
3231 if (recvlen == 0) {
3232 /* If nbytes was not specified, use the buffer's length */
3233 recvlen = buflen;
3234 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 /* Check if the buffer is large enough */
3237 if (buflen < recvlen) {
3238 PyBuffer_Release(&pbuf);
3239 PyErr_SetString(PyExc_ValueError,
3240 "buffer too small for requested bytes");
3241 return NULL;
3242 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 /* Call the guts */
3245 readlen = sock_recv_guts(s, buf, recvlen, flags);
3246 if (readlen < 0) {
3247 /* Return an error. */
3248 PyBuffer_Release(&pbuf);
3249 return NULL;
3250 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 PyBuffer_Release(&pbuf);
3253 /* Return the number of bytes read. Note that we do not do anything
3254 special here in the case that readlen < recvlen. */
3255 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256}
3257
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003258PyDoc_STRVAR(recv_into_doc,
3259"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003260\n\
3261A version of recv() that stores its data into a buffer rather than creating \n\
3262a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3263is not specified (or 0), receive up to the size available in the given buffer.\n\
3264\n\
3265See recv() for documentation about the flags.");
3266
Victor Stinner31bf2d52015-04-01 21:57:09 +02003267struct sock_recvfrom {
3268 char* cbuf;
3269 Py_ssize_t len;
3270 int flags;
3271 socklen_t *addrlen;
3272 sock_addr_t *addrbuf;
3273 Py_ssize_t result;
3274};
3275
3276static int
3277sock_recvfrom_impl(PySocketSockObject *s, void *data)
3278{
3279 struct sock_recvfrom *ctx = data;
3280
3281 memset(ctx->addrbuf, 0, *ctx->addrlen);
3282
3283#ifdef MS_WINDOWS
3284 if (ctx->len > INT_MAX)
3285 ctx->len = INT_MAX;
3286 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3287 SAS2SA(ctx->addrbuf), ctx->addrlen);
3288#else
3289 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3290 SAS2SA(ctx->addrbuf), ctx->addrlen);
3291#endif
3292 return (ctx->result >= 0);
3293}
3294
Thomas Wouters477c8d52006-05-27 19:21:47 +00003295
3296/*
Christian Heimes99170a52007-12-19 02:07:34 +00003297 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3298 * into a char buffer. If you have any inc/def ref to do to the objects that
3299 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003300 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003301 * that it is also possible that we return a number of bytes smaller than the
3302 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003303 *
3304 * 'addr' is a return value for the address object. Note that you must decref
3305 * it yourself.
3306 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003307static Py_ssize_t
3308sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003313 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 if (!getsockaddrlen(s, &addrlen))
3318 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 if (!IS_SELECTABLE(s)) {
3321 select_error();
3322 return -1;
3323 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003324
Victor Stinner31bf2d52015-04-01 21:57:09 +02003325 ctx.cbuf = cbuf;
3326 ctx.len = len;
3327 ctx.flags = flags;
3328 ctx.addrbuf = &addrbuf;
3329 ctx.addrlen = &addrlen;
3330 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003332
Victor Stinner31bf2d52015-04-01 21:57:09 +02003333 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3334 s->sock_proto);
3335 if (*addr == NULL)
3336 return -1;
3337
3338 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003339}
3340
3341/* s.recvfrom(nbytes [,flags]) method */
3342
3343static PyObject *
3344sock_recvfrom(PySocketSockObject *s, PyObject *args)
3345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 PyObject *buf = NULL;
3347 PyObject *addr = NULL;
3348 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003349 int flags = 0;
3350 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003351
Antoine Pitrou19467d22010-08-17 19:33:30 +00003352 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (recvlen < 0) {
3356 PyErr_SetString(PyExc_ValueError,
3357 "negative buffersize in recvfrom");
3358 return NULL;
3359 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3362 if (buf == NULL)
3363 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3366 recvlen, flags, &addr);
3367 if (outlen < 0) {
3368 goto finally;
3369 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 if (outlen != recvlen) {
3372 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003373 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003375 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 goto finally;
3377 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003380
3381finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 Py_XDECREF(buf);
3383 Py_XDECREF(addr);
3384 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003385}
3386
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003387PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003388"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3389\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003390Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003391
Thomas Wouters477c8d52006-05-27 19:21:47 +00003392
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003393/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003394
3395static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003396sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003399
Antoine Pitrou19467d22010-08-17 19:33:30 +00003400 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 Py_buffer pbuf;
3402 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003403 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003406
Antoine Pitrou19467d22010-08-17 19:33:30 +00003407 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 kwlist, &pbuf,
3409 &recvlen, &flags))
3410 return NULL;
3411 buf = pbuf.buf;
3412 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 if (recvlen < 0) {
3415 PyBuffer_Release(&pbuf);
3416 PyErr_SetString(PyExc_ValueError,
3417 "negative buffersize in recvfrom_into");
3418 return NULL;
3419 }
3420 if (recvlen == 0) {
3421 /* If nbytes was not specified, use the buffer's length */
3422 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003423 } else if (recvlen > buflen) {
3424 PyBuffer_Release(&pbuf);
3425 PyErr_SetString(PyExc_ValueError,
3426 "nbytes is greater than the length of the buffer");
3427 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3431 if (readlen < 0) {
3432 PyBuffer_Release(&pbuf);
3433 /* Return an error */
3434 Py_XDECREF(addr);
3435 return NULL;
3436 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 PyBuffer_Release(&pbuf);
3439 /* Return the number of bytes read and the address. Note that we do
3440 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003441 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003442}
3443
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003444PyDoc_STRVAR(recvfrom_into_doc,
3445"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003446\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003447Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003448
Victor Stinner35bee932015-04-02 12:28:07 +02003449/* The sendmsg() and recvmsg[_into]() methods require a working
3450 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3451#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003452struct sock_recvmsg {
3453 struct msghdr *msg;
3454 int flags;
3455 ssize_t result;
3456};
3457
3458static int
3459sock_recvmsg_impl(PySocketSockObject *s, void *data)
3460{
3461 struct sock_recvmsg *ctx = data;
3462
3463 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3464 return (ctx->result >= 0);
3465}
3466
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003467/*
3468 * Call recvmsg() with the supplied iovec structures, flags, and
3469 * ancillary data buffer size (controllen). Returns the tuple return
3470 * value for recvmsg() or recvmsg_into(), with the first item provided
3471 * by the supplied makeval() function. makeval() will be called with
3472 * the length read and makeval_data as arguments, and must return a
3473 * new reference (which will be decrefed if there is a subsequent
3474 * error). On error, closes any file descriptors received via
3475 * SCM_RIGHTS.
3476 */
3477static PyObject *
3478sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3479 int flags, Py_ssize_t controllen,
3480 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3481{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003482 sock_addr_t addrbuf;
3483 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003484 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485 PyObject *cmsg_list = NULL, *retval = NULL;
3486 void *controlbuf = NULL;
3487 struct cmsghdr *cmsgh;
3488 size_t cmsgdatalen = 0;
3489 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003490 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003491
3492 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3493 ignored" when the socket is connected (Linux fills them in
3494 anyway for AF_UNIX sockets at least). Normally msg_namelen
3495 seems to be set to 0 if there's no address, but try to
3496 initialize msg_name to something that won't be mistaken for a
3497 real address if that doesn't happen. */
3498 if (!getsockaddrlen(s, &addrbuflen))
3499 return NULL;
3500 memset(&addrbuf, 0, addrbuflen);
3501 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3502
3503 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3504 PyErr_SetString(PyExc_ValueError,
3505 "invalid ancillary data buffer length");
3506 return NULL;
3507 }
3508 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3509 return PyErr_NoMemory();
3510
3511 /* Make the system call. */
3512 if (!IS_SELECTABLE(s)) {
3513 select_error();
3514 goto finally;
3515 }
3516
Victor Stinner31bf2d52015-04-01 21:57:09 +02003517 msg.msg_name = SAS2SA(&addrbuf);
3518 msg.msg_namelen = addrbuflen;
3519 msg.msg_iov = iov;
3520 msg.msg_iovlen = iovlen;
3521 msg.msg_control = controlbuf;
3522 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003523
Victor Stinner31bf2d52015-04-01 21:57:09 +02003524 ctx.msg = &msg;
3525 ctx.flags = flags;
3526 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003527 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003528
3529 /* Make list of (level, type, data) tuples from control messages. */
3530 if ((cmsg_list = PyList_New(0)) == NULL)
3531 goto err_closefds;
3532 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3533 implementations didn't do so. */
3534 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3535 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3536 PyObject *bytes, *tuple;
3537 int tmp;
3538
3539 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3540 if (cmsg_status != 0) {
3541 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3542 "received malformed or improperly-truncated "
3543 "ancillary data", 1) == -1)
3544 goto err_closefds;
3545 }
3546 if (cmsg_status < 0)
3547 break;
3548 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003549 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003550 goto err_closefds;
3551 }
3552
3553 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3554 cmsgdatalen);
3555 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3556 (int)cmsgh->cmsg_type, bytes);
3557 if (tuple == NULL)
3558 goto err_closefds;
3559 tmp = PyList_Append(cmsg_list, tuple);
3560 Py_DECREF(tuple);
3561 if (tmp != 0)
3562 goto err_closefds;
3563
3564 if (cmsg_status != 0)
3565 break;
3566 }
3567
3568 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003569 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003570 cmsg_list,
3571 (int)msg.msg_flags,
3572 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3573 ((msg.msg_namelen > addrbuflen) ?
3574 addrbuflen : msg.msg_namelen),
3575 s->sock_proto));
3576 if (retval == NULL)
3577 goto err_closefds;
3578
3579finally:
3580 Py_XDECREF(cmsg_list);
3581 PyMem_Free(controlbuf);
3582 return retval;
3583
3584err_closefds:
3585#ifdef SCM_RIGHTS
3586 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3587 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3588 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3589 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3590 if (cmsg_status < 0)
3591 break;
3592 if (cmsgh->cmsg_level == SOL_SOCKET &&
3593 cmsgh->cmsg_type == SCM_RIGHTS) {
3594 size_t numfds;
3595 int *fdp;
3596
3597 numfds = cmsgdatalen / sizeof(int);
3598 fdp = (int *)CMSG_DATA(cmsgh);
3599 while (numfds-- > 0)
3600 close(*fdp++);
3601 }
3602 if (cmsg_status != 0)
3603 break;
3604 }
3605#endif /* SCM_RIGHTS */
3606 goto finally;
3607}
3608
3609
3610static PyObject *
3611makeval_recvmsg(ssize_t received, void *data)
3612{
3613 PyObject **buf = data;
3614
3615 if (received < PyBytes_GET_SIZE(*buf))
3616 _PyBytes_Resize(buf, received);
3617 Py_XINCREF(*buf);
3618 return *buf;
3619}
3620
3621/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3622
3623static PyObject *
3624sock_recvmsg(PySocketSockObject *s, PyObject *args)
3625{
3626 Py_ssize_t bufsize, ancbufsize = 0;
3627 int flags = 0;
3628 struct iovec iov;
3629 PyObject *buf = NULL, *retval = NULL;
3630
3631 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3632 return NULL;
3633
3634 if (bufsize < 0) {
3635 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3636 return NULL;
3637 }
3638 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3639 return NULL;
3640 iov.iov_base = PyBytes_AS_STRING(buf);
3641 iov.iov_len = bufsize;
3642
3643 /* Note that we're passing a pointer to *our pointer* to the bytes
3644 object here (&buf); makeval_recvmsg() may incref the object, or
3645 deallocate it and set our pointer to NULL. */
3646 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3647 &makeval_recvmsg, &buf);
3648 Py_XDECREF(buf);
3649 return retval;
3650}
3651
3652PyDoc_STRVAR(recvmsg_doc,
3653"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3654\n\
3655Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3656socket. The ancbufsize argument sets the size in bytes of the\n\
3657internal buffer used to receive the ancillary data; it defaults to 0,\n\
3658meaning that no ancillary data will be received. Appropriate buffer\n\
3659sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3660CMSG_LEN(), and items which do not fit into the buffer might be\n\
3661truncated or discarded. The flags argument defaults to 0 and has the\n\
3662same meaning as for recv().\n\
3663\n\
3664The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3665The data item is a bytes object holding the non-ancillary data\n\
3666received. The ancdata item is a list of zero or more tuples\n\
3667(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3668(control messages) received: cmsg_level and cmsg_type are integers\n\
3669specifying the protocol level and protocol-specific type respectively,\n\
3670and cmsg_data is a bytes object holding the associated data. The\n\
3671msg_flags item is the bitwise OR of various flags indicating\n\
3672conditions on the received message; see your system documentation for\n\
3673details. If the receiving socket is unconnected, address is the\n\
3674address of the sending socket, if available; otherwise, its value is\n\
3675unspecified.\n\
3676\n\
3677If recvmsg() raises an exception after the system call returns, it\n\
3678will first attempt to close any file descriptors received via the\n\
3679SCM_RIGHTS mechanism.");
3680
3681
3682static PyObject *
3683makeval_recvmsg_into(ssize_t received, void *data)
3684{
3685 return PyLong_FromSsize_t(received);
3686}
3687
3688/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3689
3690static PyObject *
3691sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3692{
3693 Py_ssize_t ancbufsize = 0;
3694 int flags = 0;
3695 struct iovec *iovs = NULL;
3696 Py_ssize_t i, nitems, nbufs = 0;
3697 Py_buffer *bufs = NULL;
3698 PyObject *buffers_arg, *fast, *retval = NULL;
3699
3700 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3701 &buffers_arg, &ancbufsize, &flags))
3702 return NULL;
3703
3704 if ((fast = PySequence_Fast(buffers_arg,
3705 "recvmsg_into() argument 1 must be an "
3706 "iterable")) == NULL)
3707 return NULL;
3708 nitems = PySequence_Fast_GET_SIZE(fast);
3709 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003710 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003711 goto finally;
3712 }
3713
3714 /* Fill in an iovec for each item, and save the Py_buffer
3715 structs to release afterwards. */
3716 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3717 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3718 PyErr_NoMemory();
3719 goto finally;
3720 }
3721 for (; nbufs < nitems; nbufs++) {
3722 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3723 "w*;recvmsg_into() argument 1 must be an iterable "
3724 "of single-segment read-write buffers",
3725 &bufs[nbufs]))
3726 goto finally;
3727 iovs[nbufs].iov_base = bufs[nbufs].buf;
3728 iovs[nbufs].iov_len = bufs[nbufs].len;
3729 }
3730
3731 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3732 &makeval_recvmsg_into, NULL);
3733finally:
3734 for (i = 0; i < nbufs; i++)
3735 PyBuffer_Release(&bufs[i]);
3736 PyMem_Free(bufs);
3737 PyMem_Free(iovs);
3738 Py_DECREF(fast);
3739 return retval;
3740}
3741
3742PyDoc_STRVAR(recvmsg_into_doc,
3743"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3744\n\
3745Receive normal data and ancillary data from the socket, scattering the\n\
3746non-ancillary data into a series of buffers. The buffers argument\n\
3747must be an iterable of objects that export writable buffers\n\
3748(e.g. bytearray objects); these will be filled with successive chunks\n\
3749of the non-ancillary data until it has all been written or there are\n\
3750no more buffers. The ancbufsize argument sets the size in bytes of\n\
3751the internal buffer used to receive the ancillary data; it defaults to\n\
37520, meaning that no ancillary data will be received. Appropriate\n\
3753buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3754or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3755truncated or discarded. The flags argument defaults to 0 and has the\n\
3756same meaning as for recv().\n\
3757\n\
3758The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3759The nbytes item is the total number of bytes of non-ancillary data\n\
3760written into the buffers. The ancdata item is a list of zero or more\n\
3761tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3762data (control messages) received: cmsg_level and cmsg_type are\n\
3763integers specifying the protocol level and protocol-specific type\n\
3764respectively, and cmsg_data is a bytes object holding the associated\n\
3765data. The msg_flags item is the bitwise OR of various flags\n\
3766indicating conditions on the received message; see your system\n\
3767documentation for details. If the receiving socket is unconnected,\n\
3768address is the address of the sending socket, if available; otherwise,\n\
3769its value is unspecified.\n\
3770\n\
3771If recvmsg_into() raises an exception after the system call returns,\n\
3772it will first attempt to close any file descriptors received via the\n\
3773SCM_RIGHTS mechanism.");
3774#endif /* CMSG_LEN */
3775
3776
Victor Stinner31bf2d52015-04-01 21:57:09 +02003777struct sock_send {
3778 char *buf;
3779 Py_ssize_t len;
3780 int flags;
3781 Py_ssize_t result;
3782};
3783
3784static int
3785sock_send_impl(PySocketSockObject *s, void *data)
3786{
3787 struct sock_send *ctx = data;
3788
3789#ifdef MS_WINDOWS
3790 if (ctx->len > INT_MAX)
3791 ctx->len = INT_MAX;
3792 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3793#else
3794 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3795#endif
3796 return (ctx->result >= 0);
3797}
3798
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003799/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003800
Guido van Rossum73624e91994-10-10 17:59:00 +00003801static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003802sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003803{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003804 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003806 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3809 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 if (!IS_SELECTABLE(s)) {
3812 PyBuffer_Release(&pbuf);
3813 return select_error();
3814 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003815 ctx.buf = pbuf.buf;
3816 ctx.len = pbuf.len;
3817 ctx.flags = flags;
3818 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003819 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 return NULL;
3821 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003822 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003823
3824 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003825}
3826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003827PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003828"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003829\n\
3830Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003831argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003832sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003833
3834
3835/* s.sendall(data [,flags]) method */
3836
3837static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003838sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003841 Py_ssize_t len, n;
3842 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003844 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003845 int has_timeout = (s->sock_timeout > 0);
3846 _PyTime_t interval = s->sock_timeout;
3847 _PyTime_t deadline = 0;
3848 int deadline_initialized = 0;
3849 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3852 return NULL;
3853 buf = pbuf.buf;
3854 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 if (!IS_SELECTABLE(s)) {
3857 PyBuffer_Release(&pbuf);
3858 return select_error();
3859 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003861 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003862 if (has_timeout) {
3863 if (deadline_initialized) {
3864 /* recompute the timeout */
3865 interval = deadline - _PyTime_GetMonotonicClock();
3866 }
3867 else {
3868 deadline_initialized = 1;
3869 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3870 }
3871
3872 if (interval <= 0) {
3873 PyErr_SetString(socket_timeout, "timed out");
3874 goto done;
3875 }
3876 }
3877
Victor Stinner02f32ab2015-04-01 22:53:26 +02003878 ctx.buf = buf;
3879 ctx.len = len;
3880 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003881 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3882 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003883 n = ctx.result;
3884 assert(n >= 0);
3885
3886 buf += n;
3887 len -= n;
3888
3889 /* We must run our signal handlers before looping again.
3890 send() can return a successful partial write when it is
3891 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003892 if (PyErr_CheckSignals())
3893 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003894 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003896
Victor Stinner8912d142015-04-06 23:16:34 +02003897 Py_INCREF(Py_None);
3898 res = Py_None;
3899
3900done:
3901 PyBuffer_Release(&pbuf);
3902 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003903}
3904
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003905PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003906"sendall(data[, flags])\n\
3907\n\
3908Send a data string to the socket. For the optional flags\n\
3909argument, see the Unix manual. This calls send() repeatedly\n\
3910until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003912
Guido van Rossum30a685f1991-06-27 15:51:29 +00003913
Victor Stinner31bf2d52015-04-01 21:57:09 +02003914struct sock_sendto {
3915 char *buf;
3916 Py_ssize_t len;
3917 int flags;
3918 int addrlen;
3919 sock_addr_t *addrbuf;
3920 Py_ssize_t result;
3921};
3922
3923static int
3924sock_sendto_impl(PySocketSockObject *s, void *data)
3925{
3926 struct sock_sendto *ctx = data;
3927
3928#ifdef MS_WINDOWS
3929 if (ctx->len > INT_MAX)
3930 ctx->len = INT_MAX;
3931 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3932 SAS2SA(ctx->addrbuf), ctx->addrlen);
3933#else
3934 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3935 SAS2SA(ctx->addrbuf), ctx->addrlen);
3936#endif
3937 return (ctx->result >= 0);
3938}
3939
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003940/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003941
Guido van Rossum73624e91994-10-10 17:59:00 +00003942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003943sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 Py_buffer pbuf;
3946 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003947 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003949 int addrlen, flags;
3950 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003953 arglen = PyTuple_Size(args);
3954 switch (arglen) {
3955 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003956 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3957 return NULL;
3958 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003959 break;
3960 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003961 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3962 &pbuf, &flags, &addro)) {
3963 return NULL;
3964 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003965 break;
3966 default:
3967 PyErr_Format(PyExc_TypeError,
3968 "sendto() takes 2 or 3 arguments (%d given)",
3969 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003970 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 if (!IS_SELECTABLE(s)) {
3974 PyBuffer_Release(&pbuf);
3975 return select_error();
3976 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3979 PyBuffer_Release(&pbuf);
3980 return NULL;
3981 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003982
Victor Stinner31bf2d52015-04-01 21:57:09 +02003983 ctx.buf = pbuf.buf;
3984 ctx.len = pbuf.len;
3985 ctx.flags = flags;
3986 ctx.addrlen = addrlen;
3987 ctx.addrbuf = &addrbuf;
3988 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003989 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003990 return NULL;
3991 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003992 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003993
3994 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003995}
3996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003997PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003998"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003999\n\
4000Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004001For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004002
Guido van Rossum30a685f1991-06-27 15:51:29 +00004003
Victor Stinner35bee932015-04-02 12:28:07 +02004004/* The sendmsg() and recvmsg[_into]() methods require a working
4005 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4006#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004007struct sock_sendmsg {
4008 struct msghdr *msg;
4009 int flags;
4010 ssize_t result;
4011};
4012
4013static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004014sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4015 struct msghdr *msg,
4016 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4017 Py_ssize_t ndataparts, ndatabufs = 0;
4018 int result = -1;
4019 struct iovec *iovs = NULL;
4020 PyObject *data_fast = NULL;
4021 Py_buffer *databufs = NULL;
4022
4023 /* Fill in an iovec for each message part, and save the Py_buffer
4024 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004025 data_fast = PySequence_Fast(data_arg,
4026 "sendmsg() argument 1 must be an "
4027 "iterable");
4028 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004029 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004030 }
4031
Christian Heimesdffa3942016-09-05 23:54:41 +02004032 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4033 if (ndataparts > INT_MAX) {
4034 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4035 goto finally;
4036 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004037
Christian Heimesdffa3942016-09-05 23:54:41 +02004038 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004039 if (ndataparts > 0) {
4040 iovs = PyMem_New(struct iovec, ndataparts);
4041 if (iovs == NULL) {
4042 PyErr_NoMemory();
4043 goto finally;
4044 }
4045 msg->msg_iov = iovs;
4046
4047 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004048 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004049 PyErr_NoMemory();
4050 goto finally;
4051 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004052 }
4053 for (; ndatabufs < ndataparts; ndatabufs++) {
4054 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4055 "y*;sendmsg() argument 1 must be an iterable of "
4056 "bytes-like objects",
4057 &databufs[ndatabufs]))
4058 goto finally;
4059 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4060 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4061 }
4062 result = 0;
4063 finally:
4064 *databufsout = databufs;
4065 *ndatabufsout = ndatabufs;
4066 Py_XDECREF(data_fast);
4067 return result;
4068}
4069
4070static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004071sock_sendmsg_impl(PySocketSockObject *s, void *data)
4072{
4073 struct sock_sendmsg *ctx = data;
4074
4075 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4076 return (ctx->result >= 0);
4077}
4078
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004079/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4080
4081static PyObject *
4082sock_sendmsg(PySocketSockObject *s, PyObject *args)
4083{
Christian Heimesdffa3942016-09-05 23:54:41 +02004084 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004085 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004086 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004087 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004088 struct cmsginfo {
4089 int level;
4090 int type;
4091 Py_buffer data;
4092 } *cmsgs = NULL;
4093 void *controlbuf = NULL;
4094 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004095 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004096 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004098 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004099
4100 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004101 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004103 }
4104
4105 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004106
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004107 /* Parse destination address. */
4108 if (addr_arg != NULL && addr_arg != Py_None) {
4109 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4110 goto finally;
4111 msg.msg_name = &addrbuf;
4112 msg.msg_namelen = addrlen;
4113 }
4114
4115 /* Fill in an iovec for each message part, and save the Py_buffer
4116 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004117 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004118 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119 }
4120
4121 if (cmsg_arg == NULL)
4122 ncmsgs = 0;
4123 else {
4124 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4125 "sendmsg() argument 2 must be an "
4126 "iterable")) == NULL)
4127 goto finally;
4128 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4129 }
4130
4131#ifndef CMSG_SPACE
4132 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004133 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004134 "sending multiple control messages is not supported "
4135 "on this system");
4136 goto finally;
4137 }
4138#endif
4139 /* Save level, type and Py_buffer for each control message,
4140 and calculate total size. */
4141 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4142 PyErr_NoMemory();
4143 goto finally;
4144 }
4145 controllen = controllen_last = 0;
4146 while (ncmsgbufs < ncmsgs) {
4147 size_t bufsize, space;
4148
4149 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4150 "(iiy*):[sendmsg() ancillary data items]",
4151 &cmsgs[ncmsgbufs].level,
4152 &cmsgs[ncmsgbufs].type,
4153 &cmsgs[ncmsgbufs].data))
4154 goto finally;
4155 bufsize = cmsgs[ncmsgbufs++].data.len;
4156
4157#ifdef CMSG_SPACE
4158 if (!get_CMSG_SPACE(bufsize, &space)) {
4159#else
4160 if (!get_CMSG_LEN(bufsize, &space)) {
4161#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004162 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004163 goto finally;
4164 }
4165 controllen += space;
4166 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004167 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004168 goto finally;
4169 }
4170 controllen_last = controllen;
4171 }
4172
4173 /* Construct ancillary data block from control message info. */
4174 if (ncmsgbufs > 0) {
4175 struct cmsghdr *cmsgh = NULL;
4176
Victor Stinner52d61e42016-09-12 11:41:58 +02004177 controlbuf = PyMem_Malloc(controllen);
4178 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004179 PyErr_NoMemory();
4180 goto finally;
4181 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004182 msg.msg_control = controlbuf;
4183
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004184 msg.msg_controllen = controllen;
4185
4186 /* Need to zero out the buffer as a workaround for glibc's
4187 CMSG_NXTHDR() implementation. After getting the pointer to
4188 the next header, it checks its (uninitialized) cmsg_len
4189 member to see if the "message" fits in the buffer, and
4190 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004191 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004192 memset(controlbuf, 0, controllen);
4193
4194 for (i = 0; i < ncmsgbufs; i++) {
4195 size_t msg_len, data_len = cmsgs[i].data.len;
4196 int enough_space = 0;
4197
4198 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4199 if (cmsgh == NULL) {
4200 PyErr_Format(PyExc_RuntimeError,
4201 "unexpected NULL result from %s()",
4202 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4203 goto finally;
4204 }
4205 if (!get_CMSG_LEN(data_len, &msg_len)) {
4206 PyErr_SetString(PyExc_RuntimeError,
4207 "item size out of range for CMSG_LEN()");
4208 goto finally;
4209 }
4210 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4211 size_t space;
4212
4213 cmsgh->cmsg_len = msg_len;
4214 if (get_cmsg_data_space(&msg, cmsgh, &space))
4215 enough_space = (space >= data_len);
4216 }
4217 if (!enough_space) {
4218 PyErr_SetString(PyExc_RuntimeError,
4219 "ancillary data does not fit in calculated "
4220 "space");
4221 goto finally;
4222 }
4223 cmsgh->cmsg_level = cmsgs[i].level;
4224 cmsgh->cmsg_type = cmsgs[i].type;
4225 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4226 }
4227 }
4228
4229 /* Make the system call. */
4230 if (!IS_SELECTABLE(s)) {
4231 select_error();
4232 goto finally;
4233 }
4234
Victor Stinner31bf2d52015-04-01 21:57:09 +02004235 ctx.msg = &msg;
4236 ctx.flags = flags;
4237 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004238 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004239
4240 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004241
4242finally:
4243 PyMem_Free(controlbuf);
4244 for (i = 0; i < ncmsgbufs; i++)
4245 PyBuffer_Release(&cmsgs[i].data);
4246 PyMem_Free(cmsgs);
4247 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004248 PyMem_Free(msg.msg_iov);
4249 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004250 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004251 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004252 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004253 return retval;
4254}
4255
4256PyDoc_STRVAR(sendmsg_doc,
4257"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4258\n\
4259Send normal and ancillary data to the socket, gathering the\n\
4260non-ancillary data from a series of buffers and concatenating it into\n\
4261a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004262data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004263The ancdata argument specifies the ancillary data (control messages)\n\
4264as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4265cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4266protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004267is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004268argument defaults to 0 and has the same meaning as for send(). If\n\
4269address is supplied and not None, it sets a destination address for\n\
4270the message. The return value is the number of bytes of non-ancillary\n\
4271data sent.");
4272#endif /* CMSG_LEN */
4273
Christian Heimesdffa3942016-09-05 23:54:41 +02004274#ifdef HAVE_SOCKADDR_ALG
4275static PyObject*
4276sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4277{
4278 PyObject *retval = NULL;
4279
4280 Py_ssize_t i, ndatabufs = 0;
4281 Py_buffer *databufs = NULL;
4282 PyObject *data_arg = NULL;
4283
4284 Py_buffer iv = {NULL, NULL};
4285
4286 PyObject *opobj = NULL;
4287 int op = -1;
4288
4289 PyObject *assoclenobj = NULL;
4290 int assoclen = -1;
4291
4292 unsigned int *uiptr;
4293 int flags = 0;
4294
4295 struct msghdr msg;
4296 struct cmsghdr *header = NULL;
4297 struct af_alg_iv *alg_iv = NULL;
4298 struct sock_sendmsg ctx;
4299 Py_ssize_t controllen;
4300 void *controlbuf = NULL;
4301 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4302
4303 if (self->sock_family != AF_ALG) {
4304 PyErr_SetString(PyExc_OSError,
4305 "algset is only supported for AF_ALG");
4306 return NULL;
4307 }
4308
4309 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4310 "|O$O!y*O!i:sendmsg_afalg", keywords,
4311 &data_arg,
4312 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004313 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004314 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004315 }
4316
4317 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004318
4319 /* op is a required, keyword-only argument >= 0 */
4320 if (opobj != NULL) {
4321 op = _PyLong_AsInt(opobj);
4322 }
4323 if (op < 0) {
4324 /* override exception from _PyLong_AsInt() */
4325 PyErr_SetString(PyExc_TypeError,
4326 "Invalid or missing argument 'op'");
4327 goto finally;
4328 }
4329 /* assoclen is optional but must be >= 0 */
4330 if (assoclenobj != NULL) {
4331 assoclen = _PyLong_AsInt(assoclenobj);
4332 if (assoclen == -1 && PyErr_Occurred()) {
4333 goto finally;
4334 }
4335 if (assoclen < 0) {
4336 PyErr_SetString(PyExc_TypeError,
4337 "assoclen must be positive");
4338 goto finally;
4339 }
4340 }
4341
4342 controllen = CMSG_SPACE(4);
4343 if (iv.buf != NULL) {
4344 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4345 }
4346 if (assoclen >= 0) {
4347 controllen += CMSG_SPACE(4);
4348 }
4349
4350 controlbuf = PyMem_Malloc(controllen);
4351 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004352 PyErr_NoMemory();
4353 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004354 }
4355 memset(controlbuf, 0, controllen);
4356
Christian Heimesdffa3942016-09-05 23:54:41 +02004357 msg.msg_controllen = controllen;
4358 msg.msg_control = controlbuf;
4359
4360 /* Fill in an iovec for each message part, and save the Py_buffer
4361 structs to release afterwards. */
4362 if (data_arg != NULL) {
4363 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4364 goto finally;
4365 }
4366 }
4367
4368 /* set operation to encrypt or decrypt */
4369 header = CMSG_FIRSTHDR(&msg);
4370 if (header == NULL) {
4371 PyErr_SetString(PyExc_RuntimeError,
4372 "unexpected NULL result from CMSG_FIRSTHDR");
4373 goto finally;
4374 }
4375 header->cmsg_level = SOL_ALG;
4376 header->cmsg_type = ALG_SET_OP;
4377 header->cmsg_len = CMSG_LEN(4);
4378 uiptr = (void*)CMSG_DATA(header);
4379 *uiptr = (unsigned int)op;
4380
4381 /* set initialization vector */
4382 if (iv.buf != NULL) {
4383 header = CMSG_NXTHDR(&msg, header);
4384 if (header == NULL) {
4385 PyErr_SetString(PyExc_RuntimeError,
4386 "unexpected NULL result from CMSG_NXTHDR(iv)");
4387 goto finally;
4388 }
4389 header->cmsg_level = SOL_ALG;
4390 header->cmsg_type = ALG_SET_IV;
4391 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4392 alg_iv = (void*)CMSG_DATA(header);
4393 alg_iv->ivlen = iv.len;
4394 memcpy(alg_iv->iv, iv.buf, iv.len);
4395 }
4396
4397 /* set length of associated data for AEAD */
4398 if (assoclen >= 0) {
4399 header = CMSG_NXTHDR(&msg, header);
4400 if (header == NULL) {
4401 PyErr_SetString(PyExc_RuntimeError,
4402 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4403 goto finally;
4404 }
4405 header->cmsg_level = SOL_ALG;
4406 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4407 header->cmsg_len = CMSG_LEN(4);
4408 uiptr = (void*)CMSG_DATA(header);
4409 *uiptr = (unsigned int)assoclen;
4410 }
4411
4412 ctx.msg = &msg;
4413 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004414 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004415 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004416 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004417
4418 retval = PyLong_FromSsize_t(ctx.result);
4419
4420 finally:
4421 PyMem_Free(controlbuf);
4422 if (iv.buf != NULL) {
4423 PyBuffer_Release(&iv);
4424 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004425 PyMem_Free(msg.msg_iov);
4426 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004427 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004428 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004429 PyMem_Free(databufs);
4430 return retval;
4431}
4432
4433PyDoc_STRVAR(sendmsg_afalg_doc,
4434"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4435\n\
4436Set operation mode, IV and length of associated data for an AF_ALG\n\
4437operation socket.");
4438#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439
Guido van Rossum30a685f1991-06-27 15:51:29 +00004440/* s.shutdown(how) method */
4441
Guido van Rossum73624e91994-10-10 17:59:00 +00004442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004443sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 int how;
4446 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004447
Serhiy Storchaka78980432013-01-15 01:12:17 +02004448 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 if (how == -1 && PyErr_Occurred())
4450 return NULL;
4451 Py_BEGIN_ALLOW_THREADS
4452 res = shutdown(s->sock_fd, how);
4453 Py_END_ALLOW_THREADS
4454 if (res < 0)
4455 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004456 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004457}
4458
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004459PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004460"shutdown(flag)\n\
4461\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004462Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4463of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004464
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004465#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004466static PyObject*
4467sock_ioctl(PySocketSockObject *s, PyObject *arg)
4468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 unsigned long cmd = SIO_RCVALL;
4470 PyObject *argO;
4471 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4474 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 switch (cmd) {
4477 case SIO_RCVALL: {
4478 unsigned int option = RCVALL_ON;
4479 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4480 return NULL;
4481 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4482 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4483 return set_error();
4484 }
4485 return PyLong_FromUnsignedLong(recv); }
4486 case SIO_KEEPALIVE_VALS: {
4487 struct tcp_keepalive ka;
4488 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4489 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4490 return NULL;
4491 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4492 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4493 return set_error();
4494 }
4495 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004496#if defined(SIO_LOOPBACK_FAST_PATH)
4497 case SIO_LOOPBACK_FAST_PATH: {
4498 unsigned int option;
4499 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4500 return NULL;
4501 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4502 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4503 return set_error();
4504 }
4505 return PyLong_FromUnsignedLong(recv); }
4506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 default:
4508 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4509 return NULL;
4510 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004511}
4512PyDoc_STRVAR(sock_ioctl_doc,
4513"ioctl(cmd, option) -> long\n\
4514\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004515Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4516SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004517SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4518SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004519#endif
4520
4521#if defined(MS_WINDOWS)
4522static PyObject*
4523sock_share(PySocketSockObject *s, PyObject *arg)
4524{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004525 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004526 DWORD processId;
4527 int result;
4528
4529 if (!PyArg_ParseTuple(arg, "I", &processId))
4530 return NULL;
4531
4532 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004533 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004534 Py_END_ALLOW_THREADS
4535 if (result == SOCKET_ERROR)
4536 return set_error();
4537 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4538}
4539PyDoc_STRVAR(sock_share_doc,
4540"share(process_id) -> bytes\n\
4541\n\
4542Share the socket with another process. The target process id\n\
4543must be provided and the resulting bytes object passed to the target\n\
4544process. There the shared socket can be instantiated by calling\n\
4545socket.fromshare().");
4546
Christian Heimesfaf2f632008-01-06 16:59:19 +00004547
4548#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004549
4550/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004551
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004552static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4554 accept_doc},
4555 {"bind", (PyCFunction)sock_bind, METH_O,
4556 bind_doc},
4557 {"close", (PyCFunction)sock_close, METH_NOARGS,
4558 close_doc},
4559 {"connect", (PyCFunction)sock_connect, METH_O,
4560 connect_doc},
4561 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4562 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004563 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4564 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4566 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004567#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 {"getpeername", (PyCFunction)sock_getpeername,
4569 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 {"getsockname", (PyCFunction)sock_getsockname,
4572 METH_NOARGS, getsockname_doc},
4573 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4574 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004575#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4577 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004578#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004579#if defined(MS_WINDOWS)
4580 {"share", (PyCFunction)sock_share, METH_VARARGS,
4581 sock_share_doc},
4582#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004583 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 listen_doc},
4585 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4586 recv_doc},
4587 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4588 recv_into_doc},
4589 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4590 recvfrom_doc},
4591 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4592 recvfrom_into_doc},
4593 {"send", (PyCFunction)sock_send, METH_VARARGS,
4594 send_doc},
4595 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4596 sendall_doc},
4597 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4598 sendto_doc},
4599 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4600 setblocking_doc},
4601 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4602 settimeout_doc},
4603 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4604 gettimeout_doc},
4605 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4606 setsockopt_doc},
4607 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4608 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004609#ifdef CMSG_LEN
4610 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4611 recvmsg_doc},
4612 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4613 recvmsg_into_doc,},
4614 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4615 sendmsg_doc},
4616#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004617#ifdef HAVE_SOCKADDR_ALG
4618 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4619 sendmsg_afalg_doc},
4620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004622};
4623
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004624/* SockObject members */
4625static PyMemberDef sock_memberlist[] = {
4626 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4627 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4628 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004629 {0},
4630};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004631
Victor Stinner71694d52015-03-28 01:18:54 +01004632static PyGetSetDef sock_getsetlist[] = {
4633 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4634 {NULL} /* sentinel */
4635};
4636
Guido van Rossum73624e91994-10-10 17:59:00 +00004637/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004638 First close the file description. */
4639
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004640static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004641sock_finalize(PySocketSockObject *s)
4642{
4643 SOCKET_T fd;
4644 PyObject *error_type, *error_value, *error_traceback;
4645
4646 /* Save the current exception, if any. */
4647 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4648
Victor Stinnerd3afb622016-07-22 17:47:09 +02004649 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004650 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4651 /* Spurious errors can appear at shutdown */
4652 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4653 PyErr_WriteUnraisable((PyObject *)s);
4654 }
4655 }
4656
4657 /* Only close the socket *after* logging the ResourceWarning warning
4658 to allow the logger to call socket methods like
4659 socket.getsockname(). If the socket is closed before, socket
4660 methods fails with the EBADF error. */
4661 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004662 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004663
4664 /* We do not want to retry upon EINTR: see sock_close() */
4665 Py_BEGIN_ALLOW_THREADS
4666 (void) SOCKETCLOSE(fd);
4667 Py_END_ALLOW_THREADS
4668 }
4669
4670 /* Restore the saved exception. */
4671 PyErr_Restore(error_type, error_value, error_traceback);
4672}
4673
4674static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004675sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004676{
Victor Stinner19a8e842016-03-21 16:36:48 +01004677 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4678 return;
4679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004681}
4682
Guido van Rossum30a685f1991-06-27 15:51:29 +00004683
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004684static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004685sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004686{
Victor Stinnere254e532014-07-26 14:36:55 +02004687 long sock_fd;
4688 /* On Windows, this test is needed because SOCKET_T is unsigned */
4689 if (s->sock_fd == INVALID_SOCKET) {
4690 sock_fd = -1;
4691 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004692#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004693 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 /* this can occur on Win64, and actually there is a special
4695 ugly printf formatter for decimal pointer length integer
4696 printing, only bother if necessary*/
4697 PyErr_SetString(PyExc_OverflowError,
4698 "no printf formatter to display "
4699 "the socket descriptor in decimal");
4700 return NULL;
4701 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004702#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004703 else
4704 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 return PyUnicode_FromFormat(
4706 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004707 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 s->sock_type,
4709 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004710}
4711
4712
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004713/* Create a new, uninitialized socket object. */
4714
4715static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004716sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 new = type->tp_alloc(type, 0);
4721 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004722 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004723 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 ((PySocketSockObject *)new)->errorhandler = &set_error;
4725 }
4726 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004727}
4728
4729
4730/* Initialize a new socket object. */
4731
Victor Stinnerdaf45552013-08-28 00:53:59 +02004732#ifdef SOCK_CLOEXEC
4733/* socket() and socketpair() fail with EINVAL on Linux kernel older
4734 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4735static int sock_cloexec_works = -1;
4736#endif
4737
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004738/*ARGSUSED*/
4739static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004740sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 PySocketSockObject *s = (PySocketSockObject *)self;
4743 PyObject *fdobj = NULL;
4744 SOCKET_T fd = INVALID_SOCKET;
4745 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4746 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004747#ifndef MS_WINDOWS
4748#ifdef SOCK_CLOEXEC
4749 int *atomic_flag_works = &sock_cloexec_works;
4750#else
4751 int *atomic_flag_works = NULL;
4752#endif
4753#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4756 "|iiiO:socket", keywords,
4757 &family, &type, &proto, &fdobj))
4758 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004761#ifdef MS_WINDOWS
4762 /* recreate a socket that was duplicated */
4763 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004764 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004765 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4766 PyErr_Format(PyExc_ValueError,
4767 "socket descriptor string has wrong size, "
4768 "should be %zu bytes.", sizeof(info));
4769 return -1;
4770 }
4771 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4772 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004773 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004774 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4775 Py_END_ALLOW_THREADS
4776 if (fd == INVALID_SOCKET) {
4777 set_error();
4778 return -1;
4779 }
4780 family = info.iAddressFamily;
4781 type = info.iSocketType;
4782 proto = info.iProtocol;
4783 }
4784 else
4785#endif
4786 {
4787 fd = PyLong_AsSocket_t(fdobj);
4788 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4789 return -1;
4790 if (fd == INVALID_SOCKET) {
4791 PyErr_SetString(PyExc_ValueError,
4792 "can't use invalid socket value");
4793 return -1;
4794 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 }
4796 }
4797 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004798#ifdef MS_WINDOWS
4799 /* Windows implementation */
4800#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4801#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4802#endif
4803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004805 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004806 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004807 NULL, 0,
4808 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4809 if (fd == INVALID_SOCKET) {
4810 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4811 support_wsa_no_inherit = 0;
4812 fd = socket(family, type, proto);
4813 }
4814 }
4815 else {
4816 fd = socket(family, type, proto);
4817 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 if (fd == INVALID_SOCKET) {
4821 set_error();
4822 return -1;
4823 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004824
4825 if (!support_wsa_no_inherit) {
4826 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4827 closesocket(fd);
4828 PyErr_SetFromWindowsErr(0);
4829 return -1;
4830 }
4831 }
4832#else
4833 /* UNIX */
4834 Py_BEGIN_ALLOW_THREADS
4835#ifdef SOCK_CLOEXEC
4836 if (sock_cloexec_works != 0) {
4837 fd = socket(family, type | SOCK_CLOEXEC, proto);
4838 if (sock_cloexec_works == -1) {
4839 if (fd >= 0) {
4840 sock_cloexec_works = 1;
4841 }
4842 else if (errno == EINVAL) {
4843 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4844 sock_cloexec_works = 0;
4845 fd = socket(family, type, proto);
4846 }
4847 }
4848 }
4849 else
4850#endif
4851 {
4852 fd = socket(family, type, proto);
4853 }
4854 Py_END_ALLOW_THREADS
4855
4856 if (fd == INVALID_SOCKET) {
4857 set_error();
4858 return -1;
4859 }
4860
4861 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4862 SOCKETCLOSE(fd);
4863 return -1;
4864 }
4865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004867 if (init_sockobject(s, fd, family, type, proto) == -1) {
4868 SOCKETCLOSE(fd);
4869 return -1;
4870 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004873
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004874}
4875
4876
Guido van Rossumb6775db1994-08-01 11:34:53 +00004877/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004878
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004879static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4881 "_socket.socket", /* tp_name */
4882 sizeof(PySocketSockObject), /* tp_basicsize */
4883 0, /* tp_itemsize */
4884 (destructor)sock_dealloc, /* tp_dealloc */
4885 0, /* tp_print */
4886 0, /* tp_getattr */
4887 0, /* tp_setattr */
4888 0, /* tp_reserved */
4889 (reprfunc)sock_repr, /* tp_repr */
4890 0, /* tp_as_number */
4891 0, /* tp_as_sequence */
4892 0, /* tp_as_mapping */
4893 0, /* tp_hash */
4894 0, /* tp_call */
4895 0, /* tp_str */
4896 PyObject_GenericGetAttr, /* tp_getattro */
4897 0, /* tp_setattro */
4898 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004899 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4900 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 sock_doc, /* tp_doc */
4902 0, /* tp_traverse */
4903 0, /* tp_clear */
4904 0, /* tp_richcompare */
4905 0, /* tp_weaklistoffset */
4906 0, /* tp_iter */
4907 0, /* tp_iternext */
4908 sock_methods, /* tp_methods */
4909 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004910 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 0, /* tp_base */
4912 0, /* tp_dict */
4913 0, /* tp_descr_get */
4914 0, /* tp_descr_set */
4915 0, /* tp_dictoffset */
4916 sock_initobj, /* tp_init */
4917 PyType_GenericAlloc, /* tp_alloc */
4918 sock_new, /* tp_new */
4919 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004920 0, /* tp_is_gc */
4921 0, /* tp_bases */
4922 0, /* tp_mro */
4923 0, /* tp_cache */
4924 0, /* tp_subclasses */
4925 0, /* tp_weaklist */
4926 0, /* tp_del */
4927 0, /* tp_version_tag */
4928 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004929};
4930
Guido van Rossum30a685f1991-06-27 15:51:29 +00004931
Guido van Rossum81194471991-07-27 21:42:02 +00004932/* Python interface to gethostname(). */
4933
4934/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004935static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004936socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004937{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004938#ifdef MS_WINDOWS
4939 /* Don't use winsock's gethostname, as this returns the ANSI
4940 version of the hostname, whereas we need a Unicode string.
4941 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004942 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004943 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004944 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004945 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004946
4947 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004948 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004949
4950 if (GetLastError() != ERROR_MORE_DATA)
4951 return PyErr_SetFromWindowsErr(0);
4952
4953 if (size == 0)
4954 return PyUnicode_New(0, 0);
4955
4956 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4957 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004958 name = PyMem_New(wchar_t, size);
4959 if (!name) {
4960 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004961 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004962 }
Victor Stinner74168972011-11-17 01:11:36 +01004963 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4964 name,
4965 &size))
4966 {
4967 PyMem_Free(name);
4968 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004969 }
Victor Stinner74168972011-11-17 01:11:36 +01004970
4971 result = PyUnicode_FromWideChar(name, size);
4972 PyMem_Free(name);
4973 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004974#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 char buf[1024];
4976 int res;
4977 Py_BEGIN_ALLOW_THREADS
4978 res = gethostname(buf, (int) sizeof buf - 1);
4979 Py_END_ALLOW_THREADS
4980 if (res < 0)
4981 return set_error();
4982 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004983 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004984#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004985}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004987PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004988"gethostname() -> string\n\
4989\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004990Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004991
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004992#ifdef HAVE_SETHOSTNAME
4993PyDoc_STRVAR(sethostname_doc,
4994"sethostname(name)\n\n\
4995Sets the hostname to name.");
4996
4997static PyObject *
4998socket_sethostname(PyObject *self, PyObject *args)
4999{
5000 PyObject *hnobj;
5001 Py_buffer buf;
5002 int res, flag = 0;
5003
Christian Heimesd2774c72013-06-19 02:06:29 +02005004#ifdef _AIX
5005/* issue #18259, not declared in any useful header file */
5006extern int sethostname(const char *, size_t);
5007#endif
5008
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005009 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5010 PyErr_Clear();
5011 if (!PyArg_ParseTuple(args, "O&:sethostname",
5012 PyUnicode_FSConverter, &hnobj))
5013 return NULL;
5014 flag = 1;
5015 }
5016 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5017 if (!res) {
5018 res = sethostname(buf.buf, buf.len);
5019 PyBuffer_Release(&buf);
5020 }
5021 if (flag)
5022 Py_DECREF(hnobj);
5023 if (res)
5024 return set_error();
5025 Py_RETURN_NONE;
5026}
5027#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005028
Guido van Rossum30a685f1991-06-27 15:51:29 +00005029/* Python interface to gethostbyname(name). */
5030
5031/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005033socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 char *name;
5036 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005037 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005038
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005039 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 return NULL;
5041 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005042 goto finally;
5043 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5044finally:
5045 PyMem_Free(name);
5046 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005047}
5048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005049PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005050"gethostbyname(host) -> address\n\
5051\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005052Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005053
5054
Victor Stinner72400302016-01-28 15:41:01 +01005055static PyObject*
5056sock_decode_hostname(const char *name)
5057{
5058#ifdef MS_WINDOWS
5059 /* Issue #26227: gethostbyaddr() returns a string encoded
5060 * to the ANSI code page */
5061 return PyUnicode_DecodeFSDefault(name);
5062#else
5063 /* Decode from UTF-8 */
5064 return PyUnicode_FromString(name);
5065#endif
5066}
5067
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005068/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5069
5070static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005071gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 char **pch;
5074 PyObject *rtn_tuple = (PyObject *)NULL;
5075 PyObject *name_list = (PyObject *)NULL;
5076 PyObject *addr_list = (PyObject *)NULL;
5077 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005078 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 if (h == NULL) {
5081 /* Let's get real error message to return */
5082 set_herror(h_errno);
5083 return NULL;
5084 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 if (h->h_addrtype != af) {
5087 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005088 errno = EAFNOSUPPORT;
5089 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 return NULL;
5091 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 case AF_INET:
5096 if (alen < sizeof(struct sockaddr_in))
5097 return NULL;
5098 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005099
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005100#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 case AF_INET6:
5102 if (alen < sizeof(struct sockaddr_in6))
5103 return NULL;
5104 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005105#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 if ((name_list = PyList_New(0)) == NULL)
5110 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 if ((addr_list = PyList_New(0)) == NULL)
5113 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 /* SF #1511317: h_aliases can be NULL */
5116 if (h->h_aliases) {
5117 for (pch = h->h_aliases; *pch != NULL; pch++) {
5118 int status;
5119 tmp = PyUnicode_FromString(*pch);
5120 if (tmp == NULL)
5121 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 status = PyList_Append(name_list, tmp);
5124 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 if (status)
5127 goto err;
5128 }
5129 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5132 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 case AF_INET:
5137 {
5138 struct sockaddr_in sin;
5139 memset(&sin, 0, sizeof(sin));
5140 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005141#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5145 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 if (pch == h->h_addr_list && alen >= sizeof(sin))
5148 memcpy((char *) addr, &sin, sizeof(sin));
5149 break;
5150 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005151
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005152#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 case AF_INET6:
5154 {
5155 struct sockaddr_in6 sin6;
5156 memset(&sin6, 0, sizeof(sin6));
5157 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005158#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5162 tmp = makeipaddr((struct sockaddr *)&sin6,
5163 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5166 memcpy((char *) addr, &sin6, sizeof(sin6));
5167 break;
5168 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005169#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005172 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 "unsupported address family");
5174 return NULL;
5175 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 if (tmp == NULL)
5178 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 status = PyList_Append(addr_list, tmp);
5181 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 if (status)
5184 goto err;
5185 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005186
Victor Stinner72400302016-01-28 15:41:01 +01005187 name = sock_decode_hostname(h->h_name);
5188 if (name == NULL)
5189 goto err;
5190 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005191
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005192 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 Py_XDECREF(name_list);
5194 Py_XDECREF(addr_list);
5195 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005196}
5197
5198
5199/* Python interface to gethostbyname_ex(name). */
5200
5201/*ARGSUSED*/
5202static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005203socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 char *name;
5206 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005207 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005209 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005210#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005212#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005214#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 char buf[16384];
5216 int buf_len = (sizeof buf) - 1;
5217 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005218#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005219#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005221#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005222#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005223
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005224 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005226 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005227 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005229#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005230#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005231 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005233#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005235#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 memset((void *) &data, '\0', sizeof(data));
5237 result = gethostbyname_r(name, &hp_allocated, &data);
5238 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005239#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005240#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005241#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005243#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005244 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005246#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 Py_END_ALLOW_THREADS
5248 /* Some C libraries would require addr.__ss_family instead of
5249 addr.ss_family.
5250 Therefore, we cast the sockaddr_storage into sockaddr to
5251 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005252 sa = SAS2SA(&addr);
5253 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005255#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005257#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005258finally:
5259 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005261}
5262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005263PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005264"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5265\n\
5266Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005267for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005268
5269
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005270/* Python interface to gethostbyaddr(IP). */
5271
5272/*ARGSUSED*/
5273static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005274socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005275{
Charles-François Natali8b759652011-12-23 16:44:51 +01005276 sock_addr_t addr;
5277 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 char *ip_num;
5279 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005280 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005281#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005283#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005285#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 /* glibcs up to 2.10 assume that the buf argument to
5287 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5288 does not ensure. The attribute below instructs the compiler
5289 to maintain this alignment. */
5290 char buf[16384] Py_ALIGNED(8);
5291 int buf_len = (sizeof buf) - 1;
5292 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005293#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005294#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005296#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005297#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 char *ap;
5299 int al;
5300 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005301
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005302 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 return NULL;
5304 af = AF_UNSPEC;
5305 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005306 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 af = sa->sa_family;
5308 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005309 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 switch (af) {
5311 case AF_INET:
5312 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5313 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5314 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005315#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 case AF_INET6:
5317 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5318 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5319 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005322 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005323 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 }
5325 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005326#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005327#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005328 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 &hp_allocated, buf, buf_len,
5330 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005331#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 h = gethostbyaddr_r(ap, al, af,
5333 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005334#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 memset((void *) &data, '\0', sizeof(data));
5336 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5337 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005338#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005339#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005340#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005342#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005343 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005345#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005347 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005348#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005350#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005351finally:
5352 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005354}
5355
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005356PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005357"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5358\n\
5359Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005360for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005361
Guido van Rossum30a685f1991-06-27 15:51:29 +00005362
5363/* Python interface to getservbyname(name).
5364 This only returns the port number, since the other info is already
5365 known or not useful (like the list of aliases). */
5366
5367/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005368static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005369socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 char *name, *proto=NULL;
5372 struct servent *sp;
5373 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5374 return NULL;
5375 Py_BEGIN_ALLOW_THREADS
5376 sp = getservbyname(name, proto);
5377 Py_END_ALLOW_THREADS
5378 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005379 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 return NULL;
5381 }
5382 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005383}
5384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005385PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005386"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005387\n\
5388Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005389The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5390otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005391
Guido van Rossum30a685f1991-06-27 15:51:29 +00005392
Barry Warsaw11b91a02004-06-28 00:50:43 +00005393/* Python interface to getservbyport(port).
5394 This only returns the service name, since the other info is already
5395 known or not useful (like the list of aliases). */
5396
5397/*ARGSUSED*/
5398static PyObject *
5399socket_getservbyport(PyObject *self, PyObject *args)
5400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 int port;
5402 char *proto=NULL;
5403 struct servent *sp;
5404 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5405 return NULL;
5406 if (port < 0 || port > 0xffff) {
5407 PyErr_SetString(
5408 PyExc_OverflowError,
5409 "getservbyport: port must be 0-65535.");
5410 return NULL;
5411 }
5412 Py_BEGIN_ALLOW_THREADS
5413 sp = getservbyport(htons((short)port), proto);
5414 Py_END_ALLOW_THREADS
5415 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005416 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 return NULL;
5418 }
5419 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005420}
5421
5422PyDoc_STRVAR(getservbyport_doc,
5423"getservbyport(port[, protocolname]) -> string\n\
5424\n\
5425Return the service name from a port number and protocol name.\n\
5426The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5427otherwise any protocol will match.");
5428
Guido van Rossum3901d851996-12-19 16:35:04 +00005429/* Python interface to getprotobyname(name).
5430 This only returns the protocol number, since the other info is
5431 already known or not useful (like the list of aliases). */
5432
5433/*ARGSUSED*/
5434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005435socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 char *name;
5438 struct protoent *sp;
5439 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5440 return NULL;
5441 Py_BEGIN_ALLOW_THREADS
5442 sp = getprotobyname(name);
5443 Py_END_ALLOW_THREADS
5444 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005445 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 return NULL;
5447 }
5448 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005449}
5450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005451PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005452"getprotobyname(name) -> integer\n\
5453\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005454Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005455
Guido van Rossum3901d851996-12-19 16:35:04 +00005456
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005457#ifndef NO_DUP
5458/* dup() function for socket fds */
5459
5460static PyObject *
5461socket_dup(PyObject *self, PyObject *fdobj)
5462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 SOCKET_T fd, newfd;
5464 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005465#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005466 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005467#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 fd = PyLong_AsSocket_t(fdobj);
5470 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5471 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005472
Victor Stinnerdaf45552013-08-28 00:53:59 +02005473#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005474 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005475 return set_error();
5476
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005477 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005478 FROM_PROTOCOL_INFO,
5479 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 if (newfd == INVALID_SOCKET)
5481 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005482
Victor Stinnerdaf45552013-08-28 00:53:59 +02005483 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5484 closesocket(newfd);
5485 PyErr_SetFromWindowsErr(0);
5486 return NULL;
5487 }
5488#else
5489 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5490 newfd = _Py_dup(fd);
5491 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005492 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005493#endif
5494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 newfdobj = PyLong_FromSocket_t(newfd);
5496 if (newfdobj == NULL)
5497 SOCKETCLOSE(newfd);
5498 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005499}
5500
5501PyDoc_STRVAR(dup_doc,
5502"dup(integer) -> integer\n\
5503\n\
5504Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5505sockets; on some platforms os.dup() won't work for socket file descriptors.");
5506#endif
5507
5508
Dave Cole331708b2004-08-09 04:51:41 +00005509#ifdef HAVE_SOCKETPAIR
5510/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005511 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005512 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005513
5514/*ARGSUSED*/
5515static PyObject *
5516socket_socketpair(PyObject *self, PyObject *args)
5517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 PySocketSockObject *s0 = NULL, *s1 = NULL;
5519 SOCKET_T sv[2];
5520 int family, type = SOCK_STREAM, proto = 0;
5521 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005522#ifdef SOCK_CLOEXEC
5523 int *atomic_flag_works = &sock_cloexec_works;
5524#else
5525 int *atomic_flag_works = NULL;
5526#endif
5527 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005528
5529#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005531#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5535 &family, &type, &proto))
5536 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005539 Py_BEGIN_ALLOW_THREADS
5540#ifdef SOCK_CLOEXEC
5541 if (sock_cloexec_works != 0) {
5542 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5543 if (sock_cloexec_works == -1) {
5544 if (ret >= 0) {
5545 sock_cloexec_works = 1;
5546 }
5547 else if (errno == EINVAL) {
5548 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5549 sock_cloexec_works = 0;
5550 ret = socketpair(family, type, proto, sv);
5551 }
5552 }
5553 }
5554 else
5555#endif
5556 {
5557 ret = socketpair(family, type, proto, sv);
5558 }
5559 Py_END_ALLOW_THREADS
5560
5561 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005563
5564 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5565 goto finally;
5566 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5567 goto finally;
5568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 s0 = new_sockobject(sv[0], family, type, proto);
5570 if (s0 == NULL)
5571 goto finally;
5572 s1 = new_sockobject(sv[1], family, type, proto);
5573 if (s1 == NULL)
5574 goto finally;
5575 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005576
5577finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 if (res == NULL) {
5579 if (s0 == NULL)
5580 SOCKETCLOSE(sv[0]);
5581 if (s1 == NULL)
5582 SOCKETCLOSE(sv[1]);
5583 }
5584 Py_XDECREF(s0);
5585 Py_XDECREF(s1);
5586 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005587}
5588
5589PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005590"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005591\n\
5592Create a pair of socket objects from the sockets returned by the platform\n\
5593socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005594The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005595AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005596
5597#endif /* HAVE_SOCKETPAIR */
5598
5599
Guido van Rossum006bf911996-06-12 04:04:55 +00005600static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005601socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005602{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005603 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005604
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005605 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 return NULL;
5607 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005608 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005610 "ntohs: can't convert negative Python int to C "
5611 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 return NULL;
5613 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005614 if (x > 0xffff) {
5615 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5616 "ntohs: Python int too large to convert to C "
5617 "16-bit unsigned integer (The silent truncation "
5618 "is deprecated)",
5619 1)) {
5620 return NULL;
5621 }
5622 }
5623 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005624}
5625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005626PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005627"ntohs(integer) -> integer\n\
5628\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005629Convert a 16-bit unsigned integer from network to host byte order.\n\
5630Note that in case the received integer does not fit in 16-bit unsigned\n\
5631integer, but does fit in a positive C int, it is silently truncated to\n\
563216-bit unsigned integer.\n\
5633However, this silent truncation feature is deprecated, and will raise an \n\
5634exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005635
5636
Guido van Rossum006bf911996-06-12 04:04:55 +00005637static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005638socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 if (PyLong_Check(arg)) {
5643 x = PyLong_AsUnsignedLong(arg);
5644 if (x == (unsigned long) -1 && PyErr_Occurred())
5645 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005646#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 {
5648 unsigned long y;
5649 /* only want the trailing 32 bits */
5650 y = x & 0xFFFFFFFFUL;
5651 if (y ^ x)
5652 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005653 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 x = y;
5655 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 }
5658 else
5659 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005660 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005663}
5664
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005665PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005666"ntohl(integer) -> integer\n\
5667\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005668Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005669
5670
Guido van Rossum006bf911996-06-12 04:04:55 +00005671static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005672socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005673{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005674 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005675
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005676 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 return NULL;
5678 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005679 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005681 "htons: can't convert negative Python int to C "
5682 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 return NULL;
5684 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005685 if (x > 0xffff) {
5686 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5687 "htons: Python int too large to convert to C "
5688 "16-bit unsigned integer (The silent truncation "
5689 "is deprecated)",
5690 1)) {
5691 return NULL;
5692 }
5693 }
5694 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005695}
5696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005697PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005698"htons(integer) -> integer\n\
5699\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005700Convert a 16-bit unsigned integer from host to network byte order.\n\
5701Note that in case the received integer does not fit in 16-bit unsigned\n\
5702integer, but does fit in a positive C int, it is silently truncated to\n\
570316-bit unsigned integer.\n\
5704However, this silent truncation feature is deprecated, and will raise an \n\
5705exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005706
5707
Guido van Rossum006bf911996-06-12 04:04:55 +00005708static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005709socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 if (PyLong_Check(arg)) {
5714 x = PyLong_AsUnsignedLong(arg);
5715 if (x == (unsigned long) -1 && PyErr_Occurred())
5716 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005717#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 {
5719 unsigned long y;
5720 /* only want the trailing 32 bits */
5721 y = x & 0xFFFFFFFFUL;
5722 if (y ^ x)
5723 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005724 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 x = y;
5726 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 }
5729 else
5730 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005731 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 Py_TYPE(arg)->tp_name);
5733 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005734}
5735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005736PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005737"htonl(integer) -> integer\n\
5738\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005739Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005740
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005741/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005743PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005744"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005745\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005746Convert 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 +00005747binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005748
5749static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005750socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005751{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005752#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005754#endif
5755
5756#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005757#if (SIZEOF_INT != 4)
5758#error "Not sure if in_addr_t exists and int is not 32-bits."
5759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 /* Have to use inet_addr() instead */
5761 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5766 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005767
Tim Peters1df9fdd2003-02-13 03:13:40 +00005768
5769#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005770
5771#ifdef USE_INET_ATON_WEAKLINK
5772 if (inet_aton != NULL) {
5773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 if (inet_aton(ip_addr, &buf))
5775 return PyBytes_FromStringAndSize((char *)(&buf),
5776 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005777
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005778 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 "illegal IP address string passed to inet_aton");
5780 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005781
Thomas Wouters477c8d52006-05-27 19:21:47 +00005782#ifdef USE_INET_ATON_WEAKLINK
5783 } else {
5784#endif
5785
5786#endif
5787
5788#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 /* special-case this address as inet_addr might return INADDR_NONE
5791 * for this */
5792 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005793 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005795
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005796 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005800 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 "illegal IP address string passed to inet_aton");
5802 return NULL;
5803 }
5804 }
5805 return PyBytes_FromStringAndSize((char *) &packed_addr,
5806 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005807
5808#ifdef USE_INET_ATON_WEAKLINK
5809 }
5810#endif
5811
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005812#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005813}
5814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005815PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005816"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005817\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005818Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005819
5820static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005821socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005822{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005823 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005825
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005826 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 return NULL;
5828 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005829
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005830 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005831 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005833 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005836
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005837 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5838 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005839
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005840 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005842}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005843
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005844#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005845
5846PyDoc_STRVAR(inet_pton_doc,
5847"inet_pton(af, ip) -> packed IP address string\n\
5848\n\
5849Convert an IP address from string format to a packed string suitable\n\
5850for use with low-level network functions.");
5851
5852static PyObject *
5853socket_inet_pton(PyObject *self, PyObject *args)
5854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 int af;
5856 char* ip;
5857 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005858#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005859 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005860#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5864 return NULL;
5865 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005866
Martin v. Löwis04697e82004-06-02 12:35:29 +00005867#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005869 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870 "can't use AF_INET6, IPv6 is disabled");
5871 return NULL;
5872 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005873#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 retval = inet_pton(af, ip, packed);
5876 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005877 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 return NULL;
5879 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005880 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 "illegal IP address string passed to inet_pton");
5882 return NULL;
5883 } else if (af == AF_INET) {
5884 return PyBytes_FromStringAndSize(packed,
5885 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005886#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 } else if (af == AF_INET6) {
5888 return PyBytes_FromStringAndSize(packed,
5889 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005892 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893 return NULL;
5894 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005895}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005896
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005897PyDoc_STRVAR(inet_ntop_doc,
5898"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5899\n\
5900Convert a packed IP address of the given family to string format.");
5901
5902static PyObject *
5903socket_inet_ntop(PyObject *self, PyObject *args)
5904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005906 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005908#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005909 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005910#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005912#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5915 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005916
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005917 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 return NULL;
5919 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005922 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 PyErr_SetString(PyExc_ValueError,
5924 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005925 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 return NULL;
5927 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005928#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005930 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 PyErr_SetString(PyExc_ValueError,
5932 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005933 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 return NULL;
5935 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 } else {
5938 PyErr_Format(PyExc_ValueError,
5939 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005940 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 return NULL;
5942 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005943
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005944 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5945 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005947 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 return NULL;
5949 } else {
5950 return PyUnicode_FromString(retval);
5951 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005952}
5953
5954#endif /* HAVE_INET_PTON */
5955
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005956/* Python interface to getaddrinfo(host, port). */
5957
5958/*ARGSUSED*/
5959static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005960socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005961{
Victor Stinner77af1722011-05-26 14:05:59 +02005962 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005963 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 struct addrinfo hints, *res;
5965 struct addrinfo *res0 = NULL;
5966 PyObject *hobj = NULL;
5967 PyObject *pobj = (PyObject *)NULL;
5968 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005969 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 int family, socktype, protocol, flags;
5971 int error;
5972 PyObject *all = (PyObject *)NULL;
5973 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005974
Georg Brandl6083a4b2013-10-14 06:51:46 +02005975 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005977 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005978 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979 &protocol, &flags)) {
5980 return NULL;
5981 }
5982 if (hobj == Py_None) {
5983 hptr = NULL;
5984 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005985 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 if (!idna)
5987 return NULL;
5988 assert(PyBytes_Check(idna));
5989 hptr = PyBytes_AS_STRING(idna);
5990 } else if (PyBytes_Check(hobj)) {
5991 hptr = PyBytes_AsString(hobj);
5992 } else {
5993 PyErr_SetString(PyExc_TypeError,
5994 "getaddrinfo() argument 1 must be string or None");
5995 return NULL;
5996 }
5997 if (PyLong_CheckExact(pobj)) {
5998 long value = PyLong_AsLong(pobj);
5999 if (value == -1 && PyErr_Occurred())
6000 goto err;
6001 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6002 pptr = pbuf;
6003 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006004 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006005 if (pptr == NULL)
6006 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006008 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 } else if (pobj == Py_None) {
6010 pptr = (char *)NULL;
6011 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006012 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013 goto err;
6014 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006015#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006016 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6017 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006018 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6019 * This workaround avoids a segfault in libsystem.
6020 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006021 pptr = "00";
6022 }
6023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 memset(&hints, 0, sizeof(hints));
6025 hints.ai_family = family;
6026 hints.ai_socktype = socktype;
6027 hints.ai_protocol = protocol;
6028 hints.ai_flags = flags;
6029 Py_BEGIN_ALLOW_THREADS
6030 ACQUIRE_GETADDRINFO_LOCK
6031 error = getaddrinfo(hptr, pptr, &hints, &res0);
6032 Py_END_ALLOW_THREADS
6033 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6034 if (error) {
6035 set_gaierror(error);
6036 goto err;
6037 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006038
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006039 all = PyList_New(0);
6040 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 goto err;
6042 for (res = res0; res; res = res->ai_next) {
6043 PyObject *single;
6044 PyObject *addr =
6045 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6046 if (addr == NULL)
6047 goto err;
6048 single = Py_BuildValue("iiisO", res->ai_family,
6049 res->ai_socktype, res->ai_protocol,
6050 res->ai_canonname ? res->ai_canonname : "",
6051 addr);
6052 Py_DECREF(addr);
6053 if (single == NULL)
6054 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 if (PyList_Append(all, single))
6057 goto err;
6058 Py_XDECREF(single);
6059 }
6060 Py_XDECREF(idna);
6061 if (res0)
6062 freeaddrinfo(res0);
6063 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006064 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 Py_XDECREF(all);
6066 Py_XDECREF(idna);
6067 if (res0)
6068 freeaddrinfo(res0);
6069 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006070}
6071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006072PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006073"getaddrinfo(host, port [, family, type, proto, flags])\n\
6074 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006075\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006076Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006077
6078/* Python interface to getnameinfo(sa, flags). */
6079
6080/*ARGSUSED*/
6081static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006082socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 PyObject *sa = (PyObject *)NULL;
6085 int flags;
6086 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006087 int port;
6088 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6090 struct addrinfo hints, *res = NULL;
6091 int error;
6092 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006093 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 flags = flowinfo = scope_id = 0;
6096 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6097 return NULL;
6098 if (!PyTuple_Check(sa)) {
6099 PyErr_SetString(PyExc_TypeError,
6100 "getnameinfo() argument 1 must be a tuple");
6101 return NULL;
6102 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006103 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006105 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006107 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006108 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006109 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006110 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006111 return NULL;
6112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6114 memset(&hints, 0, sizeof(hints));
6115 hints.ai_family = AF_UNSPEC;
6116 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006117 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 Py_BEGIN_ALLOW_THREADS
6119 ACQUIRE_GETADDRINFO_LOCK
6120 error = getaddrinfo(hostp, pbuf, &hints, &res);
6121 Py_END_ALLOW_THREADS
6122 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6123 if (error) {
6124 set_gaierror(error);
6125 goto fail;
6126 }
6127 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006128 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 "sockaddr resolved to multiple addresses");
6130 goto fail;
6131 }
6132 switch (res->ai_family) {
6133 case AF_INET:
6134 {
6135 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006136 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 "IPv4 sockaddr must be 2 tuple");
6138 goto fail;
6139 }
6140 break;
6141 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006142#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 case AF_INET6:
6144 {
6145 struct sockaddr_in6 *sin6;
6146 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006147 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 sin6->sin6_scope_id = scope_id;
6149 break;
6150 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006153 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6155 if (error) {
6156 set_gaierror(error);
6157 goto fail;
6158 }
Victor Stinner72400302016-01-28 15:41:01 +01006159
6160 name = sock_decode_hostname(hbuf);
6161 if (name == NULL)
6162 goto fail;
6163 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006164
6165fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 if (res)
6167 freeaddrinfo(res);
6168 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169}
6170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006171PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006172"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006173\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006174Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006175
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006176
6177/* Python API to getting and setting the default timeout value. */
6178
6179static PyObject *
6180socket_getdefaulttimeout(PyObject *self)
6181{
Victor Stinner71694d52015-03-28 01:18:54 +01006182 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006183 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 }
Victor Stinner71694d52015-03-28 01:18:54 +01006185 else {
6186 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6187 return PyFloat_FromDouble(seconds);
6188 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006189}
6190
6191PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006192"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006193\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006194Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006195A value of None indicates that new socket objects have no timeout.\n\
6196When the socket module is first imported, the default is None.");
6197
6198static PyObject *
6199socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6200{
Victor Stinner71694d52015-03-28 01:18:54 +01006201 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006202
Victor Stinner71694d52015-03-28 01:18:54 +01006203 if (socket_parse_timeout(&timeout, arg) < 0)
6204 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006207
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006208 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006209}
6210
6211PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006212"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006213\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006214Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006215A value of None indicates that new socket objects have no timeout.\n\
6216When the socket module is first imported, the default is None.");
6217
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006218#ifdef HAVE_IF_NAMEINDEX
6219/* Python API for getting interface indices and names */
6220
6221static PyObject *
6222socket_if_nameindex(PyObject *self, PyObject *arg)
6223{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006224 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006225 int i;
6226 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006227
Charles-François Natali60713592011-05-20 16:55:06 +02006228 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006229 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006230 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006231 return NULL;
6232 }
6233
6234 list = PyList_New(0);
6235 if (list == NULL) {
6236 if_freenameindex(ni);
6237 return NULL;
6238 }
6239
Charles-François Natali60713592011-05-20 16:55:06 +02006240 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6241 PyObject *ni_tuple = Py_BuildValue("IO&",
6242 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006243
6244 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6245 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006246 Py_DECREF(list);
6247 if_freenameindex(ni);
6248 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006249 }
6250 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006251 }
6252
6253 if_freenameindex(ni);
6254 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006255}
6256
6257PyDoc_STRVAR(if_nameindex_doc,
6258"if_nameindex()\n\
6259\n\
6260Returns a list of network interface information (index, name) tuples.");
6261
Charles-François Natali60713592011-05-20 16:55:06 +02006262static PyObject *
6263socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006264{
Charles-François Natali60713592011-05-20 16:55:06 +02006265 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006266 unsigned long index;
6267
Charles-François Natali60713592011-05-20 16:55:06 +02006268 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6269 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006270 return NULL;
6271
Charles-François Natali60713592011-05-20 16:55:06 +02006272 index = if_nametoindex(PyBytes_AS_STRING(oname));
6273 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006274 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006275 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006276 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006277 return NULL;
6278 }
6279
6280 return PyLong_FromUnsignedLong(index);
6281}
6282
6283PyDoc_STRVAR(if_nametoindex_doc,
6284"if_nametoindex(if_name)\n\
6285\n\
6286Returns the interface index corresponding to the interface name if_name.");
6287
Charles-François Natali60713592011-05-20 16:55:06 +02006288static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006289socket_if_indextoname(PyObject *self, PyObject *arg)
6290{
Charles-François Natali60713592011-05-20 16:55:06 +02006291 unsigned long index;
6292 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006293
Charles-François Natali60713592011-05-20 16:55:06 +02006294 index = PyLong_AsUnsignedLong(arg);
6295 if (index == (unsigned long) -1)
6296 return NULL;
6297
6298 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006299 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006300 return NULL;
6301 }
6302
Charles-François Natali60713592011-05-20 16:55:06 +02006303 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006304}
6305
6306PyDoc_STRVAR(if_indextoname_doc,
6307"if_indextoname(if_index)\n\
6308\n\
6309Returns the interface name corresponding to the interface index if_index.");
6310
6311#endif /* HAVE_IF_NAMEINDEX */
6312
6313
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006314#ifdef CMSG_LEN
6315/* Python interface to CMSG_LEN(length). */
6316
6317static PyObject *
6318socket_CMSG_LEN(PyObject *self, PyObject *args)
6319{
6320 Py_ssize_t length;
6321 size_t result;
6322
6323 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6324 return NULL;
6325 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6326 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6327 return NULL;
6328 }
6329 return PyLong_FromSize_t(result);
6330}
6331
6332PyDoc_STRVAR(CMSG_LEN_doc,
6333"CMSG_LEN(length) -> control message length\n\
6334\n\
6335Return the total length, without trailing padding, of an ancillary\n\
6336data item with associated data of the given length. This value can\n\
6337often be used as the buffer size for recvmsg() to receive a single\n\
6338item of ancillary data, but RFC 3542 requires portable applications to\n\
6339use CMSG_SPACE() and thus include space for padding, even when the\n\
6340item will be the last in the buffer. Raises OverflowError if length\n\
6341is outside the permissible range of values.");
6342
6343
6344#ifdef CMSG_SPACE
6345/* Python interface to CMSG_SPACE(length). */
6346
6347static PyObject *
6348socket_CMSG_SPACE(PyObject *self, PyObject *args)
6349{
6350 Py_ssize_t length;
6351 size_t result;
6352
6353 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6354 return NULL;
6355 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6356 PyErr_SetString(PyExc_OverflowError,
6357 "CMSG_SPACE() argument out of range");
6358 return NULL;
6359 }
6360 return PyLong_FromSize_t(result);
6361}
6362
6363PyDoc_STRVAR(CMSG_SPACE_doc,
6364"CMSG_SPACE(length) -> buffer size\n\
6365\n\
6366Return the buffer size needed for recvmsg() to receive an ancillary\n\
6367data item with associated data of the given length, along with any\n\
6368trailing padding. The buffer space needed to receive multiple items\n\
6369is the sum of the CMSG_SPACE() values for their associated data\n\
6370lengths. Raises OverflowError if length is outside the permissible\n\
6371range of values.");
6372#endif /* CMSG_SPACE */
6373#endif /* CMSG_LEN */
6374
6375
Guido van Rossum30a685f1991-06-27 15:51:29 +00006376/* List of functions exported by this module. */
6377
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006378static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 {"gethostbyname", socket_gethostbyname,
6380 METH_VARARGS, gethostbyname_doc},
6381 {"gethostbyname_ex", socket_gethostbyname_ex,
6382 METH_VARARGS, ghbn_ex_doc},
6383 {"gethostbyaddr", socket_gethostbyaddr,
6384 METH_VARARGS, gethostbyaddr_doc},
6385 {"gethostname", socket_gethostname,
6386 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006387#ifdef HAVE_SETHOSTNAME
6388 {"sethostname", socket_sethostname,
6389 METH_VARARGS, sethostname_doc},
6390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 {"getservbyname", socket_getservbyname,
6392 METH_VARARGS, getservbyname_doc},
6393 {"getservbyport", socket_getservbyport,
6394 METH_VARARGS, getservbyport_doc},
6395 {"getprotobyname", socket_getprotobyname,
6396 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006397#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 {"dup", socket_dup,
6399 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006400#endif
Dave Cole331708b2004-08-09 04:51:41 +00006401#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 {"socketpair", socket_socketpair,
6403 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 {"ntohs", socket_ntohs,
6406 METH_VARARGS, ntohs_doc},
6407 {"ntohl", socket_ntohl,
6408 METH_O, ntohl_doc},
6409 {"htons", socket_htons,
6410 METH_VARARGS, htons_doc},
6411 {"htonl", socket_htonl,
6412 METH_O, htonl_doc},
6413 {"inet_aton", socket_inet_aton,
6414 METH_VARARGS, inet_aton_doc},
6415 {"inet_ntoa", socket_inet_ntoa,
6416 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006417#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 {"inet_pton", socket_inet_pton,
6419 METH_VARARGS, inet_pton_doc},
6420 {"inet_ntop", socket_inet_ntop,
6421 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006422#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006423 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6424 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 {"getnameinfo", socket_getnameinfo,
6426 METH_VARARGS, getnameinfo_doc},
6427 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6428 METH_NOARGS, getdefaulttimeout_doc},
6429 {"setdefaulttimeout", socket_setdefaulttimeout,
6430 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006431#ifdef HAVE_IF_NAMEINDEX
6432 {"if_nameindex", socket_if_nameindex,
6433 METH_NOARGS, if_nameindex_doc},
6434 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006435 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006436 {"if_indextoname", socket_if_indextoname,
6437 METH_O, if_indextoname_doc},
6438#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006439#ifdef CMSG_LEN
6440 {"CMSG_LEN", socket_CMSG_LEN,
6441 METH_VARARGS, CMSG_LEN_doc},
6442#ifdef CMSG_SPACE
6443 {"CMSG_SPACE", socket_CMSG_SPACE,
6444 METH_VARARGS, CMSG_SPACE_doc},
6445#endif
6446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006448};
6449
Guido van Rossum30a685f1991-06-27 15:51:29 +00006450
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006451#ifdef MS_WINDOWS
6452#define OS_INIT_DEFINED
6453
6454/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006455
6456static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006457os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006460}
6461
6462static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006463os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 WSADATA WSAData;
6466 int ret;
6467 ret = WSAStartup(0x0101, &WSAData);
6468 switch (ret) {
6469 case 0: /* No error */
6470 Py_AtExit(os_cleanup);
6471 return 1; /* Success */
6472 case WSASYSNOTREADY:
6473 PyErr_SetString(PyExc_ImportError,
6474 "WSAStartup failed: network not ready");
6475 break;
6476 case WSAVERNOTSUPPORTED:
6477 case WSAEINVAL:
6478 PyErr_SetString(
6479 PyExc_ImportError,
6480 "WSAStartup failed: requested version not supported");
6481 break;
6482 default:
6483 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6484 break;
6485 }
6486 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006487}
6488
Guido van Rossum8d665e61996-06-26 18:22:49 +00006489#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006490
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006491
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006492
6493#ifndef OS_INIT_DEFINED
6494static int
6495os_init(void)
6496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006498}
6499#endif
6500
6501
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006502/* C API table - always add new things to the end for binary
6503 compatibility. */
6504static
6505PySocketModule_APIObject PySocketModuleAPI =
6506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006508 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006510};
6511
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006512
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006513/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006514
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006515 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006516 "socket.py" which implements some additional functionality.
6517 The import of "_socket" may fail with an ImportError exception if
6518 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006519 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006520 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006521*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006523PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006524"Implementation module for socket operations.\n\
6525\n\
6526See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006527
Martin v. Löwis1a214512008-06-11 05:26:20 +00006528static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 PyModuleDef_HEAD_INIT,
6530 PySocket_MODULE_NAME,
6531 socket_doc,
6532 -1,
6533 socket_methods,
6534 NULL,
6535 NULL,
6536 NULL,
6537 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006538};
6539
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006540PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006541PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 if (!os_init())
6546 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006547
Victor Stinnerdaf45552013-08-28 00:53:59 +02006548#ifdef MS_WINDOWS
6549 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006550#if defined(_MSC_VER) && _MSC_VER >= 1800
6551 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6552#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006553 DWORD version = GetVersion();
6554 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6555 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6556 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006557 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6558#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006559 }
6560#endif
6561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 Py_TYPE(&sock_type) = &PyType_Type;
6563 m = PyModule_Create(&socketmodule);
6564 if (m == NULL)
6565 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006566
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006567 Py_INCREF(PyExc_OSError);
6568 PySocketModuleAPI.error = PyExc_OSError;
6569 Py_INCREF(PyExc_OSError);
6570 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006572 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 if (socket_herror == NULL)
6574 return NULL;
6575 Py_INCREF(socket_herror);
6576 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006577 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 NULL);
6579 if (socket_gaierror == NULL)
6580 return NULL;
6581 Py_INCREF(socket_gaierror);
6582 PyModule_AddObject(m, "gaierror", socket_gaierror);
6583 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006584 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 if (socket_timeout == NULL)
6586 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006587 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 Py_INCREF(socket_timeout);
6589 PyModule_AddObject(m, "timeout", socket_timeout);
6590 Py_INCREF((PyObject *)&sock_type);
6591 if (PyModule_AddObject(m, "SocketType",
6592 (PyObject *)&sock_type) != 0)
6593 return NULL;
6594 Py_INCREF((PyObject *)&sock_type);
6595 if (PyModule_AddObject(m, "socket",
6596 (PyObject *)&sock_type) != 0)
6597 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006598
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006599#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006601#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 Py_INCREF(has_ipv6);
6605 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 /* Export C API */
6608 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6609 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6610 ) != 0)
6611 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006614#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006616#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006618#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006620#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006621#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#endif
6625#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006627#endif
6628#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#endif
6632#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006635#endif
6636#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006639#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006640#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006643#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006644#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006647#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006648#ifdef HAVE_SOCKADDR_ALG
6649 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6650#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006651#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006654#endif
6655#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006657#endif
6658#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006661#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006662#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006665#endif
6666#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006669#endif
6670#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006673#endif
6674#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006677#endif
6678#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, AF_NETLINK);
6681 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006682#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006684#endif
6685#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006687#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6689 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006690#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006692#endif
6693#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006695#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006696#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006698#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006699#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006701#endif
6702#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006704#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006706#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006708#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006709#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006711#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006712#ifdef NETLINK_CRYPTO
6713 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6714#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006715#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006716
6717#ifdef AF_VSOCK
6718 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6719 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6720 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6721 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6722 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6723 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6724 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6725 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6726 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6727#endif
6728
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006729#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006732#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006733#ifdef AF_LINK
6734 PyModule_AddIntMacro(m, AF_LINK);
6735#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006736#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006737 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006738 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006739#endif
6740#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006743#endif
6744#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006747#endif
6748#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006751#endif
6752#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006755#endif
6756#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006759#endif
6760#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006763#endif
6764#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006767#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006768
Hye-Shik Chang81268602004-02-02 06:05:24 +00006769#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6771 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6772 PyModule_AddIntMacro(m, BTPROTO_HCI);
6773 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006774#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006776#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006777#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006778#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006780#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6782 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006783#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6786 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006787#endif
6788
Charles-François Natali47413c12011-10-06 19:47:44 +02006789#ifdef AF_CAN
6790 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006792#endif
6793#ifdef PF_CAN
6794 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006796#endif
6797
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006798/* Reliable Datagram Sockets */
6799#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006801#endif
6802#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006804#endif
6805
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006806/* Kernel event messages */
6807#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006809#endif
6810#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006812#endif
6813
Antoine Pitroub156a462010-10-27 20:13:57 +00006814#ifdef AF_PACKET
6815 PyModule_AddIntMacro(m, AF_PACKET);
6816#endif
6817#ifdef PF_PACKET
6818 PyModule_AddIntMacro(m, PF_PACKET);
6819#endif
6820#ifdef PACKET_HOST
6821 PyModule_AddIntMacro(m, PACKET_HOST);
6822#endif
6823#ifdef PACKET_BROADCAST
6824 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6825#endif
6826#ifdef PACKET_MULTICAST
6827 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6828#endif
6829#ifdef PACKET_OTHERHOST
6830 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6831#endif
6832#ifdef PACKET_OUTGOING
6833 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6834#endif
6835#ifdef PACKET_LOOPBACK
6836 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6837#endif
6838#ifdef PACKET_FASTROUTE
6839 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006840#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006841
Christian Heimes043d6f62008-01-07 17:19:16 +00006842#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006845 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6847 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6848 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006849
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6851 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6852 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, SOL_TIPC);
6856 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6857 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6858 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6859 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006860
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6862 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6863 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6864 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6868 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006869#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006872#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6874 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6875 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6876 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6877 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6878 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006879#endif
6880
Christian Heimesdffa3942016-09-05 23:54:41 +02006881#ifdef HAVE_SOCKADDR_ALG
6882 /* Socket options */
6883 PyModule_AddIntMacro(m, ALG_SET_KEY);
6884 PyModule_AddIntMacro(m, ALG_SET_IV);
6885 PyModule_AddIntMacro(m, ALG_SET_OP);
6886 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6887 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6888 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6889
6890 /* Operations */
6891 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6892 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6893 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6894 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6895#endif
6896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, SOCK_STREAM);
6899 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006900/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006901#ifdef SOCK_RAW
6902 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006904#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006906#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006908#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006909#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006911#endif
6912#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006914#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006924#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006925#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006927#endif
6928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006946#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006947#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006976#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006978#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006979#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006981#endif
6982#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006984#endif
6985#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006987#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006988#ifdef SO_PASSSEC
6989 PyModule_AddIntMacro(m, SO_PASSSEC);
6990#endif
6991#ifdef SO_PEERSEC
6992 PyModule_AddIntMacro(m, SO_PEERSEC);
6993#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006994#ifdef SO_BINDTODEVICE
6995 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6996#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006997#ifdef SO_PRIORITY
6998 PyModule_AddIntMacro(m, SO_PRIORITY);
6999#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007000#ifdef SO_MARK
7001 PyModule_AddIntMacro(m, SO_MARK);
7002#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007003#ifdef SO_DOMAIN
7004 PyModule_AddIntMacro(m, SO_DOMAIN);
7005#endif
7006#ifdef SO_PROTOCOL
7007 PyModule_AddIntMacro(m, SO_PROTOCOL);
7008#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 /* Maximum number of connections for "listen" */
7011#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007013#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007015#endif
7016
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007017 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007018#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007020#endif
7021#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007023#endif
7024#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007026#endif
7027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028 /* Flags for send, recv */
7029#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007058#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007059#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007061#endif
7062#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007064#endif
7065#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007067#endif
7068#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007070#endif
7071#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007073#endif
7074#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007076#endif
7077#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007079#endif
7080#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007082#endif
7083#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007085#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007086#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007088#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 /* Protocol level and numbers, usable for [gs]etsockopt */
7091#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007116#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007123#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007124#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007126#endif
7127#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7129 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007130#endif
7131#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7133 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7134 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007135
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7137 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7138 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007139#ifdef CAN_ISOTP
7140 PyModule_AddIntMacro(m, CAN_ISOTP);
7141#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007142#endif
7143#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7145 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7146 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7147 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007148#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007149#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7150 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7151#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007152#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007154 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7155 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7156 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7157 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7158 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7159 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7160 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7161 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7162 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7163 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7164 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7165 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7166#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007167#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007169#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007170#ifdef HAVE_SOCKADDR_ALG
7171 PyModule_AddIntMacro(m, SOL_ALG);
7172#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007173#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007175#endif
7176#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007178#endif
7179#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007181#endif
7182#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007184#endif
7185#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007187#endif
7188#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007193#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007194 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007219#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007221#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007232#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007277#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007286#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007291#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007293 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007297#endif
7298/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007301#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007306#endif
7307
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007308#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007310#endif
7311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312 /* Some port configuration */
7313#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
7323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 /* Some reserved IP v.4 addresses */
7325#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007327#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007332#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef INADDR_ALLHOSTS_GROUP
7346 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7347 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007348#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007358#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007360#endif
7361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 /* IPv4 [gs]etsockopt options */
7363#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007369#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007372#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007396#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007405#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007410#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007411#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007413#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7416#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007422#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007439#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007441#endif
7442#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#endif
7445#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007447#endif
7448#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007450#endif
7451#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007453#endif
7454#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007456#endif
7457#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007459#endif
7460#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007462#endif
7463#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007465#endif
7466#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007468#endif
7469#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007471#endif
7472#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007474#endif
7475#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007477#endif
7478#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007480#endif
7481#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007483#endif
7484#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007486#endif
7487#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007489#endif
7490#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007492#endif
7493#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007495#endif
7496#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007498#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500 /* TCP options */
7501#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007534#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007536#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007537#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007539#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007540#ifdef TCP_CONGESTION
7541 PyModule_AddIntMacro(m, TCP_CONGESTION);
7542#endif
7543#ifdef TCP_USER_TIMEOUT
7544 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7545#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007546#ifdef TCP_NOTSENT_LOWAT
7547 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7548#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550 /* IPX options */
7551#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007553#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007554
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007555/* Reliable Datagram Sockets */
7556#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007558#endif
7559#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007561#endif
7562#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007564#endif
7565#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007567#endif
7568#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007570#endif
7571#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007573#endif
7574#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007576#endif
7577#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007579#endif
7580#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007582#endif
7583#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007585#endif
7586#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007588#endif
7589#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007591#endif
7592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007593 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007594#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
7603#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007605#endif
7606#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007611#endif
7612#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007614#endif
7615#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007618#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007620#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007621#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007623#endif
7624#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007626#endif
7627#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007629#endif
7630#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007632#endif
7633#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007635#endif
7636#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007638#endif
7639#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007641#endif
7642#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007644#endif
7645#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007647#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007648#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007650#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007651#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007653#endif
7654#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007656#endif
7657#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007659#endif
7660#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007662#endif
7663#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007665#endif
7666#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007668#endif
7669#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007671#endif
7672#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007674#endif
7675#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007677#endif
7678#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007680#endif
7681#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007683#endif
7684#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007686#endif
7687#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007689#endif
7690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007692#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007694#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007695 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007697 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007698#endif
7699#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007701#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007705#endif
7706#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007708#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007710#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007712#endif
7713
Christian Heimesfaf2f632008-01-06 16:59:19 +00007714#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007715 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007716 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7717#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007718 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007719#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007720 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007721 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7722#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007723 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007724#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007725 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007727 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007728 PyObject *tmp;
7729 tmp = PyLong_FromUnsignedLong(codes[i]);
7730 if (tmp == NULL)
7731 return NULL;
7732 PyModule_AddObject(m, names[i], tmp);
7733 }
7734 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, RCVALL_OFF);
7736 PyModule_AddIntMacro(m, RCVALL_ON);
7737 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007738#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007740#endif
7741#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007743#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007744#endif /* _MSTCPIP_ */
7745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007747#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007750 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007751}