blob: bf8d19fe2f40cb602ba48d217ca61795624bb8f4 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if !defined(WITH_THREAD)
167# undef HAVE_GETHOSTBYNAME_R
168#endif
169
170#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000172#endif
173
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000175# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# define HAVE_GETHOSTBYNAME_R_3_ARG
177# elif defined(__sun) || defined(__sgi)
178# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700179# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000180/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000181# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
182# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# else
184# undef HAVE_GETHOSTBYNAME_R
185# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000186#endif
187
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000188#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
189 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000191#endif
192
Ned Deilye1d4e582016-02-23 22:05:29 +1100193/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000194#ifdef HAVE_SYS_PARAM_H
195#include <sys/param.h>
196#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000197/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100198 (this includes the getaddrinfo emulation) protect access with a lock.
199
200 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
201 a mix of code including an unsafe implementation from an old BSD's
202 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
203 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100205
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
207 http://www.openbsd.org/plus54.html
208
209 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
210
211http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100212 */
213#if defined(WITH_THREAD) && ( \
214 (defined(__APPLE__) && \
215 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000216 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100217 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
218 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100219 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000220#define USE_GETADDRINFO_LOCK
221#endif
222
223#ifdef USE_GETADDRINFO_LOCK
224#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
225#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
226#else
227#define ACQUIRE_GETADDRINFO_LOCK
228#define RELEASE_GETADDRINFO_LOCK
229#endif
230
231#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000232# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000233#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000234
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236# include <types.h>
237# include <io.h>
238# include <sys/ioctl.h>
239# include <utils.h>
240# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241#endif
242
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243#ifdef __APPLE__
244# include <sys/ioctl.h>
245#endif
246
247
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249/* make sure that the reentrant (gethostbyaddr_r etc)
250 functions are declared correctly if compiling with
251 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252
Thomas Wouters477c8d52006-05-27 19:21:47 +0000253/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000254 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000255#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000256#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000257
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000258#undef _XOPEN_SOURCE
259#include <sys/socket.h>
260#include <sys/types.h>
261#include <netinet/in.h>
262#ifdef _SS_ALIGNSIZE
263#define HAVE_GETADDRINFO 1
264#define HAVE_GETNAMEINFO 1
265#endif
266
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000267#define HAVE_INET_PTON
268#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000269#endif
270
Thomas Wouters477c8d52006-05-27 19:21:47 +0000271/* Irix 6.5 fails to define this variable at all. This is needed
272 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000273 are just busted. Same thing for Solaris. */
274#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000275#define INET_ADDRSTRLEN 16
276#endif
277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000280#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000281#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700283#ifdef HAVE_SYS_SOCKET_H
284#include <sys/socket.h>
285#endif
286
287#ifdef HAVE_NET_IF_H
288#include <net/if.h>
289#endif
290
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000291/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000293#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294
295/* Addressing includes */
296
Guido van Rossum6f489d91996-06-28 20:15:15 +0000297#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298
299/* Non-MS WINDOWS includes */
300# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000301# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Guido van Rossum9376b741999-09-15 22:01:40 +0000303/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000305
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000306# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000308#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000309
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000310/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000311# ifdef HAVE_FCNTL_H
312# include <fcntl.h>
313# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000314
Steve Dower65e4cb12014-11-22 12:54:57 -0800315#if defined(_MSC_VER) && _MSC_VER >= 1800
316/* Provides the IsWindows7SP1OrGreater() function */
317#include <VersionHelpers.h>
318#endif
319
Jeremy Hylton22308652001-02-02 03:23:09 +0000320#endif
321
Skip Montanaro7befb992004-02-10 16:50:21 +0000322#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000323
Neal Norwitz39d22e52002-11-02 19:55:21 +0000324#ifndef O_NONBLOCK
325# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000326#endif
327
Trent Micka708d6e2004-09-07 17:48:26 +0000328/* include Python's addrinfo.h unless it causes trouble */
329#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
330 /* Do not include addinfo.h on some newer IRIX versions.
331 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
332 * for example, but not by 6.5.10.
333 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000334#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000335 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
336 * EAI_* constants are defined in (the already included) ws2tcpip.h.
337 */
338#else
339# include "addrinfo.h"
340#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000341
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342#ifdef __APPLE__
343/* On OS X, getaddrinfo returns no error indication of lookup
344 failure, so we must use the emulation instead of the libinfo
345 implementation. Unfortunately, performing an autoconf test
346 for this bug would require DNS access for the machine performing
347 the configuration, which is not acceptable. Therefore, we
348 determine the bug just by checking for __APPLE__. If this bug
349 gets ever fixed, perhaps checking for sys/version.h would be
350 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000351#ifndef HAVE_GETNAMEINFO
352/* This bug seems to be fixed in Jaguar. Ths easiest way I could
353 Find to check for Jaguar is that it has getnameinfo(), which
354 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357
358#ifdef HAVE_INET_ATON
359#define USE_INET_ATON_WEAKLINK
360#endif
361
Jack Jansen84262fb2002-07-02 14:40:42 +0000362#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000364/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000365#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000366/* avoid clashes with the C library definition of the symbol. */
367#define getaddrinfo fake_getaddrinfo
368#define gai_strerror fake_gai_strerror
369#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000370#include "getaddrinfo.c"
371#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000372#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000373#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000374#include "getnameinfo.c"
375#endif
376
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000377#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000378#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000379#endif
380
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000381#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000382#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000383#define EAFNOSUPPORT WSAEAFNOSUPPORT
384#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000385#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000386
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000387#ifndef SOCKETCLOSE
388#define SOCKETCLOSE close
389#endif
390
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000391#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000392#define USE_BLUETOOTH 1
393#if defined(__FreeBSD__)
394#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
395#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000397#define SOL_HCI SOL_HCI_RAW
398#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define sockaddr_l2 sockaddr_l2cap
400#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000401#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
403#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000405#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000406#define sockaddr_l2 sockaddr_bt
407#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000408#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000409#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000410#define SOL_HCI BTPROTO_HCI
411#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000412#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
413#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000414#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000415#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000416#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000417#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
418#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000419#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000420#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
421#endif
422#endif
423
Charles-François Natali8b759652011-12-23 16:44:51 +0100424/* Convert "sock_addr_t *" to "struct sockaddr *". */
425#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426
Martin v. Löwise9416172003-05-03 10:12:45 +0000427/*
428 * Constants for getnameinfo()
429 */
430#if !defined(NI_MAXHOST)
431#define NI_MAXHOST 1025
432#endif
433#if !defined(NI_MAXSERV)
434#define NI_MAXSERV 32
435#endif
436
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000437#ifndef INVALID_SOCKET /* MS defines this */
438#define INVALID_SOCKET (-1)
439#endif
440
Charles-François Natali0cc86852013-09-13 19:53:08 +0200441#ifndef INADDR_NONE
442#define INADDR_NONE (-1)
443#endif
444
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000445/* XXX There's a problem here: *static* functions are not supposed to have
446 a Py prefix (or use CapitalizedWords). Later... */
447
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448/* Global variable holding the exception type for errors detected
449 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000450static PyObject *socket_herror;
451static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000452static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453
Tim Peters643a7fc2002-02-17 04:13:21 +0000454/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455 The sock_type variable contains pointers to various functions,
456 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000457 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000458static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000459
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000460#if defined(HAVE_POLL_H)
461#include <poll.h>
462#elif defined(HAVE_SYS_POLL_H)
463#include <sys/poll.h>
464#endif
465
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000466/* Largest value to try to store in a socklen_t (used when handling
467 ancillary data). POSIX requires socklen_t to hold at least
468 (2**31)-1 and recommends against storing larger values, but
469 socklen_t was originally int in the BSD interface, so to be on the
470 safe side we use the smaller of (2**31)-1 and INT_MAX. */
471#if INT_MAX > 0x7fffffff
472#define SOCKLEN_T_LIMIT 0x7fffffff
473#else
474#define SOCKLEN_T_LIMIT INT_MAX
475#endif
476
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200477#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478/* Instead of select(), we'll use poll() since poll() works on any fd. */
479#define IS_SELECTABLE(s) 1
480/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000481#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200482/* If there's no timeout left, we don't have to call select, so it's a safe,
483 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100484#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000485#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000486
487static PyObject*
488select_error(void)
489{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200490 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000492}
493
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000494#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000495#ifndef WSAEAGAIN
496#define WSAEAGAIN WSAEWOULDBLOCK
497#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000498#define CHECK_ERRNO(expected) \
499 (WSAGetLastError() == WSA ## expected)
500#else
501#define CHECK_ERRNO(expected) \
502 (errno == expected)
503#endif
504
Victor Stinnerdaf45552013-08-28 00:53:59 +0200505#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200506# define GET_SOCK_ERROR WSAGetLastError()
507# define SET_SOCK_ERROR(err) WSASetLastError(err)
508# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
509# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300510# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200511#else
512# define GET_SOCK_ERROR errno
513# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
514# define SOCK_TIMEOUT_ERR EWOULDBLOCK
515# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300516# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200517#endif
518
519
520#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200521/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
522static int support_wsa_no_inherit = -1;
523#endif
524
Guido van Rossum30a685f1991-06-27 15:51:29 +0000525/* Convenience function to raise an error according to errno
526 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527
Guido van Rossum73624e91994-10-10 17:59:00 +0000528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000529set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000530{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000531#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 int err_no = WSAGetLastError();
533 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
534 recognizes the error codes used by both GetLastError() and
535 WSAGetLastError */
536 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200537 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000538#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000539
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200540 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541}
542
Guido van Rossum30a685f1991-06-27 15:51:29 +0000543
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000545set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548
549#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (v != NULL) {
555 PyErr_SetObject(socket_herror, v);
556 Py_DECREF(v);
557 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560}
561
562
563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567
Martin v. Löwis272cb402002-03-01 08:31:07 +0000568#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* EAI_SYSTEM is not available on Windows XP. */
570 if (error == EAI_SYSTEM)
571 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000572#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000574#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000576#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (v != NULL) {
580 PyErr_SetObject(socket_gaierror, v);
581 Py_DECREF(v);
582 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585}
586
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000587/* Function to perform the setting of socket blocking mode
588 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589static int
590internal_setblocking(PySocketSockObject *s, int block)
591{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400592 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200593#ifdef MS_WINDOWS
594 u_long arg;
595#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100596#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100597 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100598 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000600#ifdef SOCK_NONBLOCK
601 if (block)
602 s->sock_type &= (~SOCK_NONBLOCK);
603 else
604 s->sock_type |= SOCK_NONBLOCK;
605#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100609#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200611 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400612 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100613#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200615 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400616 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100618 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 else
Victor Stinner9a954832013-12-04 00:41:24 +0100620 new_delay_flag = delay_flag | O_NONBLOCK;
621 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200622 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400623 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100624#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000625#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200626 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200627 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400628 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400630
631 result = 0;
632
633 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000634 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636
Yury Selivanovfa22b292016-10-18 16:03:52 -0400637 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200638#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400639 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200640#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400641 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200642#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400643 }
644
645 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646}
647
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000648static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200649internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
650 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100653#ifdef HAVE_POLL
654 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200655 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100656#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200657 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200658 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100659#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000660
Victor Stinnerb7df3142015-03-27 22:59:32 +0100661#ifdef WITH_THREAD
662 /* must be called with the GIL held */
663 assert(PyGILState_Check());
664#endif
665
Victor Stinner416f2e62015-03-31 13:56:29 +0200666 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200667 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200670 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 /* Prefer poll, if available, since you can poll() any fd
674 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100676 pollfd.fd = s->sock_fd;
677 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200678 if (connect) {
679 /* On Windows, the socket becomes writable on connection success,
680 but a connection failure is notified as an error. On POSIX, the
681 socket becomes writable on connection success or on connection
682 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200684 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000685
Victor Stinner71694d52015-03-28 01:18:54 +0100686 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200687 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200688 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689
Victor Stinner71694d52015-03-28 01:18:54 +0100690 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200691 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100692 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000693#else
Victor Stinnerced11742015-04-09 10:27:25 +0200694 if (interval >= 0) {
695 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
696 tvp = &tv;
697 }
698 else
699 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000700
Victor Stinner71694d52015-03-28 01:18:54 +0100701 FD_ZERO(&fds);
702 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200703 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200704 if (connect) {
705 /* On Windows, the socket becomes writable on connection success,
706 but a connection failure is notified as an error. On POSIX, the
707 socket becomes writable on connection success or on connection
708 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200710 }
Victor Stinner71694d52015-03-28 01:18:54 +0100711
712 /* See if the socket is ready */
713 Py_BEGIN_ALLOW_THREADS;
714 if (writing)
715 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200716 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100717 else
718 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200719 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100720 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (n < 0)
724 return -1;
725 if (n == 0)
726 return 1;
727 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728}
729
Victor Stinner31bf2d52015-04-01 21:57:09 +0200730/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000731
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 On error, raise an exception and return -1 if err is set, or fill err and
733 return -1 otherwise. If a signal was received and the signal handler raised
734 an exception, return -1, and set err to -1 if err is set.
735
736 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100737
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738 If the socket has a timeout, wait until the socket is ready before calling
739 the function: wait until the socket is writable if writing is nonzero, wait
740 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100741
Victor Stinner81c41db2015-04-02 11:50:57 +0200742 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200743 the function, except if the signal handler raised an exception (PEP 475).
744
745 When the function is retried, recompute the timeout using a monotonic clock.
746
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 sock_call_ex() must be called with the GIL held. The socket function is
748 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200749static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200750sock_call_ex(PySocketSockObject *s,
751 int writing,
752 int (*sock_func) (PySocketSockObject *s, void *data),
753 void *data,
754 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200755 int *err,
756 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757{
Victor Stinner8912d142015-04-06 23:16:34 +0200758 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759 _PyTime_t deadline = 0;
760 int deadline_initialized = 0;
761 int res;
762
Victor Stinner92f01132015-10-11 09:54:42 +0200763#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 /* sock_call() must be called with the GIL held. */
765 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200766#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200767
768 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200770 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 /* For connect(), poll even for blocking socket. The connection
772 runs asynchronously. */
773 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200775 _PyTime_t interval;
776
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 if (deadline_initialized) {
778 /* recompute the timeout */
779 interval = deadline - _PyTime_GetMonotonicClock();
780 }
781 else {
782 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200783 deadline = _PyTime_GetMonotonicClock() + timeout;
784 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786
Victor Stinner10550cd2015-04-03 13:22:27 +0200787 if (interval >= 0)
788 res = internal_select(s, writing, interval, connect);
789 else
790 res = 1;
791 }
792 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200793 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200794 }
795
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 if (err)
798 *err = GET_SOCK_ERROR;
799
Victor Stinner31bf2d52015-04-01 21:57:09 +0200800 if (CHECK_ERRNO(EINTR)) {
801 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200802 if (PyErr_CheckSignals()) {
803 if (err)
804 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807
808 /* retry select() */
809 continue;
810 }
811
812 /* select() failed */
813 s->errorhandler();
814 return -1;
815 }
816
817 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 if (err)
819 *err = SOCK_TIMEOUT_ERR;
820 else
821 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 return -1;
823 }
824
825 /* the socket is ready */
826 }
827
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 /* inner loop to retry sock_func() when sock_func() is interrupted
829 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830 while (1) {
831 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 Py_END_ALLOW_THREADS
834
835 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 /* sock_func() succeeded */
837 if (err)
838 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839 return 0;
840 }
841
Victor Stinner81c41db2015-04-02 11:50:57 +0200842 if (err)
843 *err = GET_SOCK_ERROR;
844
Victor Stinner31bf2d52015-04-01 21:57:09 +0200845 if (!CHECK_ERRNO(EINTR))
846 break;
847
Victor Stinner81c41db2015-04-02 11:50:57 +0200848 /* sock_func() was interrupted by a signal */
849 if (PyErr_CheckSignals()) {
850 if (err)
851 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200852 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856 }
857
858 if (s->sock_timeout > 0
859 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861
862 For example, select() could indicate a socket is ready for
863 reading, but the data then discarded by the OS because of a
864 wrong checksum.
865
866 Loop on select() to recheck for socket readyness. */
867 continue;
868 }
869
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 /* sock_func() failed */
871 if (!err)
872 s->errorhandler();
873 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000874 return -1;
875 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000877
Victor Stinner81c41db2015-04-02 11:50:57 +0200878static int
879sock_call(PySocketSockObject *s,
880 int writing,
881 int (*func) (PySocketSockObject *s, void *data),
882 void *data)
883{
Victor Stinner8912d142015-04-06 23:16:34 +0200884 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200885}
886
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000887
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000888/* Initialize a new socket object. */
889
Victor Stinner88ed6402015-04-09 10:23:12 +0200890/* Default timeout for new sockets */
891static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000892
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200893static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000894init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 s->sock_fd = fd;
898 s->sock_family = family;
899 s->sock_type = type;
900 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000903#ifdef SOCK_NONBLOCK
904 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100905 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000906 else
907#endif
908 {
909 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200910 if (defaulttimeout >= 0) {
911 if (internal_setblocking(s, 0) == -1) {
912 return -1;
913 }
914 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000915 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200916 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000917}
918
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920/* Create a new socket object.
921 This just creates the object and initializes it.
922 If the creation fails, return NULL and set an exception (implicit
923 in NEWOBJ()). */
924
Guido van Rossum73624e91994-10-10 17:59:00 +0000925static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000926new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PySocketSockObject *s;
929 s = (PySocketSockObject *)
930 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200931 if (s == NULL)
932 return NULL;
933 if (init_sockobject(s, fd, family, type, proto) == -1) {
934 Py_DECREF(s);
935 return NULL;
936 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938}
939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940
Guido van Rossum48a680c2001-03-02 06:34:14 +0000941/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000942 thread to be in gethostbyname or getaddrinfo */
943#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200944static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000945#endif
946
947
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948/* Convert a string specifying a host name or one of a few symbolic
949 names to a numeric IP address. This usually calls gethostbyname()
950 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000951 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 an error occurred; then an exception is raised. */
953
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200955setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 struct addrinfo hints, *res;
958 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
961 if (name[0] == '\0') {
962 int siz;
963 memset(&hints, 0, sizeof(hints));
964 hints.ai_family = af;
965 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
966 hints.ai_flags = AI_PASSIVE;
967 Py_BEGIN_ALLOW_THREADS
968 ACQUIRE_GETADDRINFO_LOCK
969 error = getaddrinfo(NULL, "0", &hints, &res);
970 Py_END_ALLOW_THREADS
971 /* We assume that those thread-unsafe getaddrinfo() versions
972 *are* safe regarding their return value, ie. that a
973 subsequent call to getaddrinfo() does not destroy the
974 outcome of the first call. */
975 RELEASE_GETADDRINFO_LOCK
976 if (error) {
977 set_gaierror(error);
978 return -1;
979 }
980 switch (res->ai_family) {
981 case AF_INET:
982 siz = 4;
983 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000984#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case AF_INET6:
986 siz = 16;
987 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 default:
990 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200991 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 "unsupported address family");
993 return -1;
994 }
995 if (res->ai_next) {
996 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200997 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 "wildcard resolved to multiple address");
999 return -1;
1000 }
1001 if (res->ai_addrlen < addr_ret_size)
1002 addr_ret_size = res->ai_addrlen;
1003 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1004 freeaddrinfo(res);
1005 return siz;
1006 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001007 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001008 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001009 if (strcmp(name, "255.255.255.255") == 0 ||
1010 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 struct sockaddr_in *sin;
1012 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001013 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 "address family mismatched");
1015 return -1;
1016 }
1017 sin = (struct sockaddr_in *)addr_ret;
1018 memset((void *) sin, '\0', sizeof(*sin));
1019 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001020#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 sin->sin_addr.s_addr = INADDR_BROADCAST;
1024 return sizeof(sin->sin_addr);
1025 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001026
1027 /* avoid a name resolution in case of numeric address */
1028#ifdef HAVE_INET_PTON
1029 /* check for an IPv4 address */
1030 if (af == AF_UNSPEC || af == AF_INET) {
1031 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1032 memset(sin, 0, sizeof(*sin));
1033 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1034 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001035#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001036 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001037#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001038 return 4;
1039 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001041#ifdef ENABLE_IPV6
1042 /* check for an IPv6 address - if the address contains a scope ID, we
1043 * fallback to getaddrinfo(), which can handle translation from interface
1044 * name to interface index */
1045 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1046 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1047 memset(sin, 0, sizeof(*sin));
1048 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1049 sin->sin6_family = AF_INET6;
1050#ifdef HAVE_SOCKADDR_SA_LEN
1051 sin->sin6_len = sizeof(*sin);
1052#endif
1053 return 16;
1054 }
1055 }
1056#endif /* ENABLE_IPV6 */
1057#else /* HAVE_INET_PTON */
1058 /* check for an IPv4 address */
1059 if (af == AF_INET || af == AF_UNSPEC) {
1060 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1061 memset(sin, 0, sizeof(*sin));
1062 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1063 sin->sin_family = AF_INET;
1064#ifdef HAVE_SOCKADDR_SA_LEN
1065 sin->sin_len = sizeof(*sin);
1066#endif
1067 return 4;
1068 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001069 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001070#endif /* HAVE_INET_PTON */
1071
1072 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 memset(&hints, 0, sizeof(hints));
1074 hints.ai_family = af;
1075 Py_BEGIN_ALLOW_THREADS
1076 ACQUIRE_GETADDRINFO_LOCK
1077 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001078#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 if (error == EAI_NONAME && af == AF_UNSPEC) {
1080 /* On Tru64 V5.1, numeric-to-addr conversion fails
1081 if no address family is given. Assume IPv4 for now.*/
1082 hints.ai_family = AF_INET;
1083 error = getaddrinfo(name, NULL, &hints, &res);
1084 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 Py_END_ALLOW_THREADS
1087 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1088 if (error) {
1089 set_gaierror(error);
1090 return -1;
1091 }
1092 if (res->ai_addrlen < addr_ret_size)
1093 addr_ret_size = res->ai_addrlen;
1094 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1095 freeaddrinfo(res);
1096 switch (addr_ret->sa_family) {
1097 case AF_INET:
1098 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001099#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 case AF_INET6:
1101 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 return -1;
1106 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107}
1108
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110/* Create a string object representing an IP address.
1111 This is always a string of the form 'dd.dd.dd.dd' (with variable
1112 size numbers). */
1113
Guido van Rossum73624e91994-10-10 17:59:00 +00001114static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001115makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 char buf[NI_MAXHOST];
1118 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1121 NI_NUMERICHOST);
1122 if (error) {
1123 set_gaierror(error);
1124 return NULL;
1125 }
1126 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127}
1128
1129
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130#ifdef USE_BLUETOOTH
1131/* Convert a string representation of a Bluetooth address into a numeric
1132 address. Returns the length (6), or raises an exception and returns -1 if
1133 an error occurred. */
1134
1135static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001136setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 unsigned int b0, b1, b2, b3, b4, b5;
1139 char ch;
1140 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1143 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1144 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1145 bdaddr->b[0] = b0;
1146 bdaddr->b[1] = b1;
1147 bdaddr->b[2] = b2;
1148 bdaddr->b[3] = b3;
1149 bdaddr->b[4] = b4;
1150 bdaddr->b[5] = b5;
1151 return 6;
1152 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001153 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 return -1;
1155 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156}
1157
1158/* Create a string representation of the Bluetooth address. This is always a
1159 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1160 value (zero padded if necessary). */
1161
1162static PyObject *
1163makebdaddr(bdaddr_t *bdaddr)
1164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1168 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1169 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1170 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001171}
1172#endif
1173
1174
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175/* Create an object representing the given socket address,
1176 suitable for passing it back to bind(), connect() etc.
1177 The family field of the sockaddr structure is inspected
1178 to determine what kind of address it really is. */
1179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001182makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (addrlen == 0) {
1185 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001186 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 case AF_INET:
1192 {
1193 struct sockaddr_in *a;
1194 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1195 PyObject *ret = NULL;
1196 if (addrobj) {
1197 a = (struct sockaddr_in *)addr;
1198 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1199 Py_DECREF(addrobj);
1200 }
1201 return ret;
1202 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001204#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 case AF_UNIX:
1206 {
1207 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001208#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001209 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1210 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1211 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 }
1213 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001214#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 {
1216 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001217 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 }
1219 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001220#endif /* AF_UNIX */
1221
Martin v. Löwis11017b12006-01-14 18:12:57 +00001222#if defined(AF_NETLINK)
1223 case AF_NETLINK:
1224 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1226 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001227 }
1228#endif /* AF_NETLINK */
1229
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001230#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 case AF_INET6:
1232 {
1233 struct sockaddr_in6 *a;
1234 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1235 PyObject *ret = NULL;
1236 if (addrobj) {
1237 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001238 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 addrobj,
1240 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001241 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 a->sin6_scope_id);
1243 Py_DECREF(addrobj);
1244 }
1245 return ret;
1246 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001247#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 case AF_BLUETOOTH:
1251 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 case BTPROTO_L2CAP:
1254 {
1255 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1256 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1257 PyObject *ret = NULL;
1258 if (addrobj) {
1259 ret = Py_BuildValue("Oi",
1260 addrobj,
1261 _BT_L2_MEMB(a, psm));
1262 Py_DECREF(addrobj);
1263 }
1264 return ret;
1265 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case BTPROTO_RFCOMM:
1268 {
1269 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1270 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1271 PyObject *ret = NULL;
1272 if (addrobj) {
1273 ret = Py_BuildValue("Oi",
1274 addrobj,
1275 _BT_RC_MEMB(a, channel));
1276 Py_DECREF(addrobj);
1277 }
1278 return ret;
1279 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 case BTPROTO_HCI:
1282 {
1283 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001284#if defined(__NetBSD__) || defined(__DragonFly__)
1285 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1286#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyObject *ret = NULL;
1288 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1289 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001292
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case BTPROTO_SCO:
1295 {
1296 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1297 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1298 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299#endif
1300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 default:
1302 PyErr_SetString(PyExc_ValueError,
1303 "Unknown Bluetooth protocol");
1304 return NULL;
1305 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306#endif
1307
Antoine Pitroub156a462010-10-27 20:13:57 +00001308#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 case AF_PACKET:
1310 {
1311 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1312 char *ifname = "";
1313 struct ifreq ifr;
1314 /* need to look up interface name give index */
1315 if (a->sll_ifindex) {
1316 ifr.ifr_ifindex = a->sll_ifindex;
1317 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1318 ifname = ifr.ifr_name;
1319 }
1320 return Py_BuildValue("shbhy#",
1321 ifname,
1322 ntohs(a->sll_protocol),
1323 a->sll_pkttype,
1324 a->sll_hatype,
1325 a->sll_addr,
1326 a->sll_halen);
1327 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001328#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001329
Christian Heimes043d6f62008-01-07 17:19:16 +00001330#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case AF_TIPC:
1332 {
1333 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1334 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1335 return Py_BuildValue("IIIII",
1336 a->addrtype,
1337 a->addr.nameseq.type,
1338 a->addr.nameseq.lower,
1339 a->addr.nameseq.upper,
1340 a->scope);
1341 } else if (a->addrtype == TIPC_ADDR_NAME) {
1342 return Py_BuildValue("IIIII",
1343 a->addrtype,
1344 a->addr.name.name.type,
1345 a->addr.name.name.instance,
1346 a->addr.name.name.instance,
1347 a->scope);
1348 } else if (a->addrtype == TIPC_ADDR_ID) {
1349 return Py_BuildValue("IIIII",
1350 a->addrtype,
1351 a->addr.id.node,
1352 a->addr.id.ref,
1353 0,
1354 a->scope);
1355 } else {
1356 PyErr_SetString(PyExc_ValueError,
1357 "Invalid address type");
1358 return NULL;
1359 }
1360 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001361#endif
1362
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001363#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001364 case AF_CAN:
1365 {
1366 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1367 char *ifname = "";
1368 struct ifreq ifr;
1369 /* need to look up interface name given index */
1370 if (a->can_ifindex) {
1371 ifr.ifr_ifindex = a->can_ifindex;
1372 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1373 ifname = ifr.ifr_name;
1374 }
1375
1376 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1377 ifname,
1378 a->can_family);
1379 }
1380#endif
1381
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001382#ifdef PF_SYSTEM
1383 case PF_SYSTEM:
1384 switch(proto) {
1385#ifdef SYSPROTO_CONTROL
1386 case SYSPROTO_CONTROL:
1387 {
1388 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1389 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1390 }
1391#endif
1392 default:
1393 PyErr_SetString(PyExc_ValueError,
1394 "Invalid address type");
1395 return 0;
1396 }
1397#endif
1398
Christian Heimesdffa3942016-09-05 23:54:41 +02001399#ifdef HAVE_SOCKADDR_ALG
1400 case AF_ALG:
1401 {
1402 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1403 return Py_BuildValue("s#s#HH",
1404 a->salg_type,
1405 strnlen((const char*)a->salg_type,
1406 sizeof(a->salg_type)),
1407 a->salg_name,
1408 strnlen((const char*)a->salg_name,
1409 sizeof(a->salg_name)),
1410 a->salg_feat,
1411 a->salg_mask);
1412 }
1413#endif
1414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 default:
1418 /* If we don't know the address family, don't raise an
1419 exception -- return it as an (int, bytes) tuple. */
1420 return Py_BuildValue("iy#",
1421 addr->sa_family,
1422 addr->sa_data,
1423 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426}
1427
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001428/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1429 (in particular, numeric IP addresses). */
1430struct maybe_idna {
1431 PyObject *obj;
1432 char *buf;
1433};
1434
1435static void
1436idna_cleanup(struct maybe_idna *data)
1437{
1438 Py_CLEAR(data->obj);
1439}
1440
1441static int
1442idna_converter(PyObject *obj, struct maybe_idna *data)
1443{
1444 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001445 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001446 if (obj == NULL) {
1447 idna_cleanup(data);
1448 return 1;
1449 }
1450 data->obj = NULL;
1451 len = -1;
1452 if (PyBytes_Check(obj)) {
1453 data->buf = PyBytes_AsString(obj);
1454 len = PyBytes_Size(obj);
1455 }
1456 else if (PyByteArray_Check(obj)) {
1457 data->buf = PyByteArray_AsString(obj);
1458 len = PyByteArray_Size(obj);
1459 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001460 else if (PyUnicode_Check(obj)) {
1461 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1462 data->buf = PyUnicode_DATA(obj);
1463 len = PyUnicode_GET_LENGTH(obj);
1464 }
1465 else {
1466 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1467 if (!obj2) {
1468 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1469 return 0;
1470 }
1471 assert(PyBytes_Check(obj2));
1472 data->obj = obj2;
1473 data->buf = PyBytes_AS_STRING(obj2);
1474 len = PyBytes_GET_SIZE(obj2);
1475 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001476 }
1477 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001478 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1479 obj->ob_type->tp_name);
1480 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001481 }
1482 if (strlen(data->buf) != len) {
1483 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001484 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001485 return 0;
1486 }
1487 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001488}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489
1490/* Parse a socket address argument according to the socket object's
1491 address family. Return 1 if the address was in the proper format,
1492 0 of not. The address is returned through addr_ret, its length
1493 through len_ret. */
1494
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001495static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001496getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001500
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001501#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 case AF_UNIX:
1503 {
1504 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001505 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001506 int retval = 0;
1507
1508 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1509 allow embedded nulls on Linux. */
1510 if (PyUnicode_Check(args)) {
1511 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1512 return 0;
1513 }
1514 else
1515 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001516 if (!PyArg_Parse(args, "y*", &path)) {
1517 Py_DECREF(args);
1518 return retval;
1519 }
1520 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001523#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001524 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001526 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001527 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001529 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 }
1531 }
1532 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001533#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 {
1535 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001536 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001537 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001539 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001541 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 }
1543 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001544 memcpy(addr->sun_path, path.buf, path.len);
1545 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001546 retval = 1;
1547 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001548 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001549 Py_DECREF(args);
1550 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001552#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553
Martin v. Löwis11017b12006-01-14 18:12:57 +00001554#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 case AF_NETLINK:
1556 {
1557 struct sockaddr_nl* addr;
1558 int pid, groups;
1559 addr = (struct sockaddr_nl *)addr_ret;
1560 if (!PyTuple_Check(args)) {
1561 PyErr_Format(
1562 PyExc_TypeError,
1563 "getsockaddrarg: "
1564 "AF_NETLINK address must be tuple, not %.500s",
1565 Py_TYPE(args)->tp_name);
1566 return 0;
1567 }
1568 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1569 return 0;
1570 addr->nl_family = AF_NETLINK;
1571 addr->nl_pid = pid;
1572 addr->nl_groups = groups;
1573 *len_ret = sizeof(*addr);
1574 return 1;
1575 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001576#endif
1577
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001578#ifdef AF_RDS
1579 case AF_RDS:
1580 /* RDS sockets use sockaddr_in: fall-through */
1581#endif
1582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 case AF_INET:
1584 {
1585 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001586 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 int port, result;
1588 if (!PyTuple_Check(args)) {
1589 PyErr_Format(
1590 PyExc_TypeError,
1591 "getsockaddrarg: "
1592 "AF_INET address must be tuple, not %.500s",
1593 Py_TYPE(args)->tp_name);
1594 return 0;
1595 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001596 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1597 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 return 0;
1599 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001600 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001602 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 if (result < 0)
1604 return 0;
1605 if (port < 0 || port > 0xffff) {
1606 PyErr_SetString(
1607 PyExc_OverflowError,
1608 "getsockaddrarg: port must be 0-65535.");
1609 return 0;
1610 }
1611 addr->sin_family = AF_INET;
1612 addr->sin_port = htons((short)port);
1613 *len_ret = sizeof *addr;
1614 return 1;
1615 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001616
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001617#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 case AF_INET6:
1619 {
1620 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001621 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001622 int port, result;
1623 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 flowinfo = scope_id = 0;
1625 if (!PyTuple_Check(args)) {
1626 PyErr_Format(
1627 PyExc_TypeError,
1628 "getsockaddrarg: "
1629 "AF_INET6 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|II",
1634 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 &scope_id)) {
1636 return 0;
1637 }
1638 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001641 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (result < 0)
1643 return 0;
1644 if (port < 0 || port > 0xffff) {
1645 PyErr_SetString(
1646 PyExc_OverflowError,
1647 "getsockaddrarg: port must be 0-65535.");
1648 return 0;
1649 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001650 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001651 PyErr_SetString(
1652 PyExc_OverflowError,
1653 "getsockaddrarg: flowinfo must be 0-1048575.");
1654 return 0;
1655 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 addr->sin6_family = s->sock_family;
1657 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001658 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 addr->sin6_scope_id = scope_id;
1660 *len_ret = sizeof *addr;
1661 return 1;
1662 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001663#endif
1664
Hye-Shik Chang81268602004-02-02 06:05:24 +00001665#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 case AF_BLUETOOTH:
1667 {
1668 switch (s->sock_proto) {
1669 case BTPROTO_L2CAP:
1670 {
1671 struct sockaddr_l2 *addr;
1672 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 addr = (struct sockaddr_l2 *)addr_ret;
1675 memset(addr, 0, sizeof(struct sockaddr_l2));
1676 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1677 if (!PyArg_ParseTuple(args, "si", &straddr,
1678 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001679 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 "wrong format");
1681 return 0;
1682 }
1683 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1684 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 *len_ret = sizeof *addr;
1687 return 1;
1688 }
1689 case BTPROTO_RFCOMM:
1690 {
1691 struct sockaddr_rc *addr;
1692 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 addr = (struct sockaddr_rc *)addr_ret;
1695 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1696 if (!PyArg_ParseTuple(args, "si", &straddr,
1697 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001698 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 "wrong format");
1700 return 0;
1701 }
1702 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1703 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 *len_ret = sizeof *addr;
1706 return 1;
1707 }
1708 case BTPROTO_HCI:
1709 {
1710 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001711#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001712 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001713
Alexander Belopolskye239d232010-12-08 23:31:48 +00001714 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001715 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001716 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001717 "wrong format");
1718 return 0;
1719 }
1720 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1721 return 0;
1722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1724 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 "wrong format");
1727 return 0;
1728 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 *len_ret = sizeof *addr;
1731 return 1;
1732 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001733#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 case BTPROTO_SCO:
1735 {
1736 struct sockaddr_sco *addr;
1737 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 addr = (struct sockaddr_sco *)addr_ret;
1740 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1741 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001742 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 "wrong format");
1744 return 0;
1745 }
1746 straddr = PyBytes_AS_STRING(args);
1747 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1748 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 *len_ret = sizeof *addr;
1751 return 1;
1752 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001755 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 return 0;
1757 }
1758 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001759#endif
1760
Antoine Pitroub156a462010-10-27 20:13:57 +00001761#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 case AF_PACKET:
1763 {
1764 struct sockaddr_ll* addr;
1765 struct ifreq ifr;
1766 char *interfaceName;
1767 int protoNumber;
1768 int hatype = 0;
1769 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001770 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 if (!PyTuple_Check(args)) {
1773 PyErr_Format(
1774 PyExc_TypeError,
1775 "getsockaddrarg: "
1776 "AF_PACKET address must be tuple, not %.500s",
1777 Py_TYPE(args)->tp_name);
1778 return 0;
1779 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001780 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001782 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 0;
1784 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1785 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1786 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1787 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001788 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 return 0;
1790 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001791 if (haddr.buf && haddr.len > 8) {
1792 PyErr_SetString(PyExc_ValueError,
1793 "Hardware address must be 8 bytes or less");
1794 PyBuffer_Release(&haddr);
1795 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 }
1797 if (protoNumber < 0 || protoNumber > 0xffff) {
1798 PyErr_SetString(
1799 PyExc_OverflowError,
1800 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001801 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 return 0;
1803 }
1804 addr = (struct sockaddr_ll*)addr_ret;
1805 addr->sll_family = AF_PACKET;
1806 addr->sll_protocol = htons((short)protoNumber);
1807 addr->sll_ifindex = ifr.ifr_ifindex;
1808 addr->sll_pkttype = pkttype;
1809 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001810 if (haddr.buf) {
1811 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1812 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001814 else
1815 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001817 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 return 1;
1819 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001820#endif
1821
Christian Heimes043d6f62008-01-07 17:19:16 +00001822#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 case AF_TIPC:
1824 {
1825 unsigned int atype, v1, v2, v3;
1826 unsigned int scope = TIPC_CLUSTER_SCOPE;
1827 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 if (!PyTuple_Check(args)) {
1830 PyErr_Format(
1831 PyExc_TypeError,
1832 "getsockaddrarg: "
1833 "AF_TIPC address must be tuple, not %.500s",
1834 Py_TYPE(args)->tp_name);
1835 return 0;
1836 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 if (!PyArg_ParseTuple(args,
1839 "IIII|I;Invalid TIPC address format",
1840 &atype, &v1, &v2, &v3, &scope))
1841 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 addr = (struct sockaddr_tipc *) addr_ret;
1844 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 addr->family = AF_TIPC;
1847 addr->scope = scope;
1848 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 if (atype == TIPC_ADDR_NAMESEQ) {
1851 addr->addr.nameseq.type = v1;
1852 addr->addr.nameseq.lower = v2;
1853 addr->addr.nameseq.upper = v3;
1854 } else if (atype == TIPC_ADDR_NAME) {
1855 addr->addr.name.name.type = v1;
1856 addr->addr.name.name.instance = v2;
1857 } else if (atype == TIPC_ADDR_ID) {
1858 addr->addr.id.node = v1;
1859 addr->addr.id.ref = v2;
1860 } else {
1861 /* Shouldn't happen */
1862 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1863 return 0;
1864 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return 1;
1869 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001870#endif
1871
Vinay Sajiped6783f2014-03-21 11:44:32 +00001872#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001873 case AF_CAN:
1874 switch (s->sock_proto) {
1875 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001876 /* fall-through */
1877 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001878 {
1879 struct sockaddr_can *addr;
1880 PyObject *interfaceName;
1881 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001882 Py_ssize_t len;
1883
Benjamin Peterson18b71912013-05-16 15:29:44 -05001884 addr = (struct sockaddr_can *)addr_ret;
1885
Charles-François Natali47413c12011-10-06 19:47:44 +02001886 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1887 &interfaceName))
1888 return 0;
1889
1890 len = PyBytes_GET_SIZE(interfaceName);
1891
1892 if (len == 0) {
1893 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001894 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001895 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1896 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001897 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1898 s->errorhandler();
1899 Py_DECREF(interfaceName);
1900 return 0;
1901 }
1902 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001903 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001904 "AF_CAN interface name too long");
1905 Py_DECREF(interfaceName);
1906 return 0;
1907 }
1908
1909 addr->can_family = AF_CAN;
1910 addr->can_ifindex = ifr.ifr_ifindex;
1911
1912 *len_ret = sizeof(*addr);
1913 Py_DECREF(interfaceName);
1914 return 1;
1915 }
1916 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001917 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001918 "getsockaddrarg: unsupported CAN protocol");
1919 return 0;
1920 }
1921#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001922
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001923#ifdef PF_SYSTEM
1924 case PF_SYSTEM:
1925 switch (s->sock_proto) {
1926#ifdef SYSPROTO_CONTROL
1927 case SYSPROTO_CONTROL:
1928 {
1929 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001930
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001931 addr = (struct sockaddr_ctl *)addr_ret;
1932 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001933 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001934
1935 if (PyUnicode_Check(args)) {
1936 struct ctl_info info;
1937 PyObject *ctl_name;
1938
1939 if (!PyArg_Parse(args, "O&",
1940 PyUnicode_FSConverter, &ctl_name)) {
1941 return 0;
1942 }
1943
Victor Stinnerf50e1872015-03-20 11:32:24 +01001944 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001945 PyErr_SetString(PyExc_ValueError,
1946 "provided string is too long");
1947 Py_DECREF(ctl_name);
1948 return 0;
1949 }
1950 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1951 sizeof(info.ctl_name));
1952 Py_DECREF(ctl_name);
1953
1954 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1955 PyErr_SetString(PyExc_OSError,
1956 "cannot find kernel control with provided name");
1957 return 0;
1958 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001959
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001960 addr->sc_id = info.ctl_id;
1961 addr->sc_unit = 0;
1962 } else if (!PyArg_ParseTuple(args, "II",
1963 &(addr->sc_id), &(addr->sc_unit))) {
1964 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1965 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001966
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001967 return 0;
1968 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001969
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001970 *len_ret = sizeof(*addr);
1971 return 1;
1972 }
1973#endif
1974 default:
1975 PyErr_SetString(PyExc_OSError,
1976 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1977 return 0;
1978 }
1979#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02001980#ifdef HAVE_SOCKADDR_ALG
1981 case AF_ALG:
1982 {
1983 struct sockaddr_alg *sa;
1984 char *type;
1985 char *name;
1986 sa = (struct sockaddr_alg *)addr_ret;
1987
1988 memset(sa, 0, sizeof(*sa));
1989 sa->salg_family = AF_ALG;
1990
1991 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
1992 &type, &name, &sa->salg_feat, &sa->salg_mask))
1993 return 0;
1994 /* sockaddr_alg has fixed-sized char arrays for type and name */
1995 if (strlen(type) > sizeof(sa->salg_type)) {
1996 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
1997 return 0;
1998 }
1999 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2000 if (strlen(name) > sizeof(sa->salg_name)) {
2001 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2002 return 0;
2003 }
2004 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2005
2006 *len_ret = sizeof(*sa);
2007 return 1;
2008 }
2009#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002014 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002018}
2019
Guido van Rossum30a685f1991-06-27 15:51:29 +00002020
Guido van Rossum48a680c2001-03-02 06:34:14 +00002021/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002022 Return 1 if the family is known, 0 otherwise. The length is returned
2023 through len_ret. */
2024
2025static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002026getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002029
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002030#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 case AF_UNIX:
2032 {
2033 *len_ret = sizeof (struct sockaddr_un);
2034 return 1;
2035 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002036#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002037
Martin v. Löwis11017b12006-01-14 18:12:57 +00002038#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002039 case AF_NETLINK:
2040 {
2041 *len_ret = sizeof (struct sockaddr_nl);
2042 return 1;
2043 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002044#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002045
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002046#ifdef AF_RDS
2047 case AF_RDS:
2048 /* RDS sockets use sockaddr_in: fall-through */
2049#endif
2050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 case AF_INET:
2052 {
2053 *len_ret = sizeof (struct sockaddr_in);
2054 return 1;
2055 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002056
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002057#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 case AF_INET6:
2059 {
2060 *len_ret = sizeof (struct sockaddr_in6);
2061 return 1;
2062 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002063#endif
2064
Hye-Shik Chang81268602004-02-02 06:05:24 +00002065#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 case AF_BLUETOOTH:
2067 {
2068 switch(s->sock_proto)
2069 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 case BTPROTO_L2CAP:
2072 *len_ret = sizeof (struct sockaddr_l2);
2073 return 1;
2074 case BTPROTO_RFCOMM:
2075 *len_ret = sizeof (struct sockaddr_rc);
2076 return 1;
2077 case BTPROTO_HCI:
2078 *len_ret = sizeof (struct sockaddr_hci);
2079 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002080#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 case BTPROTO_SCO:
2082 *len_ret = sizeof (struct sockaddr_sco);
2083 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002086 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 "unknown BT protocol");
2088 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 }
2091 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002092#endif
2093
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002094#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 case AF_PACKET:
2096 {
2097 *len_ret = sizeof (struct sockaddr_ll);
2098 return 1;
2099 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002100#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002101
Christian Heimes043d6f62008-01-07 17:19:16 +00002102#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 case AF_TIPC:
2104 {
2105 *len_ret = sizeof (struct sockaddr_tipc);
2106 return 1;
2107 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002108#endif
2109
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002110#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002111 case AF_CAN:
2112 {
2113 *len_ret = sizeof (struct sockaddr_can);
2114 return 1;
2115 }
2116#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002117
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002118#ifdef PF_SYSTEM
2119 case PF_SYSTEM:
2120 switch(s->sock_proto) {
2121#ifdef SYSPROTO_CONTROL
2122 case SYSPROTO_CONTROL:
2123 *len_ret = sizeof (struct sockaddr_ctl);
2124 return 1;
2125#endif
2126 default:
2127 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2128 "unknown PF_SYSTEM protocol");
2129 return 0;
2130 }
2131#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002132#ifdef HAVE_SOCKADDR_ALG
2133 case AF_ALG:
2134 {
2135 *len_ret = sizeof (struct sockaddr_alg);
2136 return 1;
2137 }
2138#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002143 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002147}
2148
2149
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002150/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2151 Currently, these methods are only compiled if the RFC 2292/3542
2152 CMSG_LEN() macro is available. Older systems seem to have used
2153 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2154 it may be possible to define CMSG_LEN() that way if it's not
2155 provided. Some architectures might need extra padding after the
2156 cmsghdr, however, and CMSG_LEN() would have to take account of
2157 this. */
2158#ifdef CMSG_LEN
2159/* If length is in range, set *result to CMSG_LEN(length) and return
2160 true; otherwise, return false. */
2161static int
2162get_CMSG_LEN(size_t length, size_t *result)
2163{
2164 size_t tmp;
2165
2166 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2167 return 0;
2168 tmp = CMSG_LEN(length);
2169 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2170 return 0;
2171 *result = tmp;
2172 return 1;
2173}
2174
2175#ifdef CMSG_SPACE
2176/* If length is in range, set *result to CMSG_SPACE(length) and return
2177 true; otherwise, return false. */
2178static int
2179get_CMSG_SPACE(size_t length, size_t *result)
2180{
2181 size_t tmp;
2182
2183 /* Use CMSG_SPACE(1) here in order to take account of the padding
2184 necessary before *and* after the data. */
2185 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2186 return 0;
2187 tmp = CMSG_SPACE(length);
2188 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2189 return 0;
2190 *result = tmp;
2191 return 1;
2192}
2193#endif
2194
2195/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2196 pointer in msg->msg_control with at least "space" bytes after it,
2197 and its cmsg_len member inside the buffer. */
2198static int
2199cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2200{
2201 size_t cmsg_offset;
2202 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2203 sizeof(cmsgh->cmsg_len));
2204
Charles-François Natali466517d2011-08-28 18:23:43 +02002205 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002206 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002207 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002208 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2209 annoying under OS X as it's unsigned there and so it triggers a
2210 tautological comparison warning under Clang when compared against 0.
2211 Since the check is valid on other platforms, silence the warning under
2212 Clang. */
2213 #ifdef __clang__
2214 #pragma clang diagnostic push
2215 #pragma clang diagnostic ignored "-Wtautological-compare"
2216 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002217 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002218 #pragma GCC diagnostic push
2219 #pragma GCC diagnostic ignored "-Wtype-limits"
2220 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002221 if (msg->msg_controllen < 0)
2222 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002223 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002224 #pragma GCC diagnostic pop
2225 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002226 #ifdef __clang__
2227 #pragma clang diagnostic pop
2228 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002229 if (space < cmsg_len_end)
2230 space = cmsg_len_end;
2231 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2232 return (cmsg_offset <= (size_t)-1 - space &&
2233 cmsg_offset + space <= msg->msg_controllen);
2234}
2235
2236/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2237 *space to number of bytes following it in the buffer and return
2238 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2239 msg->msg_controllen are valid. */
2240static int
2241get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2242{
2243 size_t data_offset;
2244 char *data_ptr;
2245
2246 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2247 return 0;
2248 data_offset = data_ptr - (char *)msg->msg_control;
2249 if (data_offset > msg->msg_controllen)
2250 return 0;
2251 *space = msg->msg_controllen - data_offset;
2252 return 1;
2253}
2254
2255/* If cmsgh is invalid or not contained in the buffer pointed to by
2256 msg->msg_control, return -1. If cmsgh is valid and its associated
2257 data is entirely contained in the buffer, set *data_len to the
2258 length of the associated data and return 0. If only part of the
2259 associated data is contained in the buffer but cmsgh is otherwise
2260 valid, set *data_len to the length contained in the buffer and
2261 return 1. */
2262static int
2263get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2264{
2265 size_t space, cmsg_data_len;
2266
2267 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2268 cmsgh->cmsg_len < CMSG_LEN(0))
2269 return -1;
2270 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2271 if (!get_cmsg_data_space(msg, cmsgh, &space))
2272 return -1;
2273 if (space >= cmsg_data_len) {
2274 *data_len = cmsg_data_len;
2275 return 0;
2276 }
2277 *data_len = space;
2278 return 1;
2279}
2280#endif /* CMSG_LEN */
2281
2282
Victor Stinner31bf2d52015-04-01 21:57:09 +02002283struct sock_accept {
2284 socklen_t *addrlen;
2285 sock_addr_t *addrbuf;
2286 SOCKET_T result;
2287};
2288
2289#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2290/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2291static int accept4_works = -1;
2292#endif
2293
2294static int
2295sock_accept_impl(PySocketSockObject *s, void *data)
2296{
2297 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002298 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2299 socklen_t *paddrlen = ctx->addrlen;
2300#ifdef HAVE_SOCKADDR_ALG
2301 /* AF_ALG does not support accept() with addr and raises
2302 * ECONNABORTED instead. */
2303 if (s->sock_family == AF_ALG) {
2304 addr = NULL;
2305 paddrlen = NULL;
2306 *ctx->addrlen = 0;
2307 }
2308#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002309
2310#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2311 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002312 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002313 SOCK_CLOEXEC);
2314 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2315 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2316 accept4_works = (errno != ENOSYS);
2317 }
2318 }
2319 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002320 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002321#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002322 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002323#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002324
2325#ifdef MS_WINDOWS
2326 return (ctx->result != INVALID_SOCKET);
2327#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002328 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002329#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002330}
2331
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002332/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002333
Guido van Rossum73624e91994-10-10 17:59:00 +00002334static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002335sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002338 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 socklen_t addrlen;
2340 PyObject *sock = NULL;
2341 PyObject *addr = NULL;
2342 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002343 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 if (!getsockaddrlen(s, &addrlen))
2346 return NULL;
2347 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 if (!IS_SELECTABLE(s))
2350 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002351
Victor Stinner31bf2d52015-04-01 21:57:09 +02002352 ctx.addrlen = &addrlen;
2353 ctx.addrbuf = &addrbuf;
2354 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002356 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002357
Victor Stinnerdaf45552013-08-28 00:53:59 +02002358#ifdef MS_WINDOWS
2359 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2360 PyErr_SetFromWindowsErr(0);
2361 SOCKETCLOSE(newfd);
2362 goto finally;
2363 }
2364#else
2365
2366#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2367 if (!accept4_works)
2368#endif
2369 {
2370 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2371 SOCKETCLOSE(newfd);
2372 goto finally;
2373 }
2374 }
2375#endif
2376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 sock = PyLong_FromSocket_t(newfd);
2378 if (sock == NULL) {
2379 SOCKETCLOSE(newfd);
2380 goto finally;
2381 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2384 addrlen, s->sock_proto);
2385 if (addr == NULL)
2386 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002389
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 Py_XDECREF(sock);
2392 Py_XDECREF(addr);
2393 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002394}
2395
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002396PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002397"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002398\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002399Wait for an incoming connection. Return a new socket file descriptor\n\
2400representing the connection, and the address of the client.\n\
2401For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002402
Guido van Rossum11ba0942002-06-13 15:07:44 +00002403/* s.setblocking(flag) method. Argument:
2404 False -- non-blocking mode; same as settimeout(0)
2405 True -- blocking mode; same as settimeout(None)
2406*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002407
Guido van Rossum73624e91994-10-10 17:59:00 +00002408static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002409sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002410{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002411 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 block = PyLong_AsLong(arg);
2414 if (block == -1 && PyErr_Occurred())
2415 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002416
Victor Stinner9001d802015-04-06 23:06:01 +02002417 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002418 if (internal_setblocking(s, block) == -1) {
2419 return NULL;
2420 }
2421 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002422}
Guido van Rossume4485b01994-09-07 14:32:49 +00002423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002424PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425"setblocking(flag)\n\
2426\n\
2427Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002428setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430
Victor Stinner71694d52015-03-28 01:18:54 +01002431static int
2432socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2433{
2434#ifdef MS_WINDOWS
2435 struct timeval tv;
2436#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002437#ifndef HAVE_POLL
2438 _PyTime_t ms;
2439#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002440 int overflow = 0;
2441
2442 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002443 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002444 return 0;
2445 }
2446
Victor Stinner869e1772015-03-30 03:49:14 +02002447 if (_PyTime_FromSecondsObject(timeout,
2448 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002449 return -1;
2450
2451 if (*timeout < 0) {
2452 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2453 return -1;
2454 }
2455
2456#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002457 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002458#endif
2459#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002460 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2461 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002462#endif
2463 if (overflow) {
2464 PyErr_SetString(PyExc_OverflowError,
2465 "timeout doesn't fit into C timeval");
2466 return -1;
2467 }
2468
2469 return 0;
2470}
2471
Guido van Rossum11ba0942002-06-13 15:07:44 +00002472/* s.settimeout(timeout) method. Argument:
2473 None -- no timeout, blocking mode; same as setblocking(True)
2474 0.0 -- non-blocking mode; same as setblocking(False)
2475 > 0 -- timeout mode; operations time out after timeout seconds
2476 < 0 -- illegal; raises an exception
2477*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002479sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002480{
Victor Stinner71694d52015-03-28 01:18:54 +01002481 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002482
Victor Stinner71694d52015-03-28 01:18:54 +01002483 if (socket_parse_timeout(&timeout, arg) < 0)
2484 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002487 if (internal_setblocking(s, timeout < 0) == -1) {
2488 return NULL;
2489 }
2490 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491}
2492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002494"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002495\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002496Set a timeout on socket operations. 'timeout' can be a float,\n\
2497giving in seconds, or None. Setting a timeout of None disables\n\
2498the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002499Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002500
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002501/* s.gettimeout() method.
2502 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002504sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002505{
Victor Stinner71694d52015-03-28 01:18:54 +01002506 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002507 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 }
Victor Stinner71694d52015-03-28 01:18:54 +01002509 else {
2510 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2511 return PyFloat_FromDouble(seconds);
2512 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513}
2514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002516"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002518Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002519operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002521
Guido van Rossumaee08791992-09-08 09:05:33 +00002522/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002523 With an integer third argument, sets an integer optval with optlen=4.
2524 With None as third argument and an integer fourth argument, set
2525 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002526 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002527 use optional built-in module 'struct' to encode the string.
2528*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002529
Guido van Rossum73624e91994-10-10 17:59:00 +00002530static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002531sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 int level;
2534 int optname;
2535 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002536 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002538 unsigned int optlen;
2539 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002540
Christian Heimesdffa3942016-09-05 23:54:41 +02002541 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (PyArg_ParseTuple(args, "iii:setsockopt",
2543 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002544 res = setsockopt(s->sock_fd, level, optname,
2545 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002546 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002548
2549 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002550 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002551 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2552 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2553 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002554 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002555 NULL, (socklen_t)optlen);
2556 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002558
2559 PyErr_Clear();
2560 /* setsockopt(level, opt, buffer) */
2561 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2562 &level, &optname, &optval))
2563 return NULL;
2564
2565#ifdef MS_WINDOWS
2566 if (optval.len > INT_MAX) {
2567 PyBuffer_Release(&optval);
2568 PyErr_Format(PyExc_OverflowError,
2569 "socket option is larger than %i bytes",
2570 INT_MAX);
2571 return NULL;
2572 }
2573 res = setsockopt(s->sock_fd, level, optname,
2574 optval.buf, (int)optval.len);
2575#else
2576 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2577#endif
2578 PyBuffer_Release(&optval);
2579
2580done:
Victor Stinnercc739322016-03-23 21:35:29 +01002581 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002583 }
2584
2585 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002586}
2587
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002589"setsockopt(level, option, value: int)\n\
2590setsockopt(level, option, value: buffer)\n\
2591setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002592\n\
2593Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002594The value argument can either be an integer, a string buffer, or \n\
2595None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002596
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002597
Guido van Rossumaee08791992-09-08 09:05:33 +00002598/* s.getsockopt() method.
2599 With two arguments, retrieves an integer option.
2600 With a third integer argument, retrieves a string buffer of that size;
2601 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002602
Guido van Rossum73624e91994-10-10 17:59:00 +00002603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002604sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 int level;
2607 int optname;
2608 int res;
2609 PyObject *buf;
2610 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2613 &level, &optname, &buflen))
2614 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 if (buflen == 0) {
2617 int flag = 0;
2618 socklen_t flagsize = sizeof flag;
2619 res = getsockopt(s->sock_fd, level, optname,
2620 (void *)&flag, &flagsize);
2621 if (res < 0)
2622 return s->errorhandler();
2623 return PyLong_FromLong(flag);
2624 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002626 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 "getsockopt buflen out of range");
2628 return NULL;
2629 }
2630 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2631 if (buf == NULL)
2632 return NULL;
2633 res = getsockopt(s->sock_fd, level, optname,
2634 (void *)PyBytes_AS_STRING(buf), &buflen);
2635 if (res < 0) {
2636 Py_DECREF(buf);
2637 return s->errorhandler();
2638 }
2639 _PyBytes_Resize(&buf, buflen);
2640 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002641}
2642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644"getsockopt(level, option[, buffersize]) -> value\n\
2645\n\
2646Get a socket option. See the Unix manual for level and option.\n\
2647If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002649
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002650
Fred Drake728819a2000-07-01 03:40:12 +00002651/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002652
Guido van Rossum73624e91994-10-10 17:59:00 +00002653static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002654sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 sock_addr_t addrbuf;
2657 int addrlen;
2658 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2661 return NULL;
2662 Py_BEGIN_ALLOW_THREADS
2663 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2664 Py_END_ALLOW_THREADS
2665 if (res < 0)
2666 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002667 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002668}
2669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002670PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002671"bind(address)\n\
2672\n\
2673Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002674pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002675sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002676
Guido van Rossum30a685f1991-06-27 15:51:29 +00002677
2678/* s.close() method.
2679 Set the file descriptor to -1 so operations tried subsequently
2680 will surely fail. */
2681
Guido van Rossum73624e91994-10-10 17:59:00 +00002682static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002683sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002686 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002687
Victor Stinner19a8e842016-03-21 16:36:48 +01002688 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002689 if (fd != INVALID_SOCKET) {
2690 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002691
2692 /* We do not want to retry upon EINTR: see
2693 http://lwn.net/Articles/576478/ and
2694 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2695 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002697 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002699 /* bpo-30319: The peer can already have closed the connection.
2700 Python ignores ECONNRESET on close(). */
2701 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002702 return s->errorhandler();
2703 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002705 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002706}
2707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709"close()\n\
2710\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002712
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002713static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002714sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002715{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002716 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002717 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002718 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002719}
2720
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002721PyDoc_STRVAR(detach_doc,
2722"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002723\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002724Close the socket object without closing the underlying file descriptor.\n\
2725The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002726can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002727
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002728static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002729sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002730{
Victor Stinner81c41db2015-04-02 11:50:57 +02002731 int err;
2732 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002733
Victor Stinner81c41db2015-04-02 11:50:57 +02002734 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2735 /* getsockopt() failed */
2736 return 0;
2737 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002738
Victor Stinner81c41db2015-04-02 11:50:57 +02002739 if (err == EISCONN)
2740 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002741 if (err != 0) {
2742 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2743 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002744 return 0;
2745 }
2746 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002747}
2748
2749static int
2750internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2751 int raise)
2752{
2753 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002754
2755 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002757 Py_END_ALLOW_THREADS
2758
Victor Stinner70a46f62015-03-31 22:03:59 +02002759 if (!res) {
2760 /* connect() succeeded, the socket is connected */
2761 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002763
Victor Stinner81c41db2015-04-02 11:50:57 +02002764 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002765
Victor Stinner81c41db2015-04-02 11:50:57 +02002766 /* save error, PyErr_CheckSignals() can replace it */
2767 err = GET_SOCK_ERROR;
2768 if (CHECK_ERRNO(EINTR)) {
2769 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002770 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002771
2772 /* Issue #23618: when connect() fails with EINTR, the connection is
2773 running asynchronously.
2774
2775 If the socket is blocking or has a timeout, wait until the
2776 connection completes, fails or timed out using select(), and then
2777 get the connection status using getsockopt(SO_ERROR).
2778
2779 If the socket is non-blocking, raise InterruptedError. The caller is
2780 responsible to wait until the connection completes, fails or timed
2781 out (it's the case in asyncio for example). */
2782 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2783 }
2784 else {
2785 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2786 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002787 }
2788
Victor Stinner81c41db2015-04-02 11:50:57 +02002789 if (!wait_connect) {
2790 if (raise) {
2791 /* restore error, maybe replaced by PyErr_CheckSignals() */
2792 SET_SOCK_ERROR(err);
2793 s->errorhandler();
2794 return -1;
2795 }
2796 else
2797 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002798 }
2799
Victor Stinner81c41db2015-04-02 11:50:57 +02002800 if (raise) {
2801 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002802 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2803 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002804 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002805 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002806 else {
2807 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002808 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2809 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002810 return err;
2811 }
2812 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002813}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002814
Fred Drake728819a2000-07-01 03:40:12 +00002815/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002816
Guido van Rossum73624e91994-10-10 17:59:00 +00002817static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002818sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 sock_addr_t addrbuf;
2821 int addrlen;
2822 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2825 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002826
Victor Stinner81c41db2015-04-02 11:50:57 +02002827 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002828 if (res < 0)
2829 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002830
Victor Stinneree699e92015-03-31 21:28:42 +02002831 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002832}
2833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835"connect(address)\n\
2836\n\
2837Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002838is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002839
Guido van Rossum30a685f1991-06-27 15:51:29 +00002840
Fred Drake728819a2000-07-01 03:40:12 +00002841/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002842
2843static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002844sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 sock_addr_t addrbuf;
2847 int addrlen;
2848 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2851 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852
Victor Stinner81c41db2015-04-02 11:50:57 +02002853 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002854 if (res < 0)
2855 return NULL;
2856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002858}
2859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002861"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002862\n\
2863This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002864instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002865
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002866
Guido van Rossumed233a51992-06-23 09:07:03 +00002867/* s.fileno() method */
2868
Guido van Rossum73624e91994-10-10 17:59:00 +00002869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002870sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002873}
2874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002876"fileno() -> integer\n\
2877\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002878Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002879
Guido van Rossumed233a51992-06-23 09:07:03 +00002880
Guido van Rossumc89705d1992-11-26 08:54:07 +00002881/* s.getsockname() method */
2882
Guido van Rossum73624e91994-10-10 17:59:00 +00002883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002884sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 sock_addr_t addrbuf;
2887 int res;
2888 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 if (!getsockaddrlen(s, &addrlen))
2891 return NULL;
2892 memset(&addrbuf, 0, addrlen);
2893 Py_BEGIN_ALLOW_THREADS
2894 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2895 Py_END_ALLOW_THREADS
2896 if (res < 0)
2897 return s->errorhandler();
2898 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2899 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002900}
2901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903"getsockname() -> address info\n\
2904\n\
2905Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002907
Guido van Rossumc89705d1992-11-26 08:54:07 +00002908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002910/* s.getpeername() method */
2911
Guido van Rossum73624e91994-10-10 17:59:00 +00002912static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 sock_addr_t addrbuf;
2916 int res;
2917 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 if (!getsockaddrlen(s, &addrlen))
2920 return NULL;
2921 memset(&addrbuf, 0, addrlen);
2922 Py_BEGIN_ALLOW_THREADS
2923 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2924 Py_END_ALLOW_THREADS
2925 if (res < 0)
2926 return s->errorhandler();
2927 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2928 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002929}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002931PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002932"getpeername() -> address info\n\
2933\n\
2934Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002935info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002936
Guido van Rossumb6775db1994-08-01 11:34:53 +00002937#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002938
2939
Guido van Rossum30a685f1991-06-27 15:51:29 +00002940/* s.listen(n) method */
2941
Guido van Rossum73624e91994-10-10 17:59:00 +00002942static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002943sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002944{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002945 /* We try to choose a default backlog high enough to avoid connection drops
2946 * for common workloads, yet not too high to limit resource usage. */
2947 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002949
Charles-François Natali644b8f52014-05-22 19:45:39 +01002950 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002954 /* To avoid problems on systems that don't allow a negative backlog
2955 * (which doesn't make sense anyway) we force a minimum value of 0. */
2956 if (backlog < 0)
2957 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 res = listen(s->sock_fd, backlog);
2959 Py_END_ALLOW_THREADS
2960 if (res < 0)
2961 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002962 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002963}
2964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002965PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002966"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002967\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002968Enable a server to accept connections. If backlog is specified, it must be\n\
2969at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002970unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002971connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002972
Victor Stinner31bf2d52015-04-01 21:57:09 +02002973struct sock_recv {
2974 char *cbuf;
2975 Py_ssize_t len;
2976 int flags;
2977 Py_ssize_t result;
2978};
2979
2980static int
2981sock_recv_impl(PySocketSockObject *s, void *data)
2982{
2983 struct sock_recv *ctx = data;
2984
2985#ifdef MS_WINDOWS
2986 if (ctx->len > INT_MAX)
2987 ctx->len = INT_MAX;
2988 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2989#else
2990 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2991#endif
2992 return (ctx->result >= 0);
2993}
2994
Guido van Rossum82a5c661998-07-07 20:45:43 +00002995
Thomas Wouters477c8d52006-05-27 19:21:47 +00002996/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002997 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002998 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002999 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003000 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003001 * also possible that we return a number of bytes smaller than the request
3002 * bytes.
3003 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003004
Antoine Pitrou19467d22010-08-17 19:33:30 +00003005static Py_ssize_t
3006sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003007{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003008 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 if (!IS_SELECTABLE(s)) {
3011 select_error();
3012 return -1;
3013 }
3014 if (len == 0) {
3015 /* If 0 bytes were requested, do nothing. */
3016 return 0;
3017 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003018
Victor Stinner31bf2d52015-04-01 21:57:09 +02003019 ctx.cbuf = cbuf;
3020 ctx.len = len;
3021 ctx.flags = flags;
3022 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003024
3025 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003026}
3027
Guido van Rossum48a680c2001-03-02 06:34:14 +00003028
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003029/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003030
Guido van Rossum73624e91994-10-10 17:59:00 +00003031static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003032sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003033{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003034 Py_ssize_t recvlen, outlen;
3035 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003037
Antoine Pitrou19467d22010-08-17 19:33:30 +00003038 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 if (recvlen < 0) {
3042 PyErr_SetString(PyExc_ValueError,
3043 "negative buffersize in recv");
3044 return NULL;
3045 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 /* Allocate a new string. */
3048 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3049 if (buf == NULL)
3050 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 /* Call the guts */
3053 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3054 if (outlen < 0) {
3055 /* An error occurred, release the string and return an
3056 error. */
3057 Py_DECREF(buf);
3058 return NULL;
3059 }
3060 if (outlen != recvlen) {
3061 /* We did not read as many bytes as we anticipated, resize the
3062 string if possible and be successful. */
3063 _PyBytes_Resize(&buf, outlen);
3064 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003067}
3068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003069PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003070"recv(buffersize[, flags]) -> data\n\
3071\n\
3072Receive up to buffersize bytes from the socket. For the optional flags\n\
3073argument, see the Unix manual. When no data is available, block until\n\
3074at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003075the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003076
Guido van Rossum30a685f1991-06-27 15:51:29 +00003077
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003078/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003079
Thomas Wouters477c8d52006-05-27 19:21:47 +00003080static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003081sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003084
Antoine Pitrou19467d22010-08-17 19:33:30 +00003085 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 Py_buffer pbuf;
3087 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003088 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003091 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 &pbuf, &recvlen, &flags))
3093 return NULL;
3094 buf = pbuf.buf;
3095 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 if (recvlen < 0) {
3098 PyBuffer_Release(&pbuf);
3099 PyErr_SetString(PyExc_ValueError,
3100 "negative buffersize in recv_into");
3101 return NULL;
3102 }
3103 if (recvlen == 0) {
3104 /* If nbytes was not specified, use the buffer's length */
3105 recvlen = buflen;
3106 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 /* Check if the buffer is large enough */
3109 if (buflen < recvlen) {
3110 PyBuffer_Release(&pbuf);
3111 PyErr_SetString(PyExc_ValueError,
3112 "buffer too small for requested bytes");
3113 return NULL;
3114 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 /* Call the guts */
3117 readlen = sock_recv_guts(s, buf, recvlen, flags);
3118 if (readlen < 0) {
3119 /* Return an error. */
3120 PyBuffer_Release(&pbuf);
3121 return NULL;
3122 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 PyBuffer_Release(&pbuf);
3125 /* Return the number of bytes read. Note that we do not do anything
3126 special here in the case that readlen < recvlen. */
3127 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003128}
3129
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003130PyDoc_STRVAR(recv_into_doc,
3131"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003132\n\
3133A version of recv() that stores its data into a buffer rather than creating \n\
3134a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3135is not specified (or 0), receive up to the size available in the given buffer.\n\
3136\n\
3137See recv() for documentation about the flags.");
3138
Victor Stinner31bf2d52015-04-01 21:57:09 +02003139struct sock_recvfrom {
3140 char* cbuf;
3141 Py_ssize_t len;
3142 int flags;
3143 socklen_t *addrlen;
3144 sock_addr_t *addrbuf;
3145 Py_ssize_t result;
3146};
3147
3148static int
3149sock_recvfrom_impl(PySocketSockObject *s, void *data)
3150{
3151 struct sock_recvfrom *ctx = data;
3152
3153 memset(ctx->addrbuf, 0, *ctx->addrlen);
3154
3155#ifdef MS_WINDOWS
3156 if (ctx->len > INT_MAX)
3157 ctx->len = INT_MAX;
3158 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3159 SAS2SA(ctx->addrbuf), ctx->addrlen);
3160#else
3161 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3162 SAS2SA(ctx->addrbuf), ctx->addrlen);
3163#endif
3164 return (ctx->result >= 0);
3165}
3166
Thomas Wouters477c8d52006-05-27 19:21:47 +00003167
3168/*
Christian Heimes99170a52007-12-19 02:07:34 +00003169 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3170 * into a char buffer. If you have any inc/def ref to do to the objects that
3171 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003172 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003173 * that it is also possible that we return a number of bytes smaller than the
3174 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003175 *
3176 * 'addr' is a return value for the address object. Note that you must decref
3177 * it yourself.
3178 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003179static Py_ssize_t
3180sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003185 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 if (!getsockaddrlen(s, &addrlen))
3190 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 if (!IS_SELECTABLE(s)) {
3193 select_error();
3194 return -1;
3195 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003196
Victor Stinner31bf2d52015-04-01 21:57:09 +02003197 ctx.cbuf = cbuf;
3198 ctx.len = len;
3199 ctx.flags = flags;
3200 ctx.addrbuf = &addrbuf;
3201 ctx.addrlen = &addrlen;
3202 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003204
Victor Stinner31bf2d52015-04-01 21:57:09 +02003205 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3206 s->sock_proto);
3207 if (*addr == NULL)
3208 return -1;
3209
3210 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003211}
3212
3213/* s.recvfrom(nbytes [,flags]) method */
3214
3215static PyObject *
3216sock_recvfrom(PySocketSockObject *s, PyObject *args)
3217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 PyObject *buf = NULL;
3219 PyObject *addr = NULL;
3220 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003221 int flags = 0;
3222 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003223
Antoine Pitrou19467d22010-08-17 19:33:30 +00003224 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 if (recvlen < 0) {
3228 PyErr_SetString(PyExc_ValueError,
3229 "negative buffersize in recvfrom");
3230 return NULL;
3231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3234 if (buf == NULL)
3235 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3238 recvlen, flags, &addr);
3239 if (outlen < 0) {
3240 goto finally;
3241 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 if (outlen != recvlen) {
3244 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003245 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003247 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 goto finally;
3249 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003252
3253finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 Py_XDECREF(buf);
3255 Py_XDECREF(addr);
3256 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003257}
3258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003259PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003260"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3261\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003262Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003263
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003265/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003266
3267static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003268sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003271
Antoine Pitrou19467d22010-08-17 19:33:30 +00003272 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 Py_buffer pbuf;
3274 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003275 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003278
Antoine Pitrou19467d22010-08-17 19:33:30 +00003279 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 kwlist, &pbuf,
3281 &recvlen, &flags))
3282 return NULL;
3283 buf = pbuf.buf;
3284 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 if (recvlen < 0) {
3287 PyBuffer_Release(&pbuf);
3288 PyErr_SetString(PyExc_ValueError,
3289 "negative buffersize in recvfrom_into");
3290 return NULL;
3291 }
3292 if (recvlen == 0) {
3293 /* If nbytes was not specified, use the buffer's length */
3294 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003295 } else if (recvlen > buflen) {
3296 PyBuffer_Release(&pbuf);
3297 PyErr_SetString(PyExc_ValueError,
3298 "nbytes is greater than the length of the buffer");
3299 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3303 if (readlen < 0) {
3304 PyBuffer_Release(&pbuf);
3305 /* Return an error */
3306 Py_XDECREF(addr);
3307 return NULL;
3308 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 PyBuffer_Release(&pbuf);
3311 /* Return the number of bytes read and the address. Note that we do
3312 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003313 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003314}
3315
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003316PyDoc_STRVAR(recvfrom_into_doc,
3317"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003318\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003319Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003320
Victor Stinner35bee932015-04-02 12:28:07 +02003321/* The sendmsg() and recvmsg[_into]() methods require a working
3322 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3323#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003324struct sock_recvmsg {
3325 struct msghdr *msg;
3326 int flags;
3327 ssize_t result;
3328};
3329
3330static int
3331sock_recvmsg_impl(PySocketSockObject *s, void *data)
3332{
3333 struct sock_recvmsg *ctx = data;
3334
3335 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3336 return (ctx->result >= 0);
3337}
3338
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003339/*
3340 * Call recvmsg() with the supplied iovec structures, flags, and
3341 * ancillary data buffer size (controllen). Returns the tuple return
3342 * value for recvmsg() or recvmsg_into(), with the first item provided
3343 * by the supplied makeval() function. makeval() will be called with
3344 * the length read and makeval_data as arguments, and must return a
3345 * new reference (which will be decrefed if there is a subsequent
3346 * error). On error, closes any file descriptors received via
3347 * SCM_RIGHTS.
3348 */
3349static PyObject *
3350sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3351 int flags, Py_ssize_t controllen,
3352 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3353{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003354 sock_addr_t addrbuf;
3355 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003356 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003357 PyObject *cmsg_list = NULL, *retval = NULL;
3358 void *controlbuf = NULL;
3359 struct cmsghdr *cmsgh;
3360 size_t cmsgdatalen = 0;
3361 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003362 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003363
3364 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3365 ignored" when the socket is connected (Linux fills them in
3366 anyway for AF_UNIX sockets at least). Normally msg_namelen
3367 seems to be set to 0 if there's no address, but try to
3368 initialize msg_name to something that won't be mistaken for a
3369 real address if that doesn't happen. */
3370 if (!getsockaddrlen(s, &addrbuflen))
3371 return NULL;
3372 memset(&addrbuf, 0, addrbuflen);
3373 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3374
3375 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3376 PyErr_SetString(PyExc_ValueError,
3377 "invalid ancillary data buffer length");
3378 return NULL;
3379 }
3380 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3381 return PyErr_NoMemory();
3382
3383 /* Make the system call. */
3384 if (!IS_SELECTABLE(s)) {
3385 select_error();
3386 goto finally;
3387 }
3388
Victor Stinner31bf2d52015-04-01 21:57:09 +02003389 msg.msg_name = SAS2SA(&addrbuf);
3390 msg.msg_namelen = addrbuflen;
3391 msg.msg_iov = iov;
3392 msg.msg_iovlen = iovlen;
3393 msg.msg_control = controlbuf;
3394 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003395
Victor Stinner31bf2d52015-04-01 21:57:09 +02003396 ctx.msg = &msg;
3397 ctx.flags = flags;
3398 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003399 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003400
3401 /* Make list of (level, type, data) tuples from control messages. */
3402 if ((cmsg_list = PyList_New(0)) == NULL)
3403 goto err_closefds;
3404 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3405 implementations didn't do so. */
3406 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3407 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3408 PyObject *bytes, *tuple;
3409 int tmp;
3410
3411 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3412 if (cmsg_status != 0) {
3413 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3414 "received malformed or improperly-truncated "
3415 "ancillary data", 1) == -1)
3416 goto err_closefds;
3417 }
3418 if (cmsg_status < 0)
3419 break;
3420 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003421 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003422 goto err_closefds;
3423 }
3424
3425 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3426 cmsgdatalen);
3427 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3428 (int)cmsgh->cmsg_type, bytes);
3429 if (tuple == NULL)
3430 goto err_closefds;
3431 tmp = PyList_Append(cmsg_list, tuple);
3432 Py_DECREF(tuple);
3433 if (tmp != 0)
3434 goto err_closefds;
3435
3436 if (cmsg_status != 0)
3437 break;
3438 }
3439
3440 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003441 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003442 cmsg_list,
3443 (int)msg.msg_flags,
3444 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3445 ((msg.msg_namelen > addrbuflen) ?
3446 addrbuflen : msg.msg_namelen),
3447 s->sock_proto));
3448 if (retval == NULL)
3449 goto err_closefds;
3450
3451finally:
3452 Py_XDECREF(cmsg_list);
3453 PyMem_Free(controlbuf);
3454 return retval;
3455
3456err_closefds:
3457#ifdef SCM_RIGHTS
3458 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3459 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3460 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3461 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3462 if (cmsg_status < 0)
3463 break;
3464 if (cmsgh->cmsg_level == SOL_SOCKET &&
3465 cmsgh->cmsg_type == SCM_RIGHTS) {
3466 size_t numfds;
3467 int *fdp;
3468
3469 numfds = cmsgdatalen / sizeof(int);
3470 fdp = (int *)CMSG_DATA(cmsgh);
3471 while (numfds-- > 0)
3472 close(*fdp++);
3473 }
3474 if (cmsg_status != 0)
3475 break;
3476 }
3477#endif /* SCM_RIGHTS */
3478 goto finally;
3479}
3480
3481
3482static PyObject *
3483makeval_recvmsg(ssize_t received, void *data)
3484{
3485 PyObject **buf = data;
3486
3487 if (received < PyBytes_GET_SIZE(*buf))
3488 _PyBytes_Resize(buf, received);
3489 Py_XINCREF(*buf);
3490 return *buf;
3491}
3492
3493/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3494
3495static PyObject *
3496sock_recvmsg(PySocketSockObject *s, PyObject *args)
3497{
3498 Py_ssize_t bufsize, ancbufsize = 0;
3499 int flags = 0;
3500 struct iovec iov;
3501 PyObject *buf = NULL, *retval = NULL;
3502
3503 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3504 return NULL;
3505
3506 if (bufsize < 0) {
3507 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3508 return NULL;
3509 }
3510 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3511 return NULL;
3512 iov.iov_base = PyBytes_AS_STRING(buf);
3513 iov.iov_len = bufsize;
3514
3515 /* Note that we're passing a pointer to *our pointer* to the bytes
3516 object here (&buf); makeval_recvmsg() may incref the object, or
3517 deallocate it and set our pointer to NULL. */
3518 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3519 &makeval_recvmsg, &buf);
3520 Py_XDECREF(buf);
3521 return retval;
3522}
3523
3524PyDoc_STRVAR(recvmsg_doc,
3525"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3526\n\
3527Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3528socket. The ancbufsize argument sets the size in bytes of the\n\
3529internal buffer used to receive the ancillary data; it defaults to 0,\n\
3530meaning that no ancillary data will be received. Appropriate buffer\n\
3531sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3532CMSG_LEN(), and items which do not fit into the buffer might be\n\
3533truncated or discarded. The flags argument defaults to 0 and has the\n\
3534same meaning as for recv().\n\
3535\n\
3536The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3537The data item is a bytes object holding the non-ancillary data\n\
3538received. The ancdata item is a list of zero or more tuples\n\
3539(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3540(control messages) received: cmsg_level and cmsg_type are integers\n\
3541specifying the protocol level and protocol-specific type respectively,\n\
3542and cmsg_data is a bytes object holding the associated data. The\n\
3543msg_flags item is the bitwise OR of various flags indicating\n\
3544conditions on the received message; see your system documentation for\n\
3545details. If the receiving socket is unconnected, address is the\n\
3546address of the sending socket, if available; otherwise, its value is\n\
3547unspecified.\n\
3548\n\
3549If recvmsg() raises an exception after the system call returns, it\n\
3550will first attempt to close any file descriptors received via the\n\
3551SCM_RIGHTS mechanism.");
3552
3553
3554static PyObject *
3555makeval_recvmsg_into(ssize_t received, void *data)
3556{
3557 return PyLong_FromSsize_t(received);
3558}
3559
3560/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3561
3562static PyObject *
3563sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3564{
3565 Py_ssize_t ancbufsize = 0;
3566 int flags = 0;
3567 struct iovec *iovs = NULL;
3568 Py_ssize_t i, nitems, nbufs = 0;
3569 Py_buffer *bufs = NULL;
3570 PyObject *buffers_arg, *fast, *retval = NULL;
3571
3572 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3573 &buffers_arg, &ancbufsize, &flags))
3574 return NULL;
3575
3576 if ((fast = PySequence_Fast(buffers_arg,
3577 "recvmsg_into() argument 1 must be an "
3578 "iterable")) == NULL)
3579 return NULL;
3580 nitems = PySequence_Fast_GET_SIZE(fast);
3581 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003582 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003583 goto finally;
3584 }
3585
3586 /* Fill in an iovec for each item, and save the Py_buffer
3587 structs to release afterwards. */
3588 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3589 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3590 PyErr_NoMemory();
3591 goto finally;
3592 }
3593 for (; nbufs < nitems; nbufs++) {
3594 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3595 "w*;recvmsg_into() argument 1 must be an iterable "
3596 "of single-segment read-write buffers",
3597 &bufs[nbufs]))
3598 goto finally;
3599 iovs[nbufs].iov_base = bufs[nbufs].buf;
3600 iovs[nbufs].iov_len = bufs[nbufs].len;
3601 }
3602
3603 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3604 &makeval_recvmsg_into, NULL);
3605finally:
3606 for (i = 0; i < nbufs; i++)
3607 PyBuffer_Release(&bufs[i]);
3608 PyMem_Free(bufs);
3609 PyMem_Free(iovs);
3610 Py_DECREF(fast);
3611 return retval;
3612}
3613
3614PyDoc_STRVAR(recvmsg_into_doc,
3615"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3616\n\
3617Receive normal data and ancillary data from the socket, scattering the\n\
3618non-ancillary data into a series of buffers. The buffers argument\n\
3619must be an iterable of objects that export writable buffers\n\
3620(e.g. bytearray objects); these will be filled with successive chunks\n\
3621of the non-ancillary data until it has all been written or there are\n\
3622no more buffers. The ancbufsize argument sets the size in bytes of\n\
3623the internal buffer used to receive the ancillary data; it defaults to\n\
36240, meaning that no ancillary data will be received. Appropriate\n\
3625buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3626or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3627truncated or discarded. The flags argument defaults to 0 and has the\n\
3628same meaning as for recv().\n\
3629\n\
3630The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3631The nbytes item is the total number of bytes of non-ancillary data\n\
3632written into the buffers. The ancdata item is a list of zero or more\n\
3633tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3634data (control messages) received: cmsg_level and cmsg_type are\n\
3635integers specifying the protocol level and protocol-specific type\n\
3636respectively, and cmsg_data is a bytes object holding the associated\n\
3637data. The msg_flags item is the bitwise OR of various flags\n\
3638indicating conditions on the received message; see your system\n\
3639documentation for details. If the receiving socket is unconnected,\n\
3640address is the address of the sending socket, if available; otherwise,\n\
3641its value is unspecified.\n\
3642\n\
3643If recvmsg_into() raises an exception after the system call returns,\n\
3644it will first attempt to close any file descriptors received via the\n\
3645SCM_RIGHTS mechanism.");
3646#endif /* CMSG_LEN */
3647
3648
Victor Stinner31bf2d52015-04-01 21:57:09 +02003649struct sock_send {
3650 char *buf;
3651 Py_ssize_t len;
3652 int flags;
3653 Py_ssize_t result;
3654};
3655
3656static int
3657sock_send_impl(PySocketSockObject *s, void *data)
3658{
3659 struct sock_send *ctx = data;
3660
3661#ifdef MS_WINDOWS
3662 if (ctx->len > INT_MAX)
3663 ctx->len = INT_MAX;
3664 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3665#else
3666 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3667#endif
3668 return (ctx->result >= 0);
3669}
3670
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003671/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003672
Guido van Rossum73624e91994-10-10 17:59:00 +00003673static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003674sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003675{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003676 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003678 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3681 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 if (!IS_SELECTABLE(s)) {
3684 PyBuffer_Release(&pbuf);
3685 return select_error();
3686 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003687 ctx.buf = pbuf.buf;
3688 ctx.len = pbuf.len;
3689 ctx.flags = flags;
3690 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003691 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 return NULL;
3693 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003694 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003695
3696 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003697}
3698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003699PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003700"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003701\n\
3702Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003703argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003704sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003705
3706
3707/* s.sendall(data [,flags]) method */
3708
3709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003710sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003713 Py_ssize_t len, n;
3714 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003716 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003717 int has_timeout = (s->sock_timeout > 0);
3718 _PyTime_t interval = s->sock_timeout;
3719 _PyTime_t deadline = 0;
3720 int deadline_initialized = 0;
3721 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3724 return NULL;
3725 buf = pbuf.buf;
3726 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 if (!IS_SELECTABLE(s)) {
3729 PyBuffer_Release(&pbuf);
3730 return select_error();
3731 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003734 if (has_timeout) {
3735 if (deadline_initialized) {
3736 /* recompute the timeout */
3737 interval = deadline - _PyTime_GetMonotonicClock();
3738 }
3739 else {
3740 deadline_initialized = 1;
3741 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3742 }
3743
3744 if (interval <= 0) {
3745 PyErr_SetString(socket_timeout, "timed out");
3746 goto done;
3747 }
3748 }
3749
Victor Stinner02f32ab2015-04-01 22:53:26 +02003750 ctx.buf = buf;
3751 ctx.len = len;
3752 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003753 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3754 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003755 n = ctx.result;
3756 assert(n >= 0);
3757
3758 buf += n;
3759 len -= n;
3760
3761 /* We must run our signal handlers before looping again.
3762 send() can return a successful partial write when it is
3763 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003764 if (PyErr_CheckSignals())
3765 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003766 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003768
Victor Stinner8912d142015-04-06 23:16:34 +02003769 Py_INCREF(Py_None);
3770 res = Py_None;
3771
3772done:
3773 PyBuffer_Release(&pbuf);
3774 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003775}
3776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003777PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003778"sendall(data[, flags])\n\
3779\n\
3780Send a data string to the socket. For the optional flags\n\
3781argument, see the Unix manual. This calls send() repeatedly\n\
3782until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003783to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003784
Guido van Rossum30a685f1991-06-27 15:51:29 +00003785
Victor Stinner31bf2d52015-04-01 21:57:09 +02003786struct sock_sendto {
3787 char *buf;
3788 Py_ssize_t len;
3789 int flags;
3790 int addrlen;
3791 sock_addr_t *addrbuf;
3792 Py_ssize_t result;
3793};
3794
3795static int
3796sock_sendto_impl(PySocketSockObject *s, void *data)
3797{
3798 struct sock_sendto *ctx = data;
3799
3800#ifdef MS_WINDOWS
3801 if (ctx->len > INT_MAX)
3802 ctx->len = INT_MAX;
3803 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3804 SAS2SA(ctx->addrbuf), ctx->addrlen);
3805#else
3806 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3807 SAS2SA(ctx->addrbuf), ctx->addrlen);
3808#endif
3809 return (ctx->result >= 0);
3810}
3811
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003812/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003813
Guido van Rossum73624e91994-10-10 17:59:00 +00003814static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003815sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003817 Py_buffer pbuf;
3818 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003819 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003821 int addrlen, flags;
3822 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003824 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003825 arglen = PyTuple_Size(args);
3826 switch (arglen) {
3827 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003828 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3829 return NULL;
3830 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003831 break;
3832 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003833 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3834 &pbuf, &flags, &addro)) {
3835 return NULL;
3836 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003837 break;
3838 default:
3839 PyErr_Format(PyExc_TypeError,
3840 "sendto() takes 2 or 3 arguments (%d given)",
3841 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003842 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 if (!IS_SELECTABLE(s)) {
3846 PyBuffer_Release(&pbuf);
3847 return select_error();
3848 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3851 PyBuffer_Release(&pbuf);
3852 return NULL;
3853 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003854
Victor Stinner31bf2d52015-04-01 21:57:09 +02003855 ctx.buf = pbuf.buf;
3856 ctx.len = pbuf.len;
3857 ctx.flags = flags;
3858 ctx.addrlen = addrlen;
3859 ctx.addrbuf = &addrbuf;
3860 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003861 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 return NULL;
3863 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003864 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003865
3866 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003867}
3868
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003869PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003870"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003871\n\
3872Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003873For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003874
Guido van Rossum30a685f1991-06-27 15:51:29 +00003875
Victor Stinner35bee932015-04-02 12:28:07 +02003876/* The sendmsg() and recvmsg[_into]() methods require a working
3877 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3878#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003879struct sock_sendmsg {
3880 struct msghdr *msg;
3881 int flags;
3882 ssize_t result;
3883};
3884
3885static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003886sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3887 struct msghdr *msg,
3888 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3889 Py_ssize_t ndataparts, ndatabufs = 0;
3890 int result = -1;
3891 struct iovec *iovs = NULL;
3892 PyObject *data_fast = NULL;
3893 Py_buffer *databufs = NULL;
3894
3895 /* Fill in an iovec for each message part, and save the Py_buffer
3896 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003897 data_fast = PySequence_Fast(data_arg,
3898 "sendmsg() argument 1 must be an "
3899 "iterable");
3900 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003901 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003902 }
3903
Christian Heimesdffa3942016-09-05 23:54:41 +02003904 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3905 if (ndataparts > INT_MAX) {
3906 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3907 goto finally;
3908 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003909
Christian Heimesdffa3942016-09-05 23:54:41 +02003910 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003911 if (ndataparts > 0) {
3912 iovs = PyMem_New(struct iovec, ndataparts);
3913 if (iovs == NULL) {
3914 PyErr_NoMemory();
3915 goto finally;
3916 }
3917 msg->msg_iov = iovs;
3918
3919 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003920 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003921 PyErr_NoMemory();
3922 goto finally;
3923 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003924 }
3925 for (; ndatabufs < ndataparts; ndatabufs++) {
3926 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3927 "y*;sendmsg() argument 1 must be an iterable of "
3928 "bytes-like objects",
3929 &databufs[ndatabufs]))
3930 goto finally;
3931 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3932 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3933 }
3934 result = 0;
3935 finally:
3936 *databufsout = databufs;
3937 *ndatabufsout = ndatabufs;
3938 Py_XDECREF(data_fast);
3939 return result;
3940}
3941
3942static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003943sock_sendmsg_impl(PySocketSockObject *s, void *data)
3944{
3945 struct sock_sendmsg *ctx = data;
3946
3947 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3948 return (ctx->result >= 0);
3949}
3950
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3952
3953static PyObject *
3954sock_sendmsg(PySocketSockObject *s, PyObject *args)
3955{
Christian Heimesdffa3942016-09-05 23:54:41 +02003956 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003959 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003960 struct cmsginfo {
3961 int level;
3962 int type;
3963 Py_buffer data;
3964 } *cmsgs = NULL;
3965 void *controlbuf = NULL;
3966 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003967 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003968 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003969 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003970 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003971
3972 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02003973 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003975 }
3976
3977 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003978
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003979 /* Parse destination address. */
3980 if (addr_arg != NULL && addr_arg != Py_None) {
3981 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3982 goto finally;
3983 msg.msg_name = &addrbuf;
3984 msg.msg_namelen = addrlen;
3985 }
3986
3987 /* Fill in an iovec for each message part, and save the Py_buffer
3988 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02003989 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003991 }
3992
3993 if (cmsg_arg == NULL)
3994 ncmsgs = 0;
3995 else {
3996 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3997 "sendmsg() argument 2 must be an "
3998 "iterable")) == NULL)
3999 goto finally;
4000 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4001 }
4002
4003#ifndef CMSG_SPACE
4004 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004005 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004006 "sending multiple control messages is not supported "
4007 "on this system");
4008 goto finally;
4009 }
4010#endif
4011 /* Save level, type and Py_buffer for each control message,
4012 and calculate total size. */
4013 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4014 PyErr_NoMemory();
4015 goto finally;
4016 }
4017 controllen = controllen_last = 0;
4018 while (ncmsgbufs < ncmsgs) {
4019 size_t bufsize, space;
4020
4021 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4022 "(iiy*):[sendmsg() ancillary data items]",
4023 &cmsgs[ncmsgbufs].level,
4024 &cmsgs[ncmsgbufs].type,
4025 &cmsgs[ncmsgbufs].data))
4026 goto finally;
4027 bufsize = cmsgs[ncmsgbufs++].data.len;
4028
4029#ifdef CMSG_SPACE
4030 if (!get_CMSG_SPACE(bufsize, &space)) {
4031#else
4032 if (!get_CMSG_LEN(bufsize, &space)) {
4033#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004034 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035 goto finally;
4036 }
4037 controllen += space;
4038 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004039 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004040 goto finally;
4041 }
4042 controllen_last = controllen;
4043 }
4044
4045 /* Construct ancillary data block from control message info. */
4046 if (ncmsgbufs > 0) {
4047 struct cmsghdr *cmsgh = NULL;
4048
Victor Stinner52d61e42016-09-12 11:41:58 +02004049 controlbuf = PyMem_Malloc(controllen);
4050 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051 PyErr_NoMemory();
4052 goto finally;
4053 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004054 msg.msg_control = controlbuf;
4055
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004056 msg.msg_controllen = controllen;
4057
4058 /* Need to zero out the buffer as a workaround for glibc's
4059 CMSG_NXTHDR() implementation. After getting the pointer to
4060 the next header, it checks its (uninitialized) cmsg_len
4061 member to see if the "message" fits in the buffer, and
4062 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004063 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004064 memset(controlbuf, 0, controllen);
4065
4066 for (i = 0; i < ncmsgbufs; i++) {
4067 size_t msg_len, data_len = cmsgs[i].data.len;
4068 int enough_space = 0;
4069
4070 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4071 if (cmsgh == NULL) {
4072 PyErr_Format(PyExc_RuntimeError,
4073 "unexpected NULL result from %s()",
4074 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4075 goto finally;
4076 }
4077 if (!get_CMSG_LEN(data_len, &msg_len)) {
4078 PyErr_SetString(PyExc_RuntimeError,
4079 "item size out of range for CMSG_LEN()");
4080 goto finally;
4081 }
4082 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4083 size_t space;
4084
4085 cmsgh->cmsg_len = msg_len;
4086 if (get_cmsg_data_space(&msg, cmsgh, &space))
4087 enough_space = (space >= data_len);
4088 }
4089 if (!enough_space) {
4090 PyErr_SetString(PyExc_RuntimeError,
4091 "ancillary data does not fit in calculated "
4092 "space");
4093 goto finally;
4094 }
4095 cmsgh->cmsg_level = cmsgs[i].level;
4096 cmsgh->cmsg_type = cmsgs[i].type;
4097 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4098 }
4099 }
4100
4101 /* Make the system call. */
4102 if (!IS_SELECTABLE(s)) {
4103 select_error();
4104 goto finally;
4105 }
4106
Victor Stinner31bf2d52015-04-01 21:57:09 +02004107 ctx.msg = &msg;
4108 ctx.flags = flags;
4109 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004110 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004111
4112 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113
4114finally:
4115 PyMem_Free(controlbuf);
4116 for (i = 0; i < ncmsgbufs; i++)
4117 PyBuffer_Release(&cmsgs[i].data);
4118 PyMem_Free(cmsgs);
4119 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004120 PyMem_Free(msg.msg_iov);
4121 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004122 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004123 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004125 return retval;
4126}
4127
4128PyDoc_STRVAR(sendmsg_doc,
4129"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4130\n\
4131Send normal and ancillary data to the socket, gathering the\n\
4132non-ancillary data from a series of buffers and concatenating it into\n\
4133a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004134data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004135The ancdata argument specifies the ancillary data (control messages)\n\
4136as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4137cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4138protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004139is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004140argument defaults to 0 and has the same meaning as for send(). If\n\
4141address is supplied and not None, it sets a destination address for\n\
4142the message. The return value is the number of bytes of non-ancillary\n\
4143data sent.");
4144#endif /* CMSG_LEN */
4145
Christian Heimesdffa3942016-09-05 23:54:41 +02004146#ifdef HAVE_SOCKADDR_ALG
4147static PyObject*
4148sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4149{
4150 PyObject *retval = NULL;
4151
4152 Py_ssize_t i, ndatabufs = 0;
4153 Py_buffer *databufs = NULL;
4154 PyObject *data_arg = NULL;
4155
4156 Py_buffer iv = {NULL, NULL};
4157
4158 PyObject *opobj = NULL;
4159 int op = -1;
4160
4161 PyObject *assoclenobj = NULL;
4162 int assoclen = -1;
4163
4164 unsigned int *uiptr;
4165 int flags = 0;
4166
4167 struct msghdr msg;
4168 struct cmsghdr *header = NULL;
4169 struct af_alg_iv *alg_iv = NULL;
4170 struct sock_sendmsg ctx;
4171 Py_ssize_t controllen;
4172 void *controlbuf = NULL;
4173 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4174
4175 if (self->sock_family != AF_ALG) {
4176 PyErr_SetString(PyExc_OSError,
4177 "algset is only supported for AF_ALG");
4178 return NULL;
4179 }
4180
4181 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4182 "|O$O!y*O!i:sendmsg_afalg", keywords,
4183 &data_arg,
4184 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004185 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004186 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004187 }
4188
4189 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004190
4191 /* op is a required, keyword-only argument >= 0 */
4192 if (opobj != NULL) {
4193 op = _PyLong_AsInt(opobj);
4194 }
4195 if (op < 0) {
4196 /* override exception from _PyLong_AsInt() */
4197 PyErr_SetString(PyExc_TypeError,
4198 "Invalid or missing argument 'op'");
4199 goto finally;
4200 }
4201 /* assoclen is optional but must be >= 0 */
4202 if (assoclenobj != NULL) {
4203 assoclen = _PyLong_AsInt(assoclenobj);
4204 if (assoclen == -1 && PyErr_Occurred()) {
4205 goto finally;
4206 }
4207 if (assoclen < 0) {
4208 PyErr_SetString(PyExc_TypeError,
4209 "assoclen must be positive");
4210 goto finally;
4211 }
4212 }
4213
4214 controllen = CMSG_SPACE(4);
4215 if (iv.buf != NULL) {
4216 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4217 }
4218 if (assoclen >= 0) {
4219 controllen += CMSG_SPACE(4);
4220 }
4221
4222 controlbuf = PyMem_Malloc(controllen);
4223 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004224 PyErr_NoMemory();
4225 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004226 }
4227 memset(controlbuf, 0, controllen);
4228
Christian Heimesdffa3942016-09-05 23:54:41 +02004229 msg.msg_controllen = controllen;
4230 msg.msg_control = controlbuf;
4231
4232 /* Fill in an iovec for each message part, and save the Py_buffer
4233 structs to release afterwards. */
4234 if (data_arg != NULL) {
4235 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4236 goto finally;
4237 }
4238 }
4239
4240 /* set operation to encrypt or decrypt */
4241 header = CMSG_FIRSTHDR(&msg);
4242 if (header == NULL) {
4243 PyErr_SetString(PyExc_RuntimeError,
4244 "unexpected NULL result from CMSG_FIRSTHDR");
4245 goto finally;
4246 }
4247 header->cmsg_level = SOL_ALG;
4248 header->cmsg_type = ALG_SET_OP;
4249 header->cmsg_len = CMSG_LEN(4);
4250 uiptr = (void*)CMSG_DATA(header);
4251 *uiptr = (unsigned int)op;
4252
4253 /* set initialization vector */
4254 if (iv.buf != NULL) {
4255 header = CMSG_NXTHDR(&msg, header);
4256 if (header == NULL) {
4257 PyErr_SetString(PyExc_RuntimeError,
4258 "unexpected NULL result from CMSG_NXTHDR(iv)");
4259 goto finally;
4260 }
4261 header->cmsg_level = SOL_ALG;
4262 header->cmsg_type = ALG_SET_IV;
4263 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4264 alg_iv = (void*)CMSG_DATA(header);
4265 alg_iv->ivlen = iv.len;
4266 memcpy(alg_iv->iv, iv.buf, iv.len);
4267 }
4268
4269 /* set length of associated data for AEAD */
4270 if (assoclen >= 0) {
4271 header = CMSG_NXTHDR(&msg, header);
4272 if (header == NULL) {
4273 PyErr_SetString(PyExc_RuntimeError,
4274 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4275 goto finally;
4276 }
4277 header->cmsg_level = SOL_ALG;
4278 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4279 header->cmsg_len = CMSG_LEN(4);
4280 uiptr = (void*)CMSG_DATA(header);
4281 *uiptr = (unsigned int)assoclen;
4282 }
4283
4284 ctx.msg = &msg;
4285 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004286 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004287 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004288 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004289
4290 retval = PyLong_FromSsize_t(ctx.result);
4291
4292 finally:
4293 PyMem_Free(controlbuf);
4294 if (iv.buf != NULL) {
4295 PyBuffer_Release(&iv);
4296 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004297 PyMem_Free(msg.msg_iov);
4298 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004299 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004300 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004301 PyMem_Free(databufs);
4302 return retval;
4303}
4304
4305PyDoc_STRVAR(sendmsg_afalg_doc,
4306"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4307\n\
4308Set operation mode, IV and length of associated data for an AF_ALG\n\
4309operation socket.");
4310#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004311
Guido van Rossum30a685f1991-06-27 15:51:29 +00004312/* s.shutdown(how) method */
4313
Guido van Rossum73624e91994-10-10 17:59:00 +00004314static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004315sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 int how;
4318 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004319
Serhiy Storchaka78980432013-01-15 01:12:17 +02004320 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 if (how == -1 && PyErr_Occurred())
4322 return NULL;
4323 Py_BEGIN_ALLOW_THREADS
4324 res = shutdown(s->sock_fd, how);
4325 Py_END_ALLOW_THREADS
4326 if (res < 0)
4327 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004328 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004329}
4330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004331PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004332"shutdown(flag)\n\
4333\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004334Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4335of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004336
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004337#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004338static PyObject*
4339sock_ioctl(PySocketSockObject *s, PyObject *arg)
4340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 unsigned long cmd = SIO_RCVALL;
4342 PyObject *argO;
4343 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4346 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 switch (cmd) {
4349 case SIO_RCVALL: {
4350 unsigned int option = RCVALL_ON;
4351 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4352 return NULL;
4353 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4354 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4355 return set_error();
4356 }
4357 return PyLong_FromUnsignedLong(recv); }
4358 case SIO_KEEPALIVE_VALS: {
4359 struct tcp_keepalive ka;
4360 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4361 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4362 return NULL;
4363 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4364 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4365 return set_error();
4366 }
4367 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004368#if defined(SIO_LOOPBACK_FAST_PATH)
4369 case SIO_LOOPBACK_FAST_PATH: {
4370 unsigned int option;
4371 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4372 return NULL;
4373 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4374 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4375 return set_error();
4376 }
4377 return PyLong_FromUnsignedLong(recv); }
4378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 default:
4380 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4381 return NULL;
4382 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004383}
4384PyDoc_STRVAR(sock_ioctl_doc,
4385"ioctl(cmd, option) -> long\n\
4386\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004387Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4388SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004389SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4390SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004391#endif
4392
4393#if defined(MS_WINDOWS)
4394static PyObject*
4395sock_share(PySocketSockObject *s, PyObject *arg)
4396{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004397 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004398 DWORD processId;
4399 int result;
4400
4401 if (!PyArg_ParseTuple(arg, "I", &processId))
4402 return NULL;
4403
4404 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004405 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004406 Py_END_ALLOW_THREADS
4407 if (result == SOCKET_ERROR)
4408 return set_error();
4409 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4410}
4411PyDoc_STRVAR(sock_share_doc,
4412"share(process_id) -> bytes\n\
4413\n\
4414Share the socket with another process. The target process id\n\
4415must be provided and the resulting bytes object passed to the target\n\
4416process. There the shared socket can be instantiated by calling\n\
4417socket.fromshare().");
4418
Christian Heimesfaf2f632008-01-06 16:59:19 +00004419
4420#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004421
4422/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004423
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004424static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4426 accept_doc},
4427 {"bind", (PyCFunction)sock_bind, METH_O,
4428 bind_doc},
4429 {"close", (PyCFunction)sock_close, METH_NOARGS,
4430 close_doc},
4431 {"connect", (PyCFunction)sock_connect, METH_O,
4432 connect_doc},
4433 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4434 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004435 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4436 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4438 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004439#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 {"getpeername", (PyCFunction)sock_getpeername,
4441 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 {"getsockname", (PyCFunction)sock_getsockname,
4444 METH_NOARGS, getsockname_doc},
4445 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4446 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004447#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4449 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004450#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004451#if defined(MS_WINDOWS)
4452 {"share", (PyCFunction)sock_share, METH_VARARGS,
4453 sock_share_doc},
4454#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004455 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 listen_doc},
4457 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4458 recv_doc},
4459 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4460 recv_into_doc},
4461 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4462 recvfrom_doc},
4463 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4464 recvfrom_into_doc},
4465 {"send", (PyCFunction)sock_send, METH_VARARGS,
4466 send_doc},
4467 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4468 sendall_doc},
4469 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4470 sendto_doc},
4471 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4472 setblocking_doc},
4473 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4474 settimeout_doc},
4475 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4476 gettimeout_doc},
4477 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4478 setsockopt_doc},
4479 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4480 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004481#ifdef CMSG_LEN
4482 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4483 recvmsg_doc},
4484 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4485 recvmsg_into_doc,},
4486 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4487 sendmsg_doc},
4488#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004489#ifdef HAVE_SOCKADDR_ALG
4490 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4491 sendmsg_afalg_doc},
4492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004494};
4495
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004496/* SockObject members */
4497static PyMemberDef sock_memberlist[] = {
4498 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4499 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4500 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004501 {0},
4502};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004503
Victor Stinner71694d52015-03-28 01:18:54 +01004504static PyGetSetDef sock_getsetlist[] = {
4505 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4506 {NULL} /* sentinel */
4507};
4508
Guido van Rossum73624e91994-10-10 17:59:00 +00004509/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004510 First close the file description. */
4511
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004512static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004513sock_finalize(PySocketSockObject *s)
4514{
4515 SOCKET_T fd;
4516 PyObject *error_type, *error_value, *error_traceback;
4517
4518 /* Save the current exception, if any. */
4519 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4520
Victor Stinnerd3afb622016-07-22 17:47:09 +02004521 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004522 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4523 /* Spurious errors can appear at shutdown */
4524 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4525 PyErr_WriteUnraisable((PyObject *)s);
4526 }
4527 }
4528
4529 /* Only close the socket *after* logging the ResourceWarning warning
4530 to allow the logger to call socket methods like
4531 socket.getsockname(). If the socket is closed before, socket
4532 methods fails with the EBADF error. */
4533 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004534 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004535
4536 /* We do not want to retry upon EINTR: see sock_close() */
4537 Py_BEGIN_ALLOW_THREADS
4538 (void) SOCKETCLOSE(fd);
4539 Py_END_ALLOW_THREADS
4540 }
4541
4542 /* Restore the saved exception. */
4543 PyErr_Restore(error_type, error_value, error_traceback);
4544}
4545
4546static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004547sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004548{
Victor Stinner19a8e842016-03-21 16:36:48 +01004549 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4550 return;
4551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004553}
4554
Guido van Rossum30a685f1991-06-27 15:51:29 +00004555
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004556static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004557sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004558{
Victor Stinnere254e532014-07-26 14:36:55 +02004559 long sock_fd;
4560 /* On Windows, this test is needed because SOCKET_T is unsigned */
4561 if (s->sock_fd == INVALID_SOCKET) {
4562 sock_fd = -1;
4563 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004564#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004565 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 /* this can occur on Win64, and actually there is a special
4567 ugly printf formatter for decimal pointer length integer
4568 printing, only bother if necessary*/
4569 PyErr_SetString(PyExc_OverflowError,
4570 "no printf formatter to display "
4571 "the socket descriptor in decimal");
4572 return NULL;
4573 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004574#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004575 else
4576 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 return PyUnicode_FromFormat(
4578 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004579 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 s->sock_type,
4581 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004582}
4583
4584
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004585/* Create a new, uninitialized socket object. */
4586
4587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004588sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 new = type->tp_alloc(type, 0);
4593 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004594 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004595 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 ((PySocketSockObject *)new)->errorhandler = &set_error;
4597 }
4598 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004599}
4600
4601
4602/* Initialize a new socket object. */
4603
Victor Stinnerdaf45552013-08-28 00:53:59 +02004604#ifdef SOCK_CLOEXEC
4605/* socket() and socketpair() fail with EINVAL on Linux kernel older
4606 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4607static int sock_cloexec_works = -1;
4608#endif
4609
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004610/*ARGSUSED*/
4611static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004612sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 PySocketSockObject *s = (PySocketSockObject *)self;
4615 PyObject *fdobj = NULL;
4616 SOCKET_T fd = INVALID_SOCKET;
4617 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4618 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004619#ifndef MS_WINDOWS
4620#ifdef SOCK_CLOEXEC
4621 int *atomic_flag_works = &sock_cloexec_works;
4622#else
4623 int *atomic_flag_works = NULL;
4624#endif
4625#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4628 "|iiiO:socket", keywords,
4629 &family, &type, &proto, &fdobj))
4630 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004633#ifdef MS_WINDOWS
4634 /* recreate a socket that was duplicated */
4635 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004636 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004637 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4638 PyErr_Format(PyExc_ValueError,
4639 "socket descriptor string has wrong size, "
4640 "should be %zu bytes.", sizeof(info));
4641 return -1;
4642 }
4643 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4644 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004645 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004646 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4647 Py_END_ALLOW_THREADS
4648 if (fd == INVALID_SOCKET) {
4649 set_error();
4650 return -1;
4651 }
4652 family = info.iAddressFamily;
4653 type = info.iSocketType;
4654 proto = info.iProtocol;
4655 }
4656 else
4657#endif
4658 {
4659 fd = PyLong_AsSocket_t(fdobj);
4660 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4661 return -1;
4662 if (fd == INVALID_SOCKET) {
4663 PyErr_SetString(PyExc_ValueError,
4664 "can't use invalid socket value");
4665 return -1;
4666 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 }
4668 }
4669 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004670#ifdef MS_WINDOWS
4671 /* Windows implementation */
4672#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4673#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4674#endif
4675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004677 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004678 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004679 NULL, 0,
4680 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4681 if (fd == INVALID_SOCKET) {
4682 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4683 support_wsa_no_inherit = 0;
4684 fd = socket(family, type, proto);
4685 }
4686 }
4687 else {
4688 fd = socket(family, type, proto);
4689 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 if (fd == INVALID_SOCKET) {
4693 set_error();
4694 return -1;
4695 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004696
4697 if (!support_wsa_no_inherit) {
4698 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4699 closesocket(fd);
4700 PyErr_SetFromWindowsErr(0);
4701 return -1;
4702 }
4703 }
4704#else
4705 /* UNIX */
4706 Py_BEGIN_ALLOW_THREADS
4707#ifdef SOCK_CLOEXEC
4708 if (sock_cloexec_works != 0) {
4709 fd = socket(family, type | SOCK_CLOEXEC, proto);
4710 if (sock_cloexec_works == -1) {
4711 if (fd >= 0) {
4712 sock_cloexec_works = 1;
4713 }
4714 else if (errno == EINVAL) {
4715 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4716 sock_cloexec_works = 0;
4717 fd = socket(family, type, proto);
4718 }
4719 }
4720 }
4721 else
4722#endif
4723 {
4724 fd = socket(family, type, proto);
4725 }
4726 Py_END_ALLOW_THREADS
4727
4728 if (fd == INVALID_SOCKET) {
4729 set_error();
4730 return -1;
4731 }
4732
4733 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4734 SOCKETCLOSE(fd);
4735 return -1;
4736 }
4737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004739 if (init_sockobject(s, fd, family, type, proto) == -1) {
4740 SOCKETCLOSE(fd);
4741 return -1;
4742 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004745
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004746}
4747
4748
Guido van Rossumb6775db1994-08-01 11:34:53 +00004749/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004750
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004751static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4753 "_socket.socket", /* tp_name */
4754 sizeof(PySocketSockObject), /* tp_basicsize */
4755 0, /* tp_itemsize */
4756 (destructor)sock_dealloc, /* tp_dealloc */
4757 0, /* tp_print */
4758 0, /* tp_getattr */
4759 0, /* tp_setattr */
4760 0, /* tp_reserved */
4761 (reprfunc)sock_repr, /* tp_repr */
4762 0, /* tp_as_number */
4763 0, /* tp_as_sequence */
4764 0, /* tp_as_mapping */
4765 0, /* tp_hash */
4766 0, /* tp_call */
4767 0, /* tp_str */
4768 PyObject_GenericGetAttr, /* tp_getattro */
4769 0, /* tp_setattro */
4770 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004771 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4772 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 sock_doc, /* tp_doc */
4774 0, /* tp_traverse */
4775 0, /* tp_clear */
4776 0, /* tp_richcompare */
4777 0, /* tp_weaklistoffset */
4778 0, /* tp_iter */
4779 0, /* tp_iternext */
4780 sock_methods, /* tp_methods */
4781 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004782 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 0, /* tp_base */
4784 0, /* tp_dict */
4785 0, /* tp_descr_get */
4786 0, /* tp_descr_set */
4787 0, /* tp_dictoffset */
4788 sock_initobj, /* tp_init */
4789 PyType_GenericAlloc, /* tp_alloc */
4790 sock_new, /* tp_new */
4791 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004792 0, /* tp_is_gc */
4793 0, /* tp_bases */
4794 0, /* tp_mro */
4795 0, /* tp_cache */
4796 0, /* tp_subclasses */
4797 0, /* tp_weaklist */
4798 0, /* tp_del */
4799 0, /* tp_version_tag */
4800 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004801};
4802
Guido van Rossum30a685f1991-06-27 15:51:29 +00004803
Guido van Rossum81194471991-07-27 21:42:02 +00004804/* Python interface to gethostname(). */
4805
4806/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004807static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004808socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004809{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004810#ifdef MS_WINDOWS
4811 /* Don't use winsock's gethostname, as this returns the ANSI
4812 version of the hostname, whereas we need a Unicode string.
4813 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004814 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004815 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004816 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004817 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004818
4819 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004820 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004821
4822 if (GetLastError() != ERROR_MORE_DATA)
4823 return PyErr_SetFromWindowsErr(0);
4824
4825 if (size == 0)
4826 return PyUnicode_New(0, 0);
4827
4828 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4829 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004830 name = PyMem_New(wchar_t, size);
4831 if (!name) {
4832 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004833 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004834 }
Victor Stinner74168972011-11-17 01:11:36 +01004835 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4836 name,
4837 &size))
4838 {
4839 PyMem_Free(name);
4840 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004841 }
Victor Stinner74168972011-11-17 01:11:36 +01004842
4843 result = PyUnicode_FromWideChar(name, size);
4844 PyMem_Free(name);
4845 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004846#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 char buf[1024];
4848 int res;
4849 Py_BEGIN_ALLOW_THREADS
4850 res = gethostname(buf, (int) sizeof buf - 1);
4851 Py_END_ALLOW_THREADS
4852 if (res < 0)
4853 return set_error();
4854 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004855 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004856#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004857}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004859PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004860"gethostname() -> string\n\
4861\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004862Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004863
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004864#ifdef HAVE_SETHOSTNAME
4865PyDoc_STRVAR(sethostname_doc,
4866"sethostname(name)\n\n\
4867Sets the hostname to name.");
4868
4869static PyObject *
4870socket_sethostname(PyObject *self, PyObject *args)
4871{
4872 PyObject *hnobj;
4873 Py_buffer buf;
4874 int res, flag = 0;
4875
Christian Heimesd2774c72013-06-19 02:06:29 +02004876#ifdef _AIX
4877/* issue #18259, not declared in any useful header file */
4878extern int sethostname(const char *, size_t);
4879#endif
4880
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004881 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4882 PyErr_Clear();
4883 if (!PyArg_ParseTuple(args, "O&:sethostname",
4884 PyUnicode_FSConverter, &hnobj))
4885 return NULL;
4886 flag = 1;
4887 }
4888 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4889 if (!res) {
4890 res = sethostname(buf.buf, buf.len);
4891 PyBuffer_Release(&buf);
4892 }
4893 if (flag)
4894 Py_DECREF(hnobj);
4895 if (res)
4896 return set_error();
4897 Py_RETURN_NONE;
4898}
4899#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004900
Guido van Rossum30a685f1991-06-27 15:51:29 +00004901/* Python interface to gethostbyname(name). */
4902
4903/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004905socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 char *name;
4908 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004909 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004910
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004911 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 return NULL;
4913 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004914 goto finally;
4915 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4916finally:
4917 PyMem_Free(name);
4918 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004919}
4920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004921PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004922"gethostbyname(host) -> address\n\
4923\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004924Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004925
4926
Victor Stinner72400302016-01-28 15:41:01 +01004927static PyObject*
4928sock_decode_hostname(const char *name)
4929{
4930#ifdef MS_WINDOWS
4931 /* Issue #26227: gethostbyaddr() returns a string encoded
4932 * to the ANSI code page */
4933 return PyUnicode_DecodeFSDefault(name);
4934#else
4935 /* Decode from UTF-8 */
4936 return PyUnicode_FromString(name);
4937#endif
4938}
4939
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004940/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4941
4942static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004943gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 char **pch;
4946 PyObject *rtn_tuple = (PyObject *)NULL;
4947 PyObject *name_list = (PyObject *)NULL;
4948 PyObject *addr_list = (PyObject *)NULL;
4949 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004950 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 if (h == NULL) {
4953 /* Let's get real error message to return */
4954 set_herror(h_errno);
4955 return NULL;
4956 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 if (h->h_addrtype != af) {
4959 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004960 errno = EAFNOSUPPORT;
4961 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 return NULL;
4963 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 case AF_INET:
4968 if (alen < sizeof(struct sockaddr_in))
4969 return NULL;
4970 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004971
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004972#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 case AF_INET6:
4974 if (alen < sizeof(struct sockaddr_in6))
4975 return NULL;
4976 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004977#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 if ((name_list = PyList_New(0)) == NULL)
4982 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 if ((addr_list = PyList_New(0)) == NULL)
4985 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 /* SF #1511317: h_aliases can be NULL */
4988 if (h->h_aliases) {
4989 for (pch = h->h_aliases; *pch != NULL; pch++) {
4990 int status;
4991 tmp = PyUnicode_FromString(*pch);
4992 if (tmp == NULL)
4993 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 status = PyList_Append(name_list, tmp);
4996 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 if (status)
4999 goto err;
5000 }
5001 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5004 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 case AF_INET:
5009 {
5010 struct sockaddr_in sin;
5011 memset(&sin, 0, sizeof(sin));
5012 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005013#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5017 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 if (pch == h->h_addr_list && alen >= sizeof(sin))
5020 memcpy((char *) addr, &sin, sizeof(sin));
5021 break;
5022 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005023
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005024#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 case AF_INET6:
5026 {
5027 struct sockaddr_in6 sin6;
5028 memset(&sin6, 0, sizeof(sin6));
5029 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005030#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5034 tmp = makeipaddr((struct sockaddr *)&sin6,
5035 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5038 memcpy((char *) addr, &sin6, sizeof(sin6));
5039 break;
5040 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005041#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005044 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 "unsupported address family");
5046 return NULL;
5047 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 if (tmp == NULL)
5050 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 status = PyList_Append(addr_list, tmp);
5053 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 if (status)
5056 goto err;
5057 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005058
Victor Stinner72400302016-01-28 15:41:01 +01005059 name = sock_decode_hostname(h->h_name);
5060 if (name == NULL)
5061 goto err;
5062 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005063
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005064 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 Py_XDECREF(name_list);
5066 Py_XDECREF(addr_list);
5067 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005068}
5069
5070
5071/* Python interface to gethostbyname_ex(name). */
5072
5073/*ARGSUSED*/
5074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005075socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 char *name;
5078 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005079 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005081 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005082#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005084#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 char buf[16384];
5088 int buf_len = (sizeof buf) - 1;
5089 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005090#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005091#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005093#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005094#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005095
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005096 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005098 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005099 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005101#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005102#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005103 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005105#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005107#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 memset((void *) &data, '\0', sizeof(data));
5109 result = gethostbyname_r(name, &hp_allocated, &data);
5110 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005111#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005112#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005113#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005115#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005116 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005118#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 Py_END_ALLOW_THREADS
5120 /* Some C libraries would require addr.__ss_family instead of
5121 addr.ss_family.
5122 Therefore, we cast the sockaddr_storage into sockaddr to
5123 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005124 sa = SAS2SA(&addr);
5125 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005127#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005129#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005130finally:
5131 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005133}
5134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005135PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005136"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5137\n\
5138Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005139for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005140
5141
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005142/* Python interface to gethostbyaddr(IP). */
5143
5144/*ARGSUSED*/
5145static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005146socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005147{
Charles-François Natali8b759652011-12-23 16:44:51 +01005148 sock_addr_t addr;
5149 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 char *ip_num;
5151 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005152 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005153#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005155#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005157#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 /* glibcs up to 2.10 assume that the buf argument to
5159 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5160 does not ensure. The attribute below instructs the compiler
5161 to maintain this alignment. */
5162 char buf[16384] Py_ALIGNED(8);
5163 int buf_len = (sizeof buf) - 1;
5164 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005165#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005166#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005168#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005169#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 char *ap;
5171 int al;
5172 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005173
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005174 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 return NULL;
5176 af = AF_UNSPEC;
5177 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005178 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 af = sa->sa_family;
5180 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005181 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 switch (af) {
5183 case AF_INET:
5184 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5185 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5186 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005187#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 case AF_INET6:
5189 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5190 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5191 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005194 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005195 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 }
5197 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005198#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005199#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005200 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 &hp_allocated, buf, buf_len,
5202 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005203#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 h = gethostbyaddr_r(ap, al, af,
5205 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005206#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 memset((void *) &data, '\0', sizeof(data));
5208 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5209 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005210#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005211#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005212#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005214#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005215 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005217#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005219 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005220#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005222#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005223finally:
5224 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005226}
5227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005228PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005229"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5230\n\
5231Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005232for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005233
Guido van Rossum30a685f1991-06-27 15:51:29 +00005234
5235/* Python interface to getservbyname(name).
5236 This only returns the port number, since the other info is already
5237 known or not useful (like the list of aliases). */
5238
5239/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005240static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005241socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 char *name, *proto=NULL;
5244 struct servent *sp;
5245 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5246 return NULL;
5247 Py_BEGIN_ALLOW_THREADS
5248 sp = getservbyname(name, proto);
5249 Py_END_ALLOW_THREADS
5250 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005251 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 return NULL;
5253 }
5254 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005255}
5256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005257PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005258"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005259\n\
5260Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005261The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5262otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005263
Guido van Rossum30a685f1991-06-27 15:51:29 +00005264
Barry Warsaw11b91a02004-06-28 00:50:43 +00005265/* Python interface to getservbyport(port).
5266 This only returns the service name, since the other info is already
5267 known or not useful (like the list of aliases). */
5268
5269/*ARGSUSED*/
5270static PyObject *
5271socket_getservbyport(PyObject *self, PyObject *args)
5272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 int port;
5274 char *proto=NULL;
5275 struct servent *sp;
5276 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5277 return NULL;
5278 if (port < 0 || port > 0xffff) {
5279 PyErr_SetString(
5280 PyExc_OverflowError,
5281 "getservbyport: port must be 0-65535.");
5282 return NULL;
5283 }
5284 Py_BEGIN_ALLOW_THREADS
5285 sp = getservbyport(htons((short)port), proto);
5286 Py_END_ALLOW_THREADS
5287 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005288 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 return NULL;
5290 }
5291 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005292}
5293
5294PyDoc_STRVAR(getservbyport_doc,
5295"getservbyport(port[, protocolname]) -> string\n\
5296\n\
5297Return the service name from a port number and protocol name.\n\
5298The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5299otherwise any protocol will match.");
5300
Guido van Rossum3901d851996-12-19 16:35:04 +00005301/* Python interface to getprotobyname(name).
5302 This only returns the protocol number, since the other info is
5303 already known or not useful (like the list of aliases). */
5304
5305/*ARGSUSED*/
5306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005307socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 char *name;
5310 struct protoent *sp;
5311 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5312 return NULL;
5313 Py_BEGIN_ALLOW_THREADS
5314 sp = getprotobyname(name);
5315 Py_END_ALLOW_THREADS
5316 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005317 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 return NULL;
5319 }
5320 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005321}
5322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005323PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005324"getprotobyname(name) -> integer\n\
5325\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005326Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005327
Guido van Rossum3901d851996-12-19 16:35:04 +00005328
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005329#ifndef NO_DUP
5330/* dup() function for socket fds */
5331
5332static PyObject *
5333socket_dup(PyObject *self, PyObject *fdobj)
5334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 SOCKET_T fd, newfd;
5336 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005337#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005338 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005339#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 fd = PyLong_AsSocket_t(fdobj);
5342 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5343 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005344
Victor Stinnerdaf45552013-08-28 00:53:59 +02005345#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005346 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005347 return set_error();
5348
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005349 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005350 FROM_PROTOCOL_INFO,
5351 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 if (newfd == INVALID_SOCKET)
5353 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005354
Victor Stinnerdaf45552013-08-28 00:53:59 +02005355 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5356 closesocket(newfd);
5357 PyErr_SetFromWindowsErr(0);
5358 return NULL;
5359 }
5360#else
5361 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5362 newfd = _Py_dup(fd);
5363 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005364 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005365#endif
5366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 newfdobj = PyLong_FromSocket_t(newfd);
5368 if (newfdobj == NULL)
5369 SOCKETCLOSE(newfd);
5370 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005371}
5372
5373PyDoc_STRVAR(dup_doc,
5374"dup(integer) -> integer\n\
5375\n\
5376Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5377sockets; on some platforms os.dup() won't work for socket file descriptors.");
5378#endif
5379
5380
Dave Cole331708b2004-08-09 04:51:41 +00005381#ifdef HAVE_SOCKETPAIR
5382/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005383 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005384 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005385
5386/*ARGSUSED*/
5387static PyObject *
5388socket_socketpair(PyObject *self, PyObject *args)
5389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 PySocketSockObject *s0 = NULL, *s1 = NULL;
5391 SOCKET_T sv[2];
5392 int family, type = SOCK_STREAM, proto = 0;
5393 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005394#ifdef SOCK_CLOEXEC
5395 int *atomic_flag_works = &sock_cloexec_works;
5396#else
5397 int *atomic_flag_works = NULL;
5398#endif
5399 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005400
5401#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005403#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5407 &family, &type, &proto))
5408 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005411 Py_BEGIN_ALLOW_THREADS
5412#ifdef SOCK_CLOEXEC
5413 if (sock_cloexec_works != 0) {
5414 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5415 if (sock_cloexec_works == -1) {
5416 if (ret >= 0) {
5417 sock_cloexec_works = 1;
5418 }
5419 else if (errno == EINVAL) {
5420 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5421 sock_cloexec_works = 0;
5422 ret = socketpair(family, type, proto, sv);
5423 }
5424 }
5425 }
5426 else
5427#endif
5428 {
5429 ret = socketpair(family, type, proto, sv);
5430 }
5431 Py_END_ALLOW_THREADS
5432
5433 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005435
5436 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5437 goto finally;
5438 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5439 goto finally;
5440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 s0 = new_sockobject(sv[0], family, type, proto);
5442 if (s0 == NULL)
5443 goto finally;
5444 s1 = new_sockobject(sv[1], family, type, proto);
5445 if (s1 == NULL)
5446 goto finally;
5447 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005448
5449finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 if (res == NULL) {
5451 if (s0 == NULL)
5452 SOCKETCLOSE(sv[0]);
5453 if (s1 == NULL)
5454 SOCKETCLOSE(sv[1]);
5455 }
5456 Py_XDECREF(s0);
5457 Py_XDECREF(s1);
5458 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005459}
5460
5461PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005462"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005463\n\
5464Create a pair of socket objects from the sockets returned by the platform\n\
5465socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005466The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005467AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005468
5469#endif /* HAVE_SOCKETPAIR */
5470
5471
Guido van Rossum006bf911996-06-12 04:04:55 +00005472static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005473socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005474{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005475 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005476
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005477 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 return NULL;
5479 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005480 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005482 "ntohs: can't convert negative Python int to C "
5483 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 return NULL;
5485 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005486 if (x > 0xffff) {
5487 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5488 "ntohs: Python int too large to convert to C "
5489 "16-bit unsigned integer (The silent truncation "
5490 "is deprecated)",
5491 1)) {
5492 return NULL;
5493 }
5494 }
5495 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005496}
5497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005498PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005499"ntohs(integer) -> integer\n\
5500\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005501Convert a 16-bit unsigned integer from network to host byte order.\n\
5502Note that in case the received integer does not fit in 16-bit unsigned\n\
5503integer, but does fit in a positive C int, it is silently truncated to\n\
550416-bit unsigned integer.\n\
5505However, this silent truncation feature is deprecated, and will raise an \n\
5506exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005507
5508
Guido van Rossum006bf911996-06-12 04:04:55 +00005509static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005510socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 if (PyLong_Check(arg)) {
5515 x = PyLong_AsUnsignedLong(arg);
5516 if (x == (unsigned long) -1 && PyErr_Occurred())
5517 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005518#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 {
5520 unsigned long y;
5521 /* only want the trailing 32 bits */
5522 y = x & 0xFFFFFFFFUL;
5523 if (y ^ x)
5524 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005525 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 x = y;
5527 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 }
5530 else
5531 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005532 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005535}
5536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005537PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005538"ntohl(integer) -> integer\n\
5539\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005540Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005541
5542
Guido van Rossum006bf911996-06-12 04:04:55 +00005543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005544socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005545{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005546 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005547
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005548 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 return NULL;
5550 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005551 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005553 "htons: can't convert negative Python int to C "
5554 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 return NULL;
5556 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005557 if (x > 0xffff) {
5558 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5559 "htons: Python int too large to convert to C "
5560 "16-bit unsigned integer (The silent truncation "
5561 "is deprecated)",
5562 1)) {
5563 return NULL;
5564 }
5565 }
5566 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005567}
5568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005569PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005570"htons(integer) -> integer\n\
5571\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005572Convert a 16-bit unsigned integer from host to network byte order.\n\
5573Note that in case the received integer does not fit in 16-bit unsigned\n\
5574integer, but does fit in a positive C int, it is silently truncated to\n\
557516-bit unsigned integer.\n\
5576However, this silent truncation feature is deprecated, and will raise an \n\
5577exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005578
5579
Guido van Rossum006bf911996-06-12 04:04:55 +00005580static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005581socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005582{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 if (PyLong_Check(arg)) {
5586 x = PyLong_AsUnsignedLong(arg);
5587 if (x == (unsigned long) -1 && PyErr_Occurred())
5588 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005589#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005590 {
5591 unsigned long y;
5592 /* only want the trailing 32 bits */
5593 y = x & 0xFFFFFFFFUL;
5594 if (y ^ x)
5595 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005596 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 x = y;
5598 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 }
5601 else
5602 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005603 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 Py_TYPE(arg)->tp_name);
5605 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005606}
5607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005608PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005609"htonl(integer) -> integer\n\
5610\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005611Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005612
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005613/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005615PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005616"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005617\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005618Convert 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 +00005619binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005620
5621static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005622socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005623{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005624#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005626#endif
5627
5628#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005629#if (SIZEOF_INT != 4)
5630#error "Not sure if in_addr_t exists and int is not 32-bits."
5631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 /* Have to use inet_addr() instead */
5633 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5638 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005639
Tim Peters1df9fdd2003-02-13 03:13:40 +00005640
5641#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005642
5643#ifdef USE_INET_ATON_WEAKLINK
5644 if (inet_aton != NULL) {
5645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 if (inet_aton(ip_addr, &buf))
5647 return PyBytes_FromStringAndSize((char *)(&buf),
5648 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005649
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005650 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 "illegal IP address string passed to inet_aton");
5652 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005653
Thomas Wouters477c8d52006-05-27 19:21:47 +00005654#ifdef USE_INET_ATON_WEAKLINK
5655 } else {
5656#endif
5657
5658#endif
5659
5660#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 /* special-case this address as inet_addr might return INADDR_NONE
5663 * for this */
5664 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005665 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005667
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005668 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005672 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 "illegal IP address string passed to inet_aton");
5674 return NULL;
5675 }
5676 }
5677 return PyBytes_FromStringAndSize((char *) &packed_addr,
5678 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005679
5680#ifdef USE_INET_ATON_WEAKLINK
5681 }
5682#endif
5683
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005684#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005685}
5686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005687PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005688"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005689\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005690Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005691
5692static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005693socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005694{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005695 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005697
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005698 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 return NULL;
5700 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005701
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005702 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005703 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005705 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 return NULL;
5707 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005708
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005709 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5710 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005711
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005712 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005714}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005715
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005716#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005717
5718PyDoc_STRVAR(inet_pton_doc,
5719"inet_pton(af, ip) -> packed IP address string\n\
5720\n\
5721Convert an IP address from string format to a packed string suitable\n\
5722for use with low-level network functions.");
5723
5724static PyObject *
5725socket_inet_pton(PyObject *self, PyObject *args)
5726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 int af;
5728 char* ip;
5729 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005730#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005731 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005732#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5736 return NULL;
5737 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005738
Martin v. Löwis04697e82004-06-02 12:35:29 +00005739#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005741 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 "can't use AF_INET6, IPv6 is disabled");
5743 return NULL;
5744 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005745#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 retval = inet_pton(af, ip, packed);
5748 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005749 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 return NULL;
5751 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005752 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 "illegal IP address string passed to inet_pton");
5754 return NULL;
5755 } else if (af == AF_INET) {
5756 return PyBytes_FromStringAndSize(packed,
5757 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005758#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 } else if (af == AF_INET6) {
5760 return PyBytes_FromStringAndSize(packed,
5761 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005764 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 return NULL;
5766 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005767}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005768
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005769PyDoc_STRVAR(inet_ntop_doc,
5770"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5771\n\
5772Convert a packed IP address of the given family to string format.");
5773
5774static PyObject *
5775socket_inet_ntop(PyObject *self, PyObject *args)
5776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005778 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005780#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005781 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005782#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005784#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5787 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005788
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005789 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 return NULL;
5791 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005794 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 PyErr_SetString(PyExc_ValueError,
5796 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005797 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 return NULL;
5799 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005800#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005802 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 PyErr_SetString(PyExc_ValueError,
5804 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005805 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 return NULL;
5807 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 } else {
5810 PyErr_Format(PyExc_ValueError,
5811 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005812 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 return NULL;
5814 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005815
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005816 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5817 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005819 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 return NULL;
5821 } else {
5822 return PyUnicode_FromString(retval);
5823 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005824}
5825
5826#endif /* HAVE_INET_PTON */
5827
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005828/* Python interface to getaddrinfo(host, port). */
5829
5830/*ARGSUSED*/
5831static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005832socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005833{
Victor Stinner77af1722011-05-26 14:05:59 +02005834 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005835 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 struct addrinfo hints, *res;
5837 struct addrinfo *res0 = NULL;
5838 PyObject *hobj = NULL;
5839 PyObject *pobj = (PyObject *)NULL;
5840 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005841 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 int family, socktype, protocol, flags;
5843 int error;
5844 PyObject *all = (PyObject *)NULL;
5845 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005846
Georg Brandl6083a4b2013-10-14 06:51:46 +02005847 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005849 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005850 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 &protocol, &flags)) {
5852 return NULL;
5853 }
5854 if (hobj == Py_None) {
5855 hptr = NULL;
5856 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005857 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 if (!idna)
5859 return NULL;
5860 assert(PyBytes_Check(idna));
5861 hptr = PyBytes_AS_STRING(idna);
5862 } else if (PyBytes_Check(hobj)) {
5863 hptr = PyBytes_AsString(hobj);
5864 } else {
5865 PyErr_SetString(PyExc_TypeError,
5866 "getaddrinfo() argument 1 must be string or None");
5867 return NULL;
5868 }
5869 if (PyLong_CheckExact(pobj)) {
5870 long value = PyLong_AsLong(pobj);
5871 if (value == -1 && PyErr_Occurred())
5872 goto err;
5873 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5874 pptr = pbuf;
5875 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005876 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005877 if (pptr == NULL)
5878 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005880 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 } else if (pobj == Py_None) {
5882 pptr = (char *)NULL;
5883 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005884 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 goto err;
5886 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005887#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005888 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5889 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005890 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5891 * This workaround avoids a segfault in libsystem.
5892 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005893 pptr = "00";
5894 }
5895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 memset(&hints, 0, sizeof(hints));
5897 hints.ai_family = family;
5898 hints.ai_socktype = socktype;
5899 hints.ai_protocol = protocol;
5900 hints.ai_flags = flags;
5901 Py_BEGIN_ALLOW_THREADS
5902 ACQUIRE_GETADDRINFO_LOCK
5903 error = getaddrinfo(hptr, pptr, &hints, &res0);
5904 Py_END_ALLOW_THREADS
5905 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5906 if (error) {
5907 set_gaierror(error);
5908 goto err;
5909 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005910
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005911 all = PyList_New(0);
5912 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 goto err;
5914 for (res = res0; res; res = res->ai_next) {
5915 PyObject *single;
5916 PyObject *addr =
5917 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5918 if (addr == NULL)
5919 goto err;
5920 single = Py_BuildValue("iiisO", res->ai_family,
5921 res->ai_socktype, res->ai_protocol,
5922 res->ai_canonname ? res->ai_canonname : "",
5923 addr);
5924 Py_DECREF(addr);
5925 if (single == NULL)
5926 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 if (PyList_Append(all, single))
5929 goto err;
5930 Py_XDECREF(single);
5931 }
5932 Py_XDECREF(idna);
5933 if (res0)
5934 freeaddrinfo(res0);
5935 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005936 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 Py_XDECREF(all);
5938 Py_XDECREF(idna);
5939 if (res0)
5940 freeaddrinfo(res0);
5941 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005942}
5943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005944PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005945"getaddrinfo(host, port [, family, type, proto, flags])\n\
5946 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005947\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005948Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005949
5950/* Python interface to getnameinfo(sa, flags). */
5951
5952/*ARGSUSED*/
5953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005954socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 PyObject *sa = (PyObject *)NULL;
5957 int flags;
5958 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005959 int port;
5960 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5962 struct addrinfo hints, *res = NULL;
5963 int error;
5964 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005965 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 flags = flowinfo = scope_id = 0;
5968 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5969 return NULL;
5970 if (!PyTuple_Check(sa)) {
5971 PyErr_SetString(PyExc_TypeError,
5972 "getnameinfo() argument 1 must be a tuple");
5973 return NULL;
5974 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03005975 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03005977 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03005979 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005980 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005981 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03005982 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01005983 return NULL;
5984 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5986 memset(&hints, 0, sizeof(hints));
5987 hints.ai_family = AF_UNSPEC;
5988 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005989 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 Py_BEGIN_ALLOW_THREADS
5991 ACQUIRE_GETADDRINFO_LOCK
5992 error = getaddrinfo(hostp, pbuf, &hints, &res);
5993 Py_END_ALLOW_THREADS
5994 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5995 if (error) {
5996 set_gaierror(error);
5997 goto fail;
5998 }
5999 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006000 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 "sockaddr resolved to multiple addresses");
6002 goto fail;
6003 }
6004 switch (res->ai_family) {
6005 case AF_INET:
6006 {
6007 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006008 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 "IPv4 sockaddr must be 2 tuple");
6010 goto fail;
6011 }
6012 break;
6013 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006014#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 case AF_INET6:
6016 {
6017 struct sockaddr_in6 *sin6;
6018 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006019 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 sin6->sin6_scope_id = scope_id;
6021 break;
6022 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006025 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6027 if (error) {
6028 set_gaierror(error);
6029 goto fail;
6030 }
Victor Stinner72400302016-01-28 15:41:01 +01006031
6032 name = sock_decode_hostname(hbuf);
6033 if (name == NULL)
6034 goto fail;
6035 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006036
6037fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 if (res)
6039 freeaddrinfo(res);
6040 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006041}
6042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006043PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006044"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006045\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006046Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006047
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006048
6049/* Python API to getting and setting the default timeout value. */
6050
6051static PyObject *
6052socket_getdefaulttimeout(PyObject *self)
6053{
Victor Stinner71694d52015-03-28 01:18:54 +01006054 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006055 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 }
Victor Stinner71694d52015-03-28 01:18:54 +01006057 else {
6058 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6059 return PyFloat_FromDouble(seconds);
6060 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006061}
6062
6063PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006064"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006065\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006066Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006067A value of None indicates that new socket objects have no timeout.\n\
6068When the socket module is first imported, the default is None.");
6069
6070static PyObject *
6071socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6072{
Victor Stinner71694d52015-03-28 01:18:54 +01006073 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006074
Victor Stinner71694d52015-03-28 01:18:54 +01006075 if (socket_parse_timeout(&timeout, arg) < 0)
6076 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006079
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006080 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006081}
6082
6083PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006084"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006085\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006086Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006087A value of None indicates that new socket objects have no timeout.\n\
6088When the socket module is first imported, the default is None.");
6089
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006090#ifdef HAVE_IF_NAMEINDEX
6091/* Python API for getting interface indices and names */
6092
6093static PyObject *
6094socket_if_nameindex(PyObject *self, PyObject *arg)
6095{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006096 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006097 int i;
6098 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006099
Charles-François Natali60713592011-05-20 16:55:06 +02006100 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006101 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006102 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006103 return NULL;
6104 }
6105
6106 list = PyList_New(0);
6107 if (list == NULL) {
6108 if_freenameindex(ni);
6109 return NULL;
6110 }
6111
Charles-François Natali60713592011-05-20 16:55:06 +02006112 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6113 PyObject *ni_tuple = Py_BuildValue("IO&",
6114 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006115
6116 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6117 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006118 Py_DECREF(list);
6119 if_freenameindex(ni);
6120 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006121 }
6122 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006123 }
6124
6125 if_freenameindex(ni);
6126 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006127}
6128
6129PyDoc_STRVAR(if_nameindex_doc,
6130"if_nameindex()\n\
6131\n\
6132Returns a list of network interface information (index, name) tuples.");
6133
Charles-François Natali60713592011-05-20 16:55:06 +02006134static PyObject *
6135socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006136{
Charles-François Natali60713592011-05-20 16:55:06 +02006137 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006138 unsigned long index;
6139
Charles-François Natali60713592011-05-20 16:55:06 +02006140 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6141 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006142 return NULL;
6143
Charles-François Natali60713592011-05-20 16:55:06 +02006144 index = if_nametoindex(PyBytes_AS_STRING(oname));
6145 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006146 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006147 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006148 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006149 return NULL;
6150 }
6151
6152 return PyLong_FromUnsignedLong(index);
6153}
6154
6155PyDoc_STRVAR(if_nametoindex_doc,
6156"if_nametoindex(if_name)\n\
6157\n\
6158Returns the interface index corresponding to the interface name if_name.");
6159
Charles-François Natali60713592011-05-20 16:55:06 +02006160static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006161socket_if_indextoname(PyObject *self, PyObject *arg)
6162{
Charles-François Natali60713592011-05-20 16:55:06 +02006163 unsigned long index;
6164 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006165
Charles-François Natali60713592011-05-20 16:55:06 +02006166 index = PyLong_AsUnsignedLong(arg);
6167 if (index == (unsigned long) -1)
6168 return NULL;
6169
6170 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006171 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006172 return NULL;
6173 }
6174
Charles-François Natali60713592011-05-20 16:55:06 +02006175 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006176}
6177
6178PyDoc_STRVAR(if_indextoname_doc,
6179"if_indextoname(if_index)\n\
6180\n\
6181Returns the interface name corresponding to the interface index if_index.");
6182
6183#endif /* HAVE_IF_NAMEINDEX */
6184
6185
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006186#ifdef CMSG_LEN
6187/* Python interface to CMSG_LEN(length). */
6188
6189static PyObject *
6190socket_CMSG_LEN(PyObject *self, PyObject *args)
6191{
6192 Py_ssize_t length;
6193 size_t result;
6194
6195 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6196 return NULL;
6197 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6198 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6199 return NULL;
6200 }
6201 return PyLong_FromSize_t(result);
6202}
6203
6204PyDoc_STRVAR(CMSG_LEN_doc,
6205"CMSG_LEN(length) -> control message length\n\
6206\n\
6207Return the total length, without trailing padding, of an ancillary\n\
6208data item with associated data of the given length. This value can\n\
6209often be used as the buffer size for recvmsg() to receive a single\n\
6210item of ancillary data, but RFC 3542 requires portable applications to\n\
6211use CMSG_SPACE() and thus include space for padding, even when the\n\
6212item will be the last in the buffer. Raises OverflowError if length\n\
6213is outside the permissible range of values.");
6214
6215
6216#ifdef CMSG_SPACE
6217/* Python interface to CMSG_SPACE(length). */
6218
6219static PyObject *
6220socket_CMSG_SPACE(PyObject *self, PyObject *args)
6221{
6222 Py_ssize_t length;
6223 size_t result;
6224
6225 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6226 return NULL;
6227 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6228 PyErr_SetString(PyExc_OverflowError,
6229 "CMSG_SPACE() argument out of range");
6230 return NULL;
6231 }
6232 return PyLong_FromSize_t(result);
6233}
6234
6235PyDoc_STRVAR(CMSG_SPACE_doc,
6236"CMSG_SPACE(length) -> buffer size\n\
6237\n\
6238Return the buffer size needed for recvmsg() to receive an ancillary\n\
6239data item with associated data of the given length, along with any\n\
6240trailing padding. The buffer space needed to receive multiple items\n\
6241is the sum of the CMSG_SPACE() values for their associated data\n\
6242lengths. Raises OverflowError if length is outside the permissible\n\
6243range of values.");
6244#endif /* CMSG_SPACE */
6245#endif /* CMSG_LEN */
6246
6247
Guido van Rossum30a685f1991-06-27 15:51:29 +00006248/* List of functions exported by this module. */
6249
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006250static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 {"gethostbyname", socket_gethostbyname,
6252 METH_VARARGS, gethostbyname_doc},
6253 {"gethostbyname_ex", socket_gethostbyname_ex,
6254 METH_VARARGS, ghbn_ex_doc},
6255 {"gethostbyaddr", socket_gethostbyaddr,
6256 METH_VARARGS, gethostbyaddr_doc},
6257 {"gethostname", socket_gethostname,
6258 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006259#ifdef HAVE_SETHOSTNAME
6260 {"sethostname", socket_sethostname,
6261 METH_VARARGS, sethostname_doc},
6262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 {"getservbyname", socket_getservbyname,
6264 METH_VARARGS, getservbyname_doc},
6265 {"getservbyport", socket_getservbyport,
6266 METH_VARARGS, getservbyport_doc},
6267 {"getprotobyname", socket_getprotobyname,
6268 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006269#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 {"dup", socket_dup,
6271 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006272#endif
Dave Cole331708b2004-08-09 04:51:41 +00006273#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 {"socketpair", socket_socketpair,
6275 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 {"ntohs", socket_ntohs,
6278 METH_VARARGS, ntohs_doc},
6279 {"ntohl", socket_ntohl,
6280 METH_O, ntohl_doc},
6281 {"htons", socket_htons,
6282 METH_VARARGS, htons_doc},
6283 {"htonl", socket_htonl,
6284 METH_O, htonl_doc},
6285 {"inet_aton", socket_inet_aton,
6286 METH_VARARGS, inet_aton_doc},
6287 {"inet_ntoa", socket_inet_ntoa,
6288 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006289#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 {"inet_pton", socket_inet_pton,
6291 METH_VARARGS, inet_pton_doc},
6292 {"inet_ntop", socket_inet_ntop,
6293 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006294#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006295 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6296 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 {"getnameinfo", socket_getnameinfo,
6298 METH_VARARGS, getnameinfo_doc},
6299 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6300 METH_NOARGS, getdefaulttimeout_doc},
6301 {"setdefaulttimeout", socket_setdefaulttimeout,
6302 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006303#ifdef HAVE_IF_NAMEINDEX
6304 {"if_nameindex", socket_if_nameindex,
6305 METH_NOARGS, if_nameindex_doc},
6306 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006307 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006308 {"if_indextoname", socket_if_indextoname,
6309 METH_O, if_indextoname_doc},
6310#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006311#ifdef CMSG_LEN
6312 {"CMSG_LEN", socket_CMSG_LEN,
6313 METH_VARARGS, CMSG_LEN_doc},
6314#ifdef CMSG_SPACE
6315 {"CMSG_SPACE", socket_CMSG_SPACE,
6316 METH_VARARGS, CMSG_SPACE_doc},
6317#endif
6318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006320};
6321
Guido van Rossum30a685f1991-06-27 15:51:29 +00006322
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006323#ifdef MS_WINDOWS
6324#define OS_INIT_DEFINED
6325
6326/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006327
6328static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006329os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006332}
6333
6334static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006335os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 WSADATA WSAData;
6338 int ret;
6339 ret = WSAStartup(0x0101, &WSAData);
6340 switch (ret) {
6341 case 0: /* No error */
6342 Py_AtExit(os_cleanup);
6343 return 1; /* Success */
6344 case WSASYSNOTREADY:
6345 PyErr_SetString(PyExc_ImportError,
6346 "WSAStartup failed: network not ready");
6347 break;
6348 case WSAVERNOTSUPPORTED:
6349 case WSAEINVAL:
6350 PyErr_SetString(
6351 PyExc_ImportError,
6352 "WSAStartup failed: requested version not supported");
6353 break;
6354 default:
6355 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6356 break;
6357 }
6358 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006359}
6360
Guido van Rossum8d665e61996-06-26 18:22:49 +00006361#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006362
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006363
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006364
6365#ifndef OS_INIT_DEFINED
6366static int
6367os_init(void)
6368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006370}
6371#endif
6372
6373
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006374/* C API table - always add new things to the end for binary
6375 compatibility. */
6376static
6377PySocketModule_APIObject PySocketModuleAPI =
6378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006380 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006382};
6383
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006384
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006385/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006386
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006387 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006388 "socket.py" which implements some additional functionality.
6389 The import of "_socket" may fail with an ImportError exception if
6390 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006391 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006392 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006393*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006395PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006396"Implementation module for socket operations.\n\
6397\n\
6398See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006399
Martin v. Löwis1a214512008-06-11 05:26:20 +00006400static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModuleDef_HEAD_INIT,
6402 PySocket_MODULE_NAME,
6403 socket_doc,
6404 -1,
6405 socket_methods,
6406 NULL,
6407 NULL,
6408 NULL,
6409 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006410};
6411
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006412PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006413PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 if (!os_init())
6418 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006419
Victor Stinnerdaf45552013-08-28 00:53:59 +02006420#ifdef MS_WINDOWS
6421 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006422#if defined(_MSC_VER) && _MSC_VER >= 1800
6423 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6424#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006425 DWORD version = GetVersion();
6426 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6427 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6428 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006429 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6430#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006431 }
6432#endif
6433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 Py_TYPE(&sock_type) = &PyType_Type;
6435 m = PyModule_Create(&socketmodule);
6436 if (m == NULL)
6437 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006438
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006439 Py_INCREF(PyExc_OSError);
6440 PySocketModuleAPI.error = PyExc_OSError;
6441 Py_INCREF(PyExc_OSError);
6442 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006444 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 if (socket_herror == NULL)
6446 return NULL;
6447 Py_INCREF(socket_herror);
6448 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006449 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450 NULL);
6451 if (socket_gaierror == NULL)
6452 return NULL;
6453 Py_INCREF(socket_gaierror);
6454 PyModule_AddObject(m, "gaierror", socket_gaierror);
6455 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006456 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 if (socket_timeout == NULL)
6458 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006459 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 Py_INCREF(socket_timeout);
6461 PyModule_AddObject(m, "timeout", socket_timeout);
6462 Py_INCREF((PyObject *)&sock_type);
6463 if (PyModule_AddObject(m, "SocketType",
6464 (PyObject *)&sock_type) != 0)
6465 return NULL;
6466 Py_INCREF((PyObject *)&sock_type);
6467 if (PyModule_AddObject(m, "socket",
6468 (PyObject *)&sock_type) != 0)
6469 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006470
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006471#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006473#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 Py_INCREF(has_ipv6);
6477 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 /* Export C API */
6480 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6481 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6482 ) != 0)
6483 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006486#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006488#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006490#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006492#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006493#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006496#endif
6497#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006499#endif
6500#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006503#endif
6504#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006507#endif
6508#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006511#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006512#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006515#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006516#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006519#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006520#ifdef HAVE_SOCKADDR_ALG
6521 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6522#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006523#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006526#endif
6527#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006529#endif
6530#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006533#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006534#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006535 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006537#endif
6538#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006541#endif
6542#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006545#endif
6546#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006549#endif
6550#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, AF_NETLINK);
6553 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006554#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006556#endif
6557#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006559#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6561 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006562#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006564#endif
6565#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006567#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006568#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006570#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006571#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006573#endif
6574#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006576#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006578#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006580#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006581#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006582 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006583#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006584#ifdef NETLINK_CRYPTO
6585 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6586#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006587#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006588#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006591#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006592#ifdef AF_LINK
6593 PyModule_AddIntMacro(m, AF_LINK);
6594#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006595#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006598#endif
6599#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006602#endif
6603#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006606#endif
6607#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006610#endif
6611#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006614#endif
6615#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006618#endif
6619#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006622#endif
6623#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006626#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006627
Hye-Shik Chang81268602004-02-02 06:05:24 +00006628#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6630 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6631 PyModule_AddIntMacro(m, BTPROTO_HCI);
6632 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006633#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006635#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006636#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006637#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006639#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6641 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006642#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6645 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006646#endif
6647
Charles-François Natali47413c12011-10-06 19:47:44 +02006648#ifdef AF_CAN
6649 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006651#endif
6652#ifdef PF_CAN
6653 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006655#endif
6656
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006657/* Reliable Datagram Sockets */
6658#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006660#endif
6661#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006663#endif
6664
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006665/* Kernel event messages */
6666#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006668#endif
6669#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006671#endif
6672
Antoine Pitroub156a462010-10-27 20:13:57 +00006673#ifdef AF_PACKET
6674 PyModule_AddIntMacro(m, AF_PACKET);
6675#endif
6676#ifdef PF_PACKET
6677 PyModule_AddIntMacro(m, PF_PACKET);
6678#endif
6679#ifdef PACKET_HOST
6680 PyModule_AddIntMacro(m, PACKET_HOST);
6681#endif
6682#ifdef PACKET_BROADCAST
6683 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6684#endif
6685#ifdef PACKET_MULTICAST
6686 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6687#endif
6688#ifdef PACKET_OTHERHOST
6689 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6690#endif
6691#ifdef PACKET_OUTGOING
6692 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6693#endif
6694#ifdef PACKET_LOOPBACK
6695 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6696#endif
6697#ifdef PACKET_FASTROUTE
6698 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006699#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006700
Christian Heimes043d6f62008-01-07 17:19:16 +00006701#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6706 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6707 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006708
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6710 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6711 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006713 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, SOL_TIPC);
6715 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6716 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6717 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6718 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006719
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6721 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6722 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6723 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6727 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006728#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006729 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006731#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6733 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6734 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6735 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6736 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6737 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006738#endif
6739
Christian Heimesdffa3942016-09-05 23:54:41 +02006740#ifdef HAVE_SOCKADDR_ALG
6741 /* Socket options */
6742 PyModule_AddIntMacro(m, ALG_SET_KEY);
6743 PyModule_AddIntMacro(m, ALG_SET_IV);
6744 PyModule_AddIntMacro(m, ALG_SET_OP);
6745 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6746 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6747 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6748
6749 /* Operations */
6750 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6751 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6752 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6753 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6754#endif
6755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, SOCK_STREAM);
6758 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006759/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006760#ifdef SOCK_RAW
6761 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006763#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006765#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006767#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006768#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006770#endif
6771#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006773#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006783#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006784#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006786#endif
6787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006794#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006800#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006805#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006806#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006809#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006829#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006837#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006838#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006840#endif
6841#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006843#endif
6844#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006846#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006847#ifdef SO_PASSSEC
6848 PyModule_AddIntMacro(m, SO_PASSSEC);
6849#endif
6850#ifdef SO_PEERSEC
6851 PyModule_AddIntMacro(m, SO_PEERSEC);
6852#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006853#ifdef SO_BINDTODEVICE
6854 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6855#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006856#ifdef SO_PRIORITY
6857 PyModule_AddIntMacro(m, SO_PRIORITY);
6858#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006859#ifdef SO_MARK
6860 PyModule_AddIntMacro(m, SO_MARK);
6861#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006862#ifdef SO_DOMAIN
6863 PyModule_AddIntMacro(m, SO_DOMAIN);
6864#endif
6865#ifdef SO_PROTOCOL
6866 PyModule_AddIntMacro(m, SO_PROTOCOL);
6867#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 /* Maximum number of connections for "listen" */
6870#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006872#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006874#endif
6875
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006876 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006877#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006879#endif
6880#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006882#endif
6883#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006885#endif
6886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887 /* Flags for send, recv */
6888#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006917#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006918#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006920#endif
6921#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006923#endif
6924#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006926#endif
6927#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006929#endif
6930#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006932#endif
6933#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006935#endif
6936#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006938#endif
6939#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006941#endif
6942#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006944#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006945#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006947#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949 /* Protocol level and numbers, usable for [gs]etsockopt */
6950#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006955#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006976 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006980#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006982#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006983#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006985#endif
6986#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6988 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006989#endif
6990#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6992 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6993 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006994
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6996 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6997 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006998#endif
6999#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7001 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7002 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7003 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007004#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007005#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7006 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7007#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007008#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007010 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7011 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7012 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7013 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7014 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7015 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7016 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7017 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7018 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7019 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7020 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7021 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7022#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007023#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007025#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007026#ifdef HAVE_SOCKADDR_ALG
7027 PyModule_AddIntMacro(m, SOL_ALG);
7028#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007029#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007031#endif
7032#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007034#endif
7035#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007037#endif
7038#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007040#endif
7041#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007043#endif
7044#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007057#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007060#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007066#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007077#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007088#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007089 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007096#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007103#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007109#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007121#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007124#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007129#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007147#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007148#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
7154/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007157#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007162#endif
7163
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007164#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007166#endif
7167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 /* Some port configuration */
7169#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007171#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007176#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007178#endif
7179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* Some reserved IP v.4 addresses */
7181#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007183#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007188#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007193#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007194 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007198#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef INADDR_ALLHOSTS_GROUP
7202 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7203 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007204#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007209#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007214#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007216#endif
7217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 /* IPv4 [gs]etsockopt options */
7219#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007266#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007267#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007269#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7272#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007284#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007291#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007295#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007297#endif
7298#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007300#endif
7301#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007303#endif
7304#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007306#endif
7307#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007309#endif
7310#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007312#endif
7313#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007315#endif
7316#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007318#endif
7319#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007321#endif
7322#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007324#endif
7325#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007327#endif
7328#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007330#endif
7331#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007333#endif
7334#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007336#endif
7337#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007339#endif
7340#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007342#endif
7343#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007345#endif
7346#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007348#endif
7349#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007351#endif
7352#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007354#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356 /* TCP options */
7357#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007369#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007372#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007392#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007393#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007395#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007396#ifdef TCP_CONGESTION
7397 PyModule_AddIntMacro(m, TCP_CONGESTION);
7398#endif
7399#ifdef TCP_USER_TIMEOUT
7400 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7401#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007402#ifdef TCP_NOTSENT_LOWAT
7403 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7404#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406 /* IPX options */
7407#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007409#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007410
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007411/* Reliable Datagram Sockets */
7412#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007414#endif
7415#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007417#endif
7418#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007420#endif
7421#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007423#endif
7424#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007426#endif
7427#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007429#endif
7430#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007432#endif
7433#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007435#endif
7436#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007438#endif
7439#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007441#endif
7442#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007444#endif
7445#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007447#endif
7448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007450#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007452#endif
7453#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007455#endif
7456#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007458#endif
7459#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007461#endif
7462#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007464#endif
7465#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007467#endif
7468#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007470#endif
7471#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007473#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007474#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007477#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007479#endif
7480#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007482#endif
7483#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007485#endif
7486#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007488#endif
7489#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007491#endif
7492#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007494#endif
7495#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007497#endif
7498#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007500#endif
7501#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007503#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007504#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007506#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007507#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007509#endif
7510#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007512#endif
7513#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007515#endif
7516#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007518#endif
7519#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007521#endif
7522#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007524#endif
7525#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007527#endif
7528#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007530#endif
7531#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007533#endif
7534#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007536#endif
7537#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007539#endif
7540#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007542#endif
7543#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007545#endif
7546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007548#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007550#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007552#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007553 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007554#endif
7555#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007557#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007560 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007561#endif
7562#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007564#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007568#endif
7569
Christian Heimesfaf2f632008-01-06 16:59:19 +00007570#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007572 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7573#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007574 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007575#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007576 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007577 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7578#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007579 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007580#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007581 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007583 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007584 PyObject *tmp;
7585 tmp = PyLong_FromUnsignedLong(codes[i]);
7586 if (tmp == NULL)
7587 return NULL;
7588 PyModule_AddObject(m, names[i], tmp);
7589 }
7590 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, RCVALL_OFF);
7592 PyModule_AddIntMacro(m, RCVALL_ON);
7593 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007594#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007596#endif
7597#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007599#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007600#endif /* _MSTCPIP_ */
7601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007603#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007607}