blob: a1d829f9cb09a7117a27e794786e5260d8bf5abd [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
Martin Panter50ab1a32016-04-11 00:38:12 +00002699 if (res < 0) {
2700 return s->errorhandler();
2701 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002703 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002704}
2705
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002706PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002707"close()\n\
2708\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002709Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002710
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002711static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002712sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002713{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002714 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002715 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002716 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002717}
2718
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002719PyDoc_STRVAR(detach_doc,
2720"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002721\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002722Close the socket object without closing the underlying file descriptor.\n\
2723The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002724can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002725
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002726static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002727sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002728{
Victor Stinner81c41db2015-04-02 11:50:57 +02002729 int err;
2730 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002731
Victor Stinner81c41db2015-04-02 11:50:57 +02002732 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2733 /* getsockopt() failed */
2734 return 0;
2735 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002736
Victor Stinner81c41db2015-04-02 11:50:57 +02002737 if (err == EISCONN)
2738 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002739 if (err != 0) {
2740 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2741 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002742 return 0;
2743 }
2744 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002745}
2746
2747static int
2748internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2749 int raise)
2750{
2751 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002752
2753 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002755 Py_END_ALLOW_THREADS
2756
Victor Stinner70a46f62015-03-31 22:03:59 +02002757 if (!res) {
2758 /* connect() succeeded, the socket is connected */
2759 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002761
Victor Stinner81c41db2015-04-02 11:50:57 +02002762 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002763
Victor Stinner81c41db2015-04-02 11:50:57 +02002764 /* save error, PyErr_CheckSignals() can replace it */
2765 err = GET_SOCK_ERROR;
2766 if (CHECK_ERRNO(EINTR)) {
2767 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002768 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002769
2770 /* Issue #23618: when connect() fails with EINTR, the connection is
2771 running asynchronously.
2772
2773 If the socket is blocking or has a timeout, wait until the
2774 connection completes, fails or timed out using select(), and then
2775 get the connection status using getsockopt(SO_ERROR).
2776
2777 If the socket is non-blocking, raise InterruptedError. The caller is
2778 responsible to wait until the connection completes, fails or timed
2779 out (it's the case in asyncio for example). */
2780 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2781 }
2782 else {
2783 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2784 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002785 }
2786
Victor Stinner81c41db2015-04-02 11:50:57 +02002787 if (!wait_connect) {
2788 if (raise) {
2789 /* restore error, maybe replaced by PyErr_CheckSignals() */
2790 SET_SOCK_ERROR(err);
2791 s->errorhandler();
2792 return -1;
2793 }
2794 else
2795 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002796 }
2797
Victor Stinner81c41db2015-04-02 11:50:57 +02002798 if (raise) {
2799 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002800 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2801 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002802 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002803 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002804 else {
2805 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002806 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2807 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002808 return err;
2809 }
2810 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002811}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002812
Fred Drake728819a2000-07-01 03:40:12 +00002813/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002814
Guido van Rossum73624e91994-10-10 17:59:00 +00002815static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002816sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 sock_addr_t addrbuf;
2819 int addrlen;
2820 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2823 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002824
Victor Stinner81c41db2015-04-02 11:50:57 +02002825 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002826 if (res < 0)
2827 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002828
Victor Stinneree699e92015-03-31 21:28:42 +02002829 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002830}
2831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002832PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002833"connect(address)\n\
2834\n\
2835Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002836is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002837
Guido van Rossum30a685f1991-06-27 15:51:29 +00002838
Fred Drake728819a2000-07-01 03:40:12 +00002839/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002840
2841static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002842sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 sock_addr_t addrbuf;
2845 int addrlen;
2846 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2849 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002850
Victor Stinner81c41db2015-04-02 11:50:57 +02002851 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002852 if (res < 0)
2853 return NULL;
2854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002856}
2857
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002859"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002860\n\
2861This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002862instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002863
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002864
Guido van Rossumed233a51992-06-23 09:07:03 +00002865/* s.fileno() method */
2866
Guido van Rossum73624e91994-10-10 17:59:00 +00002867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002871}
2872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002873PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002874"fileno() -> integer\n\
2875\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002876Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002877
Guido van Rossumed233a51992-06-23 09:07:03 +00002878
Guido van Rossumc89705d1992-11-26 08:54:07 +00002879/* s.getsockname() method */
2880
Guido van Rossum73624e91994-10-10 17:59:00 +00002881static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002882sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 sock_addr_t addrbuf;
2885 int res;
2886 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 if (!getsockaddrlen(s, &addrlen))
2889 return NULL;
2890 memset(&addrbuf, 0, addrlen);
2891 Py_BEGIN_ALLOW_THREADS
2892 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2893 Py_END_ALLOW_THREADS
2894 if (res < 0)
2895 return s->errorhandler();
2896 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2897 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002898}
2899
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002900PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002901"getsockname() -> address info\n\
2902\n\
2903Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002904info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002905
Guido van Rossumc89705d1992-11-26 08:54:07 +00002906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002908/* s.getpeername() method */
2909
Guido van Rossum73624e91994-10-10 17:59:00 +00002910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002911sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 sock_addr_t addrbuf;
2914 int res;
2915 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 if (!getsockaddrlen(s, &addrlen))
2918 return NULL;
2919 memset(&addrbuf, 0, addrlen);
2920 Py_BEGIN_ALLOW_THREADS
2921 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2922 Py_END_ALLOW_THREADS
2923 if (res < 0)
2924 return s->errorhandler();
2925 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2926 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002927}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002929PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002930"getpeername() -> address info\n\
2931\n\
2932Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002933info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002934
Guido van Rossumb6775db1994-08-01 11:34:53 +00002935#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002936
2937
Guido van Rossum30a685f1991-06-27 15:51:29 +00002938/* s.listen(n) method */
2939
Guido van Rossum73624e91994-10-10 17:59:00 +00002940static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002941sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002942{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002943 /* We try to choose a default backlog high enough to avoid connection drops
2944 * for common workloads, yet not too high to limit resource usage. */
2945 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002947
Charles-François Natali644b8f52014-05-22 19:45:39 +01002948 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002952 /* To avoid problems on systems that don't allow a negative backlog
2953 * (which doesn't make sense anyway) we force a minimum value of 0. */
2954 if (backlog < 0)
2955 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 res = listen(s->sock_fd, backlog);
2957 Py_END_ALLOW_THREADS
2958 if (res < 0)
2959 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002960 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002961}
2962
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002963PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002964"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002966Enable a server to accept connections. If backlog is specified, it must be\n\
2967at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002968unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002969connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970
Victor Stinner31bf2d52015-04-01 21:57:09 +02002971struct sock_recv {
2972 char *cbuf;
2973 Py_ssize_t len;
2974 int flags;
2975 Py_ssize_t result;
2976};
2977
2978static int
2979sock_recv_impl(PySocketSockObject *s, void *data)
2980{
2981 struct sock_recv *ctx = data;
2982
2983#ifdef MS_WINDOWS
2984 if (ctx->len > INT_MAX)
2985 ctx->len = INT_MAX;
2986 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2987#else
2988 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2989#endif
2990 return (ctx->result >= 0);
2991}
2992
Guido van Rossum82a5c661998-07-07 20:45:43 +00002993
Thomas Wouters477c8d52006-05-27 19:21:47 +00002994/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002995 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002996 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002997 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002998 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002999 * also possible that we return a number of bytes smaller than the request
3000 * bytes.
3001 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003002
Antoine Pitrou19467d22010-08-17 19:33:30 +00003003static Py_ssize_t
3004sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003005{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003006 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 if (!IS_SELECTABLE(s)) {
3009 select_error();
3010 return -1;
3011 }
3012 if (len == 0) {
3013 /* If 0 bytes were requested, do nothing. */
3014 return 0;
3015 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003016
Victor Stinner31bf2d52015-04-01 21:57:09 +02003017 ctx.cbuf = cbuf;
3018 ctx.len = len;
3019 ctx.flags = flags;
3020 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003022
3023 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003024}
3025
Guido van Rossum48a680c2001-03-02 06:34:14 +00003026
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003027/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003028
Guido van Rossum73624e91994-10-10 17:59:00 +00003029static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003031{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003032 Py_ssize_t recvlen, outlen;
3033 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003035
Antoine Pitrou19467d22010-08-17 19:33:30 +00003036 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 if (recvlen < 0) {
3040 PyErr_SetString(PyExc_ValueError,
3041 "negative buffersize in recv");
3042 return NULL;
3043 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 /* Allocate a new string. */
3046 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3047 if (buf == NULL)
3048 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 /* Call the guts */
3051 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3052 if (outlen < 0) {
3053 /* An error occurred, release the string and return an
3054 error. */
3055 Py_DECREF(buf);
3056 return NULL;
3057 }
3058 if (outlen != recvlen) {
3059 /* We did not read as many bytes as we anticipated, resize the
3060 string if possible and be successful. */
3061 _PyBytes_Resize(&buf, outlen);
3062 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003064 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003065}
3066
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003067PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003068"recv(buffersize[, flags]) -> data\n\
3069\n\
3070Receive up to buffersize bytes from the socket. For the optional flags\n\
3071argument, see the Unix manual. When no data is available, block until\n\
3072at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003073the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003074
Guido van Rossum30a685f1991-06-27 15:51:29 +00003075
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003076/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003077
Thomas Wouters477c8d52006-05-27 19:21:47 +00003078static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003079sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003082
Antoine Pitrou19467d22010-08-17 19:33:30 +00003083 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 Py_buffer pbuf;
3085 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003086 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003089 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 &pbuf, &recvlen, &flags))
3091 return NULL;
3092 buf = pbuf.buf;
3093 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 if (recvlen < 0) {
3096 PyBuffer_Release(&pbuf);
3097 PyErr_SetString(PyExc_ValueError,
3098 "negative buffersize in recv_into");
3099 return NULL;
3100 }
3101 if (recvlen == 0) {
3102 /* If nbytes was not specified, use the buffer's length */
3103 recvlen = buflen;
3104 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 /* Check if the buffer is large enough */
3107 if (buflen < recvlen) {
3108 PyBuffer_Release(&pbuf);
3109 PyErr_SetString(PyExc_ValueError,
3110 "buffer too small for requested bytes");
3111 return NULL;
3112 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 /* Call the guts */
3115 readlen = sock_recv_guts(s, buf, recvlen, flags);
3116 if (readlen < 0) {
3117 /* Return an error. */
3118 PyBuffer_Release(&pbuf);
3119 return NULL;
3120 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 PyBuffer_Release(&pbuf);
3123 /* Return the number of bytes read. Note that we do not do anything
3124 special here in the case that readlen < recvlen. */
3125 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003126}
3127
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003128PyDoc_STRVAR(recv_into_doc,
3129"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130\n\
3131A version of recv() that stores its data into a buffer rather than creating \n\
3132a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3133is not specified (or 0), receive up to the size available in the given buffer.\n\
3134\n\
3135See recv() for documentation about the flags.");
3136
Victor Stinner31bf2d52015-04-01 21:57:09 +02003137struct sock_recvfrom {
3138 char* cbuf;
3139 Py_ssize_t len;
3140 int flags;
3141 socklen_t *addrlen;
3142 sock_addr_t *addrbuf;
3143 Py_ssize_t result;
3144};
3145
3146static int
3147sock_recvfrom_impl(PySocketSockObject *s, void *data)
3148{
3149 struct sock_recvfrom *ctx = data;
3150
3151 memset(ctx->addrbuf, 0, *ctx->addrlen);
3152
3153#ifdef MS_WINDOWS
3154 if (ctx->len > INT_MAX)
3155 ctx->len = INT_MAX;
3156 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3157 SAS2SA(ctx->addrbuf), ctx->addrlen);
3158#else
3159 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3160 SAS2SA(ctx->addrbuf), ctx->addrlen);
3161#endif
3162 return (ctx->result >= 0);
3163}
3164
Thomas Wouters477c8d52006-05-27 19:21:47 +00003165
3166/*
Christian Heimes99170a52007-12-19 02:07:34 +00003167 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3168 * into a char buffer. If you have any inc/def ref to do to the objects that
3169 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003170 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003171 * that it is also possible that we return a number of bytes smaller than the
3172 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003173 *
3174 * 'addr' is a return value for the address object. Note that you must decref
3175 * it yourself.
3176 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003177static Py_ssize_t
3178sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003183 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 if (!getsockaddrlen(s, &addrlen))
3188 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 if (!IS_SELECTABLE(s)) {
3191 select_error();
3192 return -1;
3193 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003194
Victor Stinner31bf2d52015-04-01 21:57:09 +02003195 ctx.cbuf = cbuf;
3196 ctx.len = len;
3197 ctx.flags = flags;
3198 ctx.addrbuf = &addrbuf;
3199 ctx.addrlen = &addrlen;
3200 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003201 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003202
Victor Stinner31bf2d52015-04-01 21:57:09 +02003203 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3204 s->sock_proto);
3205 if (*addr == NULL)
3206 return -1;
3207
3208 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003209}
3210
3211/* s.recvfrom(nbytes [,flags]) method */
3212
3213static PyObject *
3214sock_recvfrom(PySocketSockObject *s, PyObject *args)
3215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 PyObject *buf = NULL;
3217 PyObject *addr = NULL;
3218 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003219 int flags = 0;
3220 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003221
Antoine Pitrou19467d22010-08-17 19:33:30 +00003222 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 if (recvlen < 0) {
3226 PyErr_SetString(PyExc_ValueError,
3227 "negative buffersize in recvfrom");
3228 return NULL;
3229 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3232 if (buf == NULL)
3233 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3236 recvlen, flags, &addr);
3237 if (outlen < 0) {
3238 goto finally;
3239 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (outlen != recvlen) {
3242 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003243 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003245 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 goto finally;
3247 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003250
3251finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 Py_XDECREF(buf);
3253 Py_XDECREF(addr);
3254 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003255}
3256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003257PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003258"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3259\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003260Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003261
Thomas Wouters477c8d52006-05-27 19:21:47 +00003262
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003263/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264
3265static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003266sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003269
Antoine Pitrou19467d22010-08-17 19:33:30 +00003270 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 Py_buffer pbuf;
3272 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003273 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003276
Antoine Pitrou19467d22010-08-17 19:33:30 +00003277 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 kwlist, &pbuf,
3279 &recvlen, &flags))
3280 return NULL;
3281 buf = pbuf.buf;
3282 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 if (recvlen < 0) {
3285 PyBuffer_Release(&pbuf);
3286 PyErr_SetString(PyExc_ValueError,
3287 "negative buffersize in recvfrom_into");
3288 return NULL;
3289 }
3290 if (recvlen == 0) {
3291 /* If nbytes was not specified, use the buffer's length */
3292 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003293 } else if (recvlen > buflen) {
3294 PyBuffer_Release(&pbuf);
3295 PyErr_SetString(PyExc_ValueError,
3296 "nbytes is greater than the length of the buffer");
3297 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3301 if (readlen < 0) {
3302 PyBuffer_Release(&pbuf);
3303 /* Return an error */
3304 Py_XDECREF(addr);
3305 return NULL;
3306 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 PyBuffer_Release(&pbuf);
3309 /* Return the number of bytes read and the address. Note that we do
3310 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003311 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003312}
3313
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003314PyDoc_STRVAR(recvfrom_into_doc,
3315"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003316\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003317Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003318
Victor Stinner35bee932015-04-02 12:28:07 +02003319/* The sendmsg() and recvmsg[_into]() methods require a working
3320 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3321#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003322struct sock_recvmsg {
3323 struct msghdr *msg;
3324 int flags;
3325 ssize_t result;
3326};
3327
3328static int
3329sock_recvmsg_impl(PySocketSockObject *s, void *data)
3330{
3331 struct sock_recvmsg *ctx = data;
3332
3333 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3334 return (ctx->result >= 0);
3335}
3336
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003337/*
3338 * Call recvmsg() with the supplied iovec structures, flags, and
3339 * ancillary data buffer size (controllen). Returns the tuple return
3340 * value for recvmsg() or recvmsg_into(), with the first item provided
3341 * by the supplied makeval() function. makeval() will be called with
3342 * the length read and makeval_data as arguments, and must return a
3343 * new reference (which will be decrefed if there is a subsequent
3344 * error). On error, closes any file descriptors received via
3345 * SCM_RIGHTS.
3346 */
3347static PyObject *
3348sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3349 int flags, Py_ssize_t controllen,
3350 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3351{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003352 sock_addr_t addrbuf;
3353 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003354 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003355 PyObject *cmsg_list = NULL, *retval = NULL;
3356 void *controlbuf = NULL;
3357 struct cmsghdr *cmsgh;
3358 size_t cmsgdatalen = 0;
3359 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003360 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003361
3362 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3363 ignored" when the socket is connected (Linux fills them in
3364 anyway for AF_UNIX sockets at least). Normally msg_namelen
3365 seems to be set to 0 if there's no address, but try to
3366 initialize msg_name to something that won't be mistaken for a
3367 real address if that doesn't happen. */
3368 if (!getsockaddrlen(s, &addrbuflen))
3369 return NULL;
3370 memset(&addrbuf, 0, addrbuflen);
3371 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3372
3373 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3374 PyErr_SetString(PyExc_ValueError,
3375 "invalid ancillary data buffer length");
3376 return NULL;
3377 }
3378 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3379 return PyErr_NoMemory();
3380
3381 /* Make the system call. */
3382 if (!IS_SELECTABLE(s)) {
3383 select_error();
3384 goto finally;
3385 }
3386
Victor Stinner31bf2d52015-04-01 21:57:09 +02003387 msg.msg_name = SAS2SA(&addrbuf);
3388 msg.msg_namelen = addrbuflen;
3389 msg.msg_iov = iov;
3390 msg.msg_iovlen = iovlen;
3391 msg.msg_control = controlbuf;
3392 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003393
Victor Stinner31bf2d52015-04-01 21:57:09 +02003394 ctx.msg = &msg;
3395 ctx.flags = flags;
3396 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003397 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003398
3399 /* Make list of (level, type, data) tuples from control messages. */
3400 if ((cmsg_list = PyList_New(0)) == NULL)
3401 goto err_closefds;
3402 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3403 implementations didn't do so. */
3404 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3405 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3406 PyObject *bytes, *tuple;
3407 int tmp;
3408
3409 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3410 if (cmsg_status != 0) {
3411 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3412 "received malformed or improperly-truncated "
3413 "ancillary data", 1) == -1)
3414 goto err_closefds;
3415 }
3416 if (cmsg_status < 0)
3417 break;
3418 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003419 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003420 goto err_closefds;
3421 }
3422
3423 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3424 cmsgdatalen);
3425 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3426 (int)cmsgh->cmsg_type, bytes);
3427 if (tuple == NULL)
3428 goto err_closefds;
3429 tmp = PyList_Append(cmsg_list, tuple);
3430 Py_DECREF(tuple);
3431 if (tmp != 0)
3432 goto err_closefds;
3433
3434 if (cmsg_status != 0)
3435 break;
3436 }
3437
3438 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003439 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003440 cmsg_list,
3441 (int)msg.msg_flags,
3442 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3443 ((msg.msg_namelen > addrbuflen) ?
3444 addrbuflen : msg.msg_namelen),
3445 s->sock_proto));
3446 if (retval == NULL)
3447 goto err_closefds;
3448
3449finally:
3450 Py_XDECREF(cmsg_list);
3451 PyMem_Free(controlbuf);
3452 return retval;
3453
3454err_closefds:
3455#ifdef SCM_RIGHTS
3456 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3457 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3458 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3459 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3460 if (cmsg_status < 0)
3461 break;
3462 if (cmsgh->cmsg_level == SOL_SOCKET &&
3463 cmsgh->cmsg_type == SCM_RIGHTS) {
3464 size_t numfds;
3465 int *fdp;
3466
3467 numfds = cmsgdatalen / sizeof(int);
3468 fdp = (int *)CMSG_DATA(cmsgh);
3469 while (numfds-- > 0)
3470 close(*fdp++);
3471 }
3472 if (cmsg_status != 0)
3473 break;
3474 }
3475#endif /* SCM_RIGHTS */
3476 goto finally;
3477}
3478
3479
3480static PyObject *
3481makeval_recvmsg(ssize_t received, void *data)
3482{
3483 PyObject **buf = data;
3484
3485 if (received < PyBytes_GET_SIZE(*buf))
3486 _PyBytes_Resize(buf, received);
3487 Py_XINCREF(*buf);
3488 return *buf;
3489}
3490
3491/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3492
3493static PyObject *
3494sock_recvmsg(PySocketSockObject *s, PyObject *args)
3495{
3496 Py_ssize_t bufsize, ancbufsize = 0;
3497 int flags = 0;
3498 struct iovec iov;
3499 PyObject *buf = NULL, *retval = NULL;
3500
3501 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3502 return NULL;
3503
3504 if (bufsize < 0) {
3505 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3506 return NULL;
3507 }
3508 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3509 return NULL;
3510 iov.iov_base = PyBytes_AS_STRING(buf);
3511 iov.iov_len = bufsize;
3512
3513 /* Note that we're passing a pointer to *our pointer* to the bytes
3514 object here (&buf); makeval_recvmsg() may incref the object, or
3515 deallocate it and set our pointer to NULL. */
3516 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3517 &makeval_recvmsg, &buf);
3518 Py_XDECREF(buf);
3519 return retval;
3520}
3521
3522PyDoc_STRVAR(recvmsg_doc,
3523"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3524\n\
3525Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3526socket. The ancbufsize argument sets the size in bytes of the\n\
3527internal buffer used to receive the ancillary data; it defaults to 0,\n\
3528meaning that no ancillary data will be received. Appropriate buffer\n\
3529sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3530CMSG_LEN(), and items which do not fit into the buffer might be\n\
3531truncated or discarded. The flags argument defaults to 0 and has the\n\
3532same meaning as for recv().\n\
3533\n\
3534The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3535The data item is a bytes object holding the non-ancillary data\n\
3536received. The ancdata item is a list of zero or more tuples\n\
3537(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3538(control messages) received: cmsg_level and cmsg_type are integers\n\
3539specifying the protocol level and protocol-specific type respectively,\n\
3540and cmsg_data is a bytes object holding the associated data. The\n\
3541msg_flags item is the bitwise OR of various flags indicating\n\
3542conditions on the received message; see your system documentation for\n\
3543details. If the receiving socket is unconnected, address is the\n\
3544address of the sending socket, if available; otherwise, its value is\n\
3545unspecified.\n\
3546\n\
3547If recvmsg() raises an exception after the system call returns, it\n\
3548will first attempt to close any file descriptors received via the\n\
3549SCM_RIGHTS mechanism.");
3550
3551
3552static PyObject *
3553makeval_recvmsg_into(ssize_t received, void *data)
3554{
3555 return PyLong_FromSsize_t(received);
3556}
3557
3558/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3559
3560static PyObject *
3561sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3562{
3563 Py_ssize_t ancbufsize = 0;
3564 int flags = 0;
3565 struct iovec *iovs = NULL;
3566 Py_ssize_t i, nitems, nbufs = 0;
3567 Py_buffer *bufs = NULL;
3568 PyObject *buffers_arg, *fast, *retval = NULL;
3569
3570 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3571 &buffers_arg, &ancbufsize, &flags))
3572 return NULL;
3573
3574 if ((fast = PySequence_Fast(buffers_arg,
3575 "recvmsg_into() argument 1 must be an "
3576 "iterable")) == NULL)
3577 return NULL;
3578 nitems = PySequence_Fast_GET_SIZE(fast);
3579 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003580 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003581 goto finally;
3582 }
3583
3584 /* Fill in an iovec for each item, and save the Py_buffer
3585 structs to release afterwards. */
3586 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3587 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3588 PyErr_NoMemory();
3589 goto finally;
3590 }
3591 for (; nbufs < nitems; nbufs++) {
3592 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3593 "w*;recvmsg_into() argument 1 must be an iterable "
3594 "of single-segment read-write buffers",
3595 &bufs[nbufs]))
3596 goto finally;
3597 iovs[nbufs].iov_base = bufs[nbufs].buf;
3598 iovs[nbufs].iov_len = bufs[nbufs].len;
3599 }
3600
3601 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3602 &makeval_recvmsg_into, NULL);
3603finally:
3604 for (i = 0; i < nbufs; i++)
3605 PyBuffer_Release(&bufs[i]);
3606 PyMem_Free(bufs);
3607 PyMem_Free(iovs);
3608 Py_DECREF(fast);
3609 return retval;
3610}
3611
3612PyDoc_STRVAR(recvmsg_into_doc,
3613"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3614\n\
3615Receive normal data and ancillary data from the socket, scattering the\n\
3616non-ancillary data into a series of buffers. The buffers argument\n\
3617must be an iterable of objects that export writable buffers\n\
3618(e.g. bytearray objects); these will be filled with successive chunks\n\
3619of the non-ancillary data until it has all been written or there are\n\
3620no more buffers. The ancbufsize argument sets the size in bytes of\n\
3621the internal buffer used to receive the ancillary data; it defaults to\n\
36220, meaning that no ancillary data will be received. Appropriate\n\
3623buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3624or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3625truncated or discarded. The flags argument defaults to 0 and has the\n\
3626same meaning as for recv().\n\
3627\n\
3628The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3629The nbytes item is the total number of bytes of non-ancillary data\n\
3630written into the buffers. The ancdata item is a list of zero or more\n\
3631tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3632data (control messages) received: cmsg_level and cmsg_type are\n\
3633integers specifying the protocol level and protocol-specific type\n\
3634respectively, and cmsg_data is a bytes object holding the associated\n\
3635data. The msg_flags item is the bitwise OR of various flags\n\
3636indicating conditions on the received message; see your system\n\
3637documentation for details. If the receiving socket is unconnected,\n\
3638address is the address of the sending socket, if available; otherwise,\n\
3639its value is unspecified.\n\
3640\n\
3641If recvmsg_into() raises an exception after the system call returns,\n\
3642it will first attempt to close any file descriptors received via the\n\
3643SCM_RIGHTS mechanism.");
3644#endif /* CMSG_LEN */
3645
3646
Victor Stinner31bf2d52015-04-01 21:57:09 +02003647struct sock_send {
3648 char *buf;
3649 Py_ssize_t len;
3650 int flags;
3651 Py_ssize_t result;
3652};
3653
3654static int
3655sock_send_impl(PySocketSockObject *s, void *data)
3656{
3657 struct sock_send *ctx = data;
3658
3659#ifdef MS_WINDOWS
3660 if (ctx->len > INT_MAX)
3661 ctx->len = INT_MAX;
3662 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3663#else
3664 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3665#endif
3666 return (ctx->result >= 0);
3667}
3668
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003669/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003670
Guido van Rossum73624e91994-10-10 17:59:00 +00003671static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003672sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003673{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003674 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003676 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3679 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 if (!IS_SELECTABLE(s)) {
3682 PyBuffer_Release(&pbuf);
3683 return select_error();
3684 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003685 ctx.buf = pbuf.buf;
3686 ctx.len = pbuf.len;
3687 ctx.flags = flags;
3688 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003689 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 return NULL;
3691 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003692 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003693
3694 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003695}
3696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003697PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003698"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003699\n\
3700Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003701argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003702sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003703
3704
3705/* s.sendall(data [,flags]) method */
3706
3707static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003708sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003711 Py_ssize_t len, n;
3712 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003714 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003715 int has_timeout = (s->sock_timeout > 0);
3716 _PyTime_t interval = s->sock_timeout;
3717 _PyTime_t deadline = 0;
3718 int deadline_initialized = 0;
3719 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3722 return NULL;
3723 buf = pbuf.buf;
3724 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 if (!IS_SELECTABLE(s)) {
3727 PyBuffer_Release(&pbuf);
3728 return select_error();
3729 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003732 if (has_timeout) {
3733 if (deadline_initialized) {
3734 /* recompute the timeout */
3735 interval = deadline - _PyTime_GetMonotonicClock();
3736 }
3737 else {
3738 deadline_initialized = 1;
3739 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3740 }
3741
3742 if (interval <= 0) {
3743 PyErr_SetString(socket_timeout, "timed out");
3744 goto done;
3745 }
3746 }
3747
Victor Stinner02f32ab2015-04-01 22:53:26 +02003748 ctx.buf = buf;
3749 ctx.len = len;
3750 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003751 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3752 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003753 n = ctx.result;
3754 assert(n >= 0);
3755
3756 buf += n;
3757 len -= n;
3758
3759 /* We must run our signal handlers before looping again.
3760 send() can return a successful partial write when it is
3761 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003762 if (PyErr_CheckSignals())
3763 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003764 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003766
Victor Stinner8912d142015-04-06 23:16:34 +02003767 Py_INCREF(Py_None);
3768 res = Py_None;
3769
3770done:
3771 PyBuffer_Release(&pbuf);
3772 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003773}
3774
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003775PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003776"sendall(data[, flags])\n\
3777\n\
3778Send a data string to the socket. For the optional flags\n\
3779argument, see the Unix manual. This calls send() repeatedly\n\
3780until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003781to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003782
Guido van Rossum30a685f1991-06-27 15:51:29 +00003783
Victor Stinner31bf2d52015-04-01 21:57:09 +02003784struct sock_sendto {
3785 char *buf;
3786 Py_ssize_t len;
3787 int flags;
3788 int addrlen;
3789 sock_addr_t *addrbuf;
3790 Py_ssize_t result;
3791};
3792
3793static int
3794sock_sendto_impl(PySocketSockObject *s, void *data)
3795{
3796 struct sock_sendto *ctx = data;
3797
3798#ifdef MS_WINDOWS
3799 if (ctx->len > INT_MAX)
3800 ctx->len = INT_MAX;
3801 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3802 SAS2SA(ctx->addrbuf), ctx->addrlen);
3803#else
3804 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3805 SAS2SA(ctx->addrbuf), ctx->addrlen);
3806#endif
3807 return (ctx->result >= 0);
3808}
3809
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003810/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003811
Guido van Rossum73624e91994-10-10 17:59:00 +00003812static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003813sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003814{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 Py_buffer pbuf;
3816 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003817 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003819 int addrlen, flags;
3820 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003823 arglen = PyTuple_Size(args);
3824 switch (arglen) {
3825 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003826 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3827 return NULL;
3828 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003829 break;
3830 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003831 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3832 &pbuf, &flags, &addro)) {
3833 return NULL;
3834 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003835 break;
3836 default:
3837 PyErr_Format(PyExc_TypeError,
3838 "sendto() takes 2 or 3 arguments (%d given)",
3839 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003840 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 if (!IS_SELECTABLE(s)) {
3844 PyBuffer_Release(&pbuf);
3845 return select_error();
3846 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3849 PyBuffer_Release(&pbuf);
3850 return NULL;
3851 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003852
Victor Stinner31bf2d52015-04-01 21:57:09 +02003853 ctx.buf = pbuf.buf;
3854 ctx.len = pbuf.len;
3855 ctx.flags = flags;
3856 ctx.addrlen = addrlen;
3857 ctx.addrbuf = &addrbuf;
3858 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003859 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003860 return NULL;
3861 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003862 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003863
3864 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003865}
3866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003867PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003868"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003869\n\
3870Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003871For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003872
Guido van Rossum30a685f1991-06-27 15:51:29 +00003873
Victor Stinner35bee932015-04-02 12:28:07 +02003874/* The sendmsg() and recvmsg[_into]() methods require a working
3875 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3876#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003877struct sock_sendmsg {
3878 struct msghdr *msg;
3879 int flags;
3880 ssize_t result;
3881};
3882
3883static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003884sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3885 struct msghdr *msg,
3886 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3887 Py_ssize_t ndataparts, ndatabufs = 0;
3888 int result = -1;
3889 struct iovec *iovs = NULL;
3890 PyObject *data_fast = NULL;
3891 Py_buffer *databufs = NULL;
3892
3893 /* Fill in an iovec for each message part, and save the Py_buffer
3894 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003895 data_fast = PySequence_Fast(data_arg,
3896 "sendmsg() argument 1 must be an "
3897 "iterable");
3898 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003899 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003900 }
3901
Christian Heimesdffa3942016-09-05 23:54:41 +02003902 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3903 if (ndataparts > INT_MAX) {
3904 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3905 goto finally;
3906 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003907
Christian Heimesdffa3942016-09-05 23:54:41 +02003908 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003909 if (ndataparts > 0) {
3910 iovs = PyMem_New(struct iovec, ndataparts);
3911 if (iovs == NULL) {
3912 PyErr_NoMemory();
3913 goto finally;
3914 }
3915 msg->msg_iov = iovs;
3916
3917 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003918 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003919 PyErr_NoMemory();
3920 goto finally;
3921 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003922 }
3923 for (; ndatabufs < ndataparts; ndatabufs++) {
3924 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3925 "y*;sendmsg() argument 1 must be an iterable of "
3926 "bytes-like objects",
3927 &databufs[ndatabufs]))
3928 goto finally;
3929 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3930 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3931 }
3932 result = 0;
3933 finally:
3934 *databufsout = databufs;
3935 *ndatabufsout = ndatabufs;
3936 Py_XDECREF(data_fast);
3937 return result;
3938}
3939
3940static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003941sock_sendmsg_impl(PySocketSockObject *s, void *data)
3942{
3943 struct sock_sendmsg *ctx = data;
3944
3945 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3946 return (ctx->result >= 0);
3947}
3948
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003949/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3950
3951static PyObject *
3952sock_sendmsg(PySocketSockObject *s, PyObject *args)
3953{
Christian Heimesdffa3942016-09-05 23:54:41 +02003954 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003955 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003956 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003957 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958 struct cmsginfo {
3959 int level;
3960 int type;
3961 Py_buffer data;
3962 } *cmsgs = NULL;
3963 void *controlbuf = NULL;
3964 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003965 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003966 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003968 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003969
3970 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02003971 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003973 }
3974
3975 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977 /* Parse destination address. */
3978 if (addr_arg != NULL && addr_arg != Py_None) {
3979 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3980 goto finally;
3981 msg.msg_name = &addrbuf;
3982 msg.msg_namelen = addrlen;
3983 }
3984
3985 /* Fill in an iovec for each message part, and save the Py_buffer
3986 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02003987 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003988 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003989 }
3990
3991 if (cmsg_arg == NULL)
3992 ncmsgs = 0;
3993 else {
3994 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3995 "sendmsg() argument 2 must be an "
3996 "iterable")) == NULL)
3997 goto finally;
3998 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3999 }
4000
4001#ifndef CMSG_SPACE
4002 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004003 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004 "sending multiple control messages is not supported "
4005 "on this system");
4006 goto finally;
4007 }
4008#endif
4009 /* Save level, type and Py_buffer for each control message,
4010 and calculate total size. */
4011 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4012 PyErr_NoMemory();
4013 goto finally;
4014 }
4015 controllen = controllen_last = 0;
4016 while (ncmsgbufs < ncmsgs) {
4017 size_t bufsize, space;
4018
4019 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4020 "(iiy*):[sendmsg() ancillary data items]",
4021 &cmsgs[ncmsgbufs].level,
4022 &cmsgs[ncmsgbufs].type,
4023 &cmsgs[ncmsgbufs].data))
4024 goto finally;
4025 bufsize = cmsgs[ncmsgbufs++].data.len;
4026
4027#ifdef CMSG_SPACE
4028 if (!get_CMSG_SPACE(bufsize, &space)) {
4029#else
4030 if (!get_CMSG_LEN(bufsize, &space)) {
4031#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004032 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004033 goto finally;
4034 }
4035 controllen += space;
4036 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004037 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038 goto finally;
4039 }
4040 controllen_last = controllen;
4041 }
4042
4043 /* Construct ancillary data block from control message info. */
4044 if (ncmsgbufs > 0) {
4045 struct cmsghdr *cmsgh = NULL;
4046
Victor Stinner52d61e42016-09-12 11:41:58 +02004047 controlbuf = PyMem_Malloc(controllen);
4048 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004049 PyErr_NoMemory();
4050 goto finally;
4051 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004052 msg.msg_control = controlbuf;
4053
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054 msg.msg_controllen = controllen;
4055
4056 /* Need to zero out the buffer as a workaround for glibc's
4057 CMSG_NXTHDR() implementation. After getting the pointer to
4058 the next header, it checks its (uninitialized) cmsg_len
4059 member to see if the "message" fits in the buffer, and
4060 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004061 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004062 memset(controlbuf, 0, controllen);
4063
4064 for (i = 0; i < ncmsgbufs; i++) {
4065 size_t msg_len, data_len = cmsgs[i].data.len;
4066 int enough_space = 0;
4067
4068 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4069 if (cmsgh == NULL) {
4070 PyErr_Format(PyExc_RuntimeError,
4071 "unexpected NULL result from %s()",
4072 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4073 goto finally;
4074 }
4075 if (!get_CMSG_LEN(data_len, &msg_len)) {
4076 PyErr_SetString(PyExc_RuntimeError,
4077 "item size out of range for CMSG_LEN()");
4078 goto finally;
4079 }
4080 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4081 size_t space;
4082
4083 cmsgh->cmsg_len = msg_len;
4084 if (get_cmsg_data_space(&msg, cmsgh, &space))
4085 enough_space = (space >= data_len);
4086 }
4087 if (!enough_space) {
4088 PyErr_SetString(PyExc_RuntimeError,
4089 "ancillary data does not fit in calculated "
4090 "space");
4091 goto finally;
4092 }
4093 cmsgh->cmsg_level = cmsgs[i].level;
4094 cmsgh->cmsg_type = cmsgs[i].type;
4095 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4096 }
4097 }
4098
4099 /* Make the system call. */
4100 if (!IS_SELECTABLE(s)) {
4101 select_error();
4102 goto finally;
4103 }
4104
Victor Stinner31bf2d52015-04-01 21:57:09 +02004105 ctx.msg = &msg;
4106 ctx.flags = flags;
4107 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004108 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004109
4110 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111
4112finally:
4113 PyMem_Free(controlbuf);
4114 for (i = 0; i < ncmsgbufs; i++)
4115 PyBuffer_Release(&cmsgs[i].data);
4116 PyMem_Free(cmsgs);
4117 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004118 PyMem_Free(msg.msg_iov);
4119 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004120 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004121 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004122 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004123 return retval;
4124}
4125
4126PyDoc_STRVAR(sendmsg_doc,
4127"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4128\n\
4129Send normal and ancillary data to the socket, gathering the\n\
4130non-ancillary data from a series of buffers and concatenating it into\n\
4131a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004132data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004133The ancdata argument specifies the ancillary data (control messages)\n\
4134as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4135cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4136protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004137is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004138argument defaults to 0 and has the same meaning as for send(). If\n\
4139address is supplied and not None, it sets a destination address for\n\
4140the message. The return value is the number of bytes of non-ancillary\n\
4141data sent.");
4142#endif /* CMSG_LEN */
4143
Christian Heimesdffa3942016-09-05 23:54:41 +02004144#ifdef HAVE_SOCKADDR_ALG
4145static PyObject*
4146sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4147{
4148 PyObject *retval = NULL;
4149
4150 Py_ssize_t i, ndatabufs = 0;
4151 Py_buffer *databufs = NULL;
4152 PyObject *data_arg = NULL;
4153
4154 Py_buffer iv = {NULL, NULL};
4155
4156 PyObject *opobj = NULL;
4157 int op = -1;
4158
4159 PyObject *assoclenobj = NULL;
4160 int assoclen = -1;
4161
4162 unsigned int *uiptr;
4163 int flags = 0;
4164
4165 struct msghdr msg;
4166 struct cmsghdr *header = NULL;
4167 struct af_alg_iv *alg_iv = NULL;
4168 struct sock_sendmsg ctx;
4169 Py_ssize_t controllen;
4170 void *controlbuf = NULL;
4171 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4172
4173 if (self->sock_family != AF_ALG) {
4174 PyErr_SetString(PyExc_OSError,
4175 "algset is only supported for AF_ALG");
4176 return NULL;
4177 }
4178
4179 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4180 "|O$O!y*O!i:sendmsg_afalg", keywords,
4181 &data_arg,
4182 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004183 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004184 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004185 }
4186
4187 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004188
4189 /* op is a required, keyword-only argument >= 0 */
4190 if (opobj != NULL) {
4191 op = _PyLong_AsInt(opobj);
4192 }
4193 if (op < 0) {
4194 /* override exception from _PyLong_AsInt() */
4195 PyErr_SetString(PyExc_TypeError,
4196 "Invalid or missing argument 'op'");
4197 goto finally;
4198 }
4199 /* assoclen is optional but must be >= 0 */
4200 if (assoclenobj != NULL) {
4201 assoclen = _PyLong_AsInt(assoclenobj);
4202 if (assoclen == -1 && PyErr_Occurred()) {
4203 goto finally;
4204 }
4205 if (assoclen < 0) {
4206 PyErr_SetString(PyExc_TypeError,
4207 "assoclen must be positive");
4208 goto finally;
4209 }
4210 }
4211
4212 controllen = CMSG_SPACE(4);
4213 if (iv.buf != NULL) {
4214 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4215 }
4216 if (assoclen >= 0) {
4217 controllen += CMSG_SPACE(4);
4218 }
4219
4220 controlbuf = PyMem_Malloc(controllen);
4221 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004222 PyErr_NoMemory();
4223 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004224 }
4225 memset(controlbuf, 0, controllen);
4226
Christian Heimesdffa3942016-09-05 23:54:41 +02004227 msg.msg_controllen = controllen;
4228 msg.msg_control = controlbuf;
4229
4230 /* Fill in an iovec for each message part, and save the Py_buffer
4231 structs to release afterwards. */
4232 if (data_arg != NULL) {
4233 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4234 goto finally;
4235 }
4236 }
4237
4238 /* set operation to encrypt or decrypt */
4239 header = CMSG_FIRSTHDR(&msg);
4240 if (header == NULL) {
4241 PyErr_SetString(PyExc_RuntimeError,
4242 "unexpected NULL result from CMSG_FIRSTHDR");
4243 goto finally;
4244 }
4245 header->cmsg_level = SOL_ALG;
4246 header->cmsg_type = ALG_SET_OP;
4247 header->cmsg_len = CMSG_LEN(4);
4248 uiptr = (void*)CMSG_DATA(header);
4249 *uiptr = (unsigned int)op;
4250
4251 /* set initialization vector */
4252 if (iv.buf != NULL) {
4253 header = CMSG_NXTHDR(&msg, header);
4254 if (header == NULL) {
4255 PyErr_SetString(PyExc_RuntimeError,
4256 "unexpected NULL result from CMSG_NXTHDR(iv)");
4257 goto finally;
4258 }
4259 header->cmsg_level = SOL_ALG;
4260 header->cmsg_type = ALG_SET_IV;
4261 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4262 alg_iv = (void*)CMSG_DATA(header);
4263 alg_iv->ivlen = iv.len;
4264 memcpy(alg_iv->iv, iv.buf, iv.len);
4265 }
4266
4267 /* set length of associated data for AEAD */
4268 if (assoclen >= 0) {
4269 header = CMSG_NXTHDR(&msg, header);
4270 if (header == NULL) {
4271 PyErr_SetString(PyExc_RuntimeError,
4272 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4273 goto finally;
4274 }
4275 header->cmsg_level = SOL_ALG;
4276 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4277 header->cmsg_len = CMSG_LEN(4);
4278 uiptr = (void*)CMSG_DATA(header);
4279 *uiptr = (unsigned int)assoclen;
4280 }
4281
4282 ctx.msg = &msg;
4283 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004284 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004285 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004286 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004287
4288 retval = PyLong_FromSsize_t(ctx.result);
4289
4290 finally:
4291 PyMem_Free(controlbuf);
4292 if (iv.buf != NULL) {
4293 PyBuffer_Release(&iv);
4294 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004295 PyMem_Free(msg.msg_iov);
4296 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004297 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004298 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004299 PyMem_Free(databufs);
4300 return retval;
4301}
4302
4303PyDoc_STRVAR(sendmsg_afalg_doc,
4304"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4305\n\
4306Set operation mode, IV and length of associated data for an AF_ALG\n\
4307operation socket.");
4308#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004309
Guido van Rossum30a685f1991-06-27 15:51:29 +00004310/* s.shutdown(how) method */
4311
Guido van Rossum73624e91994-10-10 17:59:00 +00004312static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004313sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 int how;
4316 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004317
Serhiy Storchaka78980432013-01-15 01:12:17 +02004318 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 if (how == -1 && PyErr_Occurred())
4320 return NULL;
4321 Py_BEGIN_ALLOW_THREADS
4322 res = shutdown(s->sock_fd, how);
4323 Py_END_ALLOW_THREADS
4324 if (res < 0)
4325 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004326 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004327}
4328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004329PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004330"shutdown(flag)\n\
4331\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004332Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4333of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004334
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004335#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004336static PyObject*
4337sock_ioctl(PySocketSockObject *s, PyObject *arg)
4338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 unsigned long cmd = SIO_RCVALL;
4340 PyObject *argO;
4341 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4344 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 switch (cmd) {
4347 case SIO_RCVALL: {
4348 unsigned int option = RCVALL_ON;
4349 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4350 return NULL;
4351 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4352 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4353 return set_error();
4354 }
4355 return PyLong_FromUnsignedLong(recv); }
4356 case SIO_KEEPALIVE_VALS: {
4357 struct tcp_keepalive ka;
4358 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4359 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4360 return NULL;
4361 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4362 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4363 return set_error();
4364 }
4365 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004366#if defined(SIO_LOOPBACK_FAST_PATH)
4367 case SIO_LOOPBACK_FAST_PATH: {
4368 unsigned int option;
4369 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4370 return NULL;
4371 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4372 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4373 return set_error();
4374 }
4375 return PyLong_FromUnsignedLong(recv); }
4376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 default:
4378 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4379 return NULL;
4380 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004381}
4382PyDoc_STRVAR(sock_ioctl_doc,
4383"ioctl(cmd, option) -> long\n\
4384\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004385Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4386SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004387SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4388SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004389#endif
4390
4391#if defined(MS_WINDOWS)
4392static PyObject*
4393sock_share(PySocketSockObject *s, PyObject *arg)
4394{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004395 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004396 DWORD processId;
4397 int result;
4398
4399 if (!PyArg_ParseTuple(arg, "I", &processId))
4400 return NULL;
4401
4402 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004403 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004404 Py_END_ALLOW_THREADS
4405 if (result == SOCKET_ERROR)
4406 return set_error();
4407 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4408}
4409PyDoc_STRVAR(sock_share_doc,
4410"share(process_id) -> bytes\n\
4411\n\
4412Share the socket with another process. The target process id\n\
4413must be provided and the resulting bytes object passed to the target\n\
4414process. There the shared socket can be instantiated by calling\n\
4415socket.fromshare().");
4416
Christian Heimesfaf2f632008-01-06 16:59:19 +00004417
4418#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004419
4420/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004421
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004422static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4424 accept_doc},
4425 {"bind", (PyCFunction)sock_bind, METH_O,
4426 bind_doc},
4427 {"close", (PyCFunction)sock_close, METH_NOARGS,
4428 close_doc},
4429 {"connect", (PyCFunction)sock_connect, METH_O,
4430 connect_doc},
4431 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4432 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004433 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4434 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4436 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004437#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 {"getpeername", (PyCFunction)sock_getpeername,
4439 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 {"getsockname", (PyCFunction)sock_getsockname,
4442 METH_NOARGS, getsockname_doc},
4443 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4444 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004445#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4447 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004448#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004449#if defined(MS_WINDOWS)
4450 {"share", (PyCFunction)sock_share, METH_VARARGS,
4451 sock_share_doc},
4452#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004453 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 listen_doc},
4455 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4456 recv_doc},
4457 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4458 recv_into_doc},
4459 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4460 recvfrom_doc},
4461 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4462 recvfrom_into_doc},
4463 {"send", (PyCFunction)sock_send, METH_VARARGS,
4464 send_doc},
4465 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4466 sendall_doc},
4467 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4468 sendto_doc},
4469 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4470 setblocking_doc},
4471 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4472 settimeout_doc},
4473 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4474 gettimeout_doc},
4475 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4476 setsockopt_doc},
4477 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4478 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004479#ifdef CMSG_LEN
4480 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4481 recvmsg_doc},
4482 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4483 recvmsg_into_doc,},
4484 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4485 sendmsg_doc},
4486#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004487#ifdef HAVE_SOCKADDR_ALG
4488 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4489 sendmsg_afalg_doc},
4490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004492};
4493
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004494/* SockObject members */
4495static PyMemberDef sock_memberlist[] = {
4496 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4497 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4498 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004499 {0},
4500};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004501
Victor Stinner71694d52015-03-28 01:18:54 +01004502static PyGetSetDef sock_getsetlist[] = {
4503 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4504 {NULL} /* sentinel */
4505};
4506
Guido van Rossum73624e91994-10-10 17:59:00 +00004507/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004508 First close the file description. */
4509
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004510static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004511sock_finalize(PySocketSockObject *s)
4512{
4513 SOCKET_T fd;
4514 PyObject *error_type, *error_value, *error_traceback;
4515
4516 /* Save the current exception, if any. */
4517 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4518
Victor Stinnerd3afb622016-07-22 17:47:09 +02004519 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004520 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4521 /* Spurious errors can appear at shutdown */
4522 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4523 PyErr_WriteUnraisable((PyObject *)s);
4524 }
4525 }
4526
4527 /* Only close the socket *after* logging the ResourceWarning warning
4528 to allow the logger to call socket methods like
4529 socket.getsockname(). If the socket is closed before, socket
4530 methods fails with the EBADF error. */
4531 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004532 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004533
4534 /* We do not want to retry upon EINTR: see sock_close() */
4535 Py_BEGIN_ALLOW_THREADS
4536 (void) SOCKETCLOSE(fd);
4537 Py_END_ALLOW_THREADS
4538 }
4539
4540 /* Restore the saved exception. */
4541 PyErr_Restore(error_type, error_value, error_traceback);
4542}
4543
4544static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004545sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004546{
Victor Stinner19a8e842016-03-21 16:36:48 +01004547 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4548 return;
4549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004551}
4552
Guido van Rossum30a685f1991-06-27 15:51:29 +00004553
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004555sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004556{
Victor Stinnere254e532014-07-26 14:36:55 +02004557 long sock_fd;
4558 /* On Windows, this test is needed because SOCKET_T is unsigned */
4559 if (s->sock_fd == INVALID_SOCKET) {
4560 sock_fd = -1;
4561 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004562#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004563 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 /* this can occur on Win64, and actually there is a special
4565 ugly printf formatter for decimal pointer length integer
4566 printing, only bother if necessary*/
4567 PyErr_SetString(PyExc_OverflowError,
4568 "no printf formatter to display "
4569 "the socket descriptor in decimal");
4570 return NULL;
4571 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004572#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004573 else
4574 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 return PyUnicode_FromFormat(
4576 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004577 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 s->sock_type,
4579 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004580}
4581
4582
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004583/* Create a new, uninitialized socket object. */
4584
4585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 new = type->tp_alloc(type, 0);
4591 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004592 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004593 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 ((PySocketSockObject *)new)->errorhandler = &set_error;
4595 }
4596 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004597}
4598
4599
4600/* Initialize a new socket object. */
4601
Victor Stinnerdaf45552013-08-28 00:53:59 +02004602#ifdef SOCK_CLOEXEC
4603/* socket() and socketpair() fail with EINVAL on Linux kernel older
4604 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4605static int sock_cloexec_works = -1;
4606#endif
4607
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004608/*ARGSUSED*/
4609static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004610sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004612 PySocketSockObject *s = (PySocketSockObject *)self;
4613 PyObject *fdobj = NULL;
4614 SOCKET_T fd = INVALID_SOCKET;
4615 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4616 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004617#ifndef MS_WINDOWS
4618#ifdef SOCK_CLOEXEC
4619 int *atomic_flag_works = &sock_cloexec_works;
4620#else
4621 int *atomic_flag_works = NULL;
4622#endif
4623#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4626 "|iiiO:socket", keywords,
4627 &family, &type, &proto, &fdobj))
4628 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004631#ifdef MS_WINDOWS
4632 /* recreate a socket that was duplicated */
4633 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004634 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004635 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4636 PyErr_Format(PyExc_ValueError,
4637 "socket descriptor string has wrong size, "
4638 "should be %zu bytes.", sizeof(info));
4639 return -1;
4640 }
4641 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4642 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004643 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004644 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4645 Py_END_ALLOW_THREADS
4646 if (fd == INVALID_SOCKET) {
4647 set_error();
4648 return -1;
4649 }
4650 family = info.iAddressFamily;
4651 type = info.iSocketType;
4652 proto = info.iProtocol;
4653 }
4654 else
4655#endif
4656 {
4657 fd = PyLong_AsSocket_t(fdobj);
4658 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4659 return -1;
4660 if (fd == INVALID_SOCKET) {
4661 PyErr_SetString(PyExc_ValueError,
4662 "can't use invalid socket value");
4663 return -1;
4664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 }
4666 }
4667 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004668#ifdef MS_WINDOWS
4669 /* Windows implementation */
4670#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4671#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4672#endif
4673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004675 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004676 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004677 NULL, 0,
4678 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4679 if (fd == INVALID_SOCKET) {
4680 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4681 support_wsa_no_inherit = 0;
4682 fd = socket(family, type, proto);
4683 }
4684 }
4685 else {
4686 fd = socket(family, type, proto);
4687 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 if (fd == INVALID_SOCKET) {
4691 set_error();
4692 return -1;
4693 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004694
4695 if (!support_wsa_no_inherit) {
4696 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4697 closesocket(fd);
4698 PyErr_SetFromWindowsErr(0);
4699 return -1;
4700 }
4701 }
4702#else
4703 /* UNIX */
4704 Py_BEGIN_ALLOW_THREADS
4705#ifdef SOCK_CLOEXEC
4706 if (sock_cloexec_works != 0) {
4707 fd = socket(family, type | SOCK_CLOEXEC, proto);
4708 if (sock_cloexec_works == -1) {
4709 if (fd >= 0) {
4710 sock_cloexec_works = 1;
4711 }
4712 else if (errno == EINVAL) {
4713 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4714 sock_cloexec_works = 0;
4715 fd = socket(family, type, proto);
4716 }
4717 }
4718 }
4719 else
4720#endif
4721 {
4722 fd = socket(family, type, proto);
4723 }
4724 Py_END_ALLOW_THREADS
4725
4726 if (fd == INVALID_SOCKET) {
4727 set_error();
4728 return -1;
4729 }
4730
4731 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4732 SOCKETCLOSE(fd);
4733 return -1;
4734 }
4735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004737 if (init_sockobject(s, fd, family, type, proto) == -1) {
4738 SOCKETCLOSE(fd);
4739 return -1;
4740 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004743
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004744}
4745
4746
Guido van Rossumb6775db1994-08-01 11:34:53 +00004747/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004748
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004749static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4751 "_socket.socket", /* tp_name */
4752 sizeof(PySocketSockObject), /* tp_basicsize */
4753 0, /* tp_itemsize */
4754 (destructor)sock_dealloc, /* tp_dealloc */
4755 0, /* tp_print */
4756 0, /* tp_getattr */
4757 0, /* tp_setattr */
4758 0, /* tp_reserved */
4759 (reprfunc)sock_repr, /* tp_repr */
4760 0, /* tp_as_number */
4761 0, /* tp_as_sequence */
4762 0, /* tp_as_mapping */
4763 0, /* tp_hash */
4764 0, /* tp_call */
4765 0, /* tp_str */
4766 PyObject_GenericGetAttr, /* tp_getattro */
4767 0, /* tp_setattro */
4768 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004769 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4770 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 sock_doc, /* tp_doc */
4772 0, /* tp_traverse */
4773 0, /* tp_clear */
4774 0, /* tp_richcompare */
4775 0, /* tp_weaklistoffset */
4776 0, /* tp_iter */
4777 0, /* tp_iternext */
4778 sock_methods, /* tp_methods */
4779 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004780 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 0, /* tp_base */
4782 0, /* tp_dict */
4783 0, /* tp_descr_get */
4784 0, /* tp_descr_set */
4785 0, /* tp_dictoffset */
4786 sock_initobj, /* tp_init */
4787 PyType_GenericAlloc, /* tp_alloc */
4788 sock_new, /* tp_new */
4789 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004790 0, /* tp_is_gc */
4791 0, /* tp_bases */
4792 0, /* tp_mro */
4793 0, /* tp_cache */
4794 0, /* tp_subclasses */
4795 0, /* tp_weaklist */
4796 0, /* tp_del */
4797 0, /* tp_version_tag */
4798 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004799};
4800
Guido van Rossum30a685f1991-06-27 15:51:29 +00004801
Guido van Rossum81194471991-07-27 21:42:02 +00004802/* Python interface to gethostname(). */
4803
4804/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004805static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004806socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004807{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004808#ifdef MS_WINDOWS
4809 /* Don't use winsock's gethostname, as this returns the ANSI
4810 version of the hostname, whereas we need a Unicode string.
4811 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004812 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004813 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004814 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004815 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004816
4817 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004818 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004819
4820 if (GetLastError() != ERROR_MORE_DATA)
4821 return PyErr_SetFromWindowsErr(0);
4822
4823 if (size == 0)
4824 return PyUnicode_New(0, 0);
4825
4826 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4827 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004828 name = PyMem_New(wchar_t, size);
4829 if (!name) {
4830 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004831 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004832 }
Victor Stinner74168972011-11-17 01:11:36 +01004833 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4834 name,
4835 &size))
4836 {
4837 PyMem_Free(name);
4838 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004839 }
Victor Stinner74168972011-11-17 01:11:36 +01004840
4841 result = PyUnicode_FromWideChar(name, size);
4842 PyMem_Free(name);
4843 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004844#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 char buf[1024];
4846 int res;
4847 Py_BEGIN_ALLOW_THREADS
4848 res = gethostname(buf, (int) sizeof buf - 1);
4849 Py_END_ALLOW_THREADS
4850 if (res < 0)
4851 return set_error();
4852 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004853 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004854#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004855}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004856
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004857PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004858"gethostname() -> string\n\
4859\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004860Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004861
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004862#ifdef HAVE_SETHOSTNAME
4863PyDoc_STRVAR(sethostname_doc,
4864"sethostname(name)\n\n\
4865Sets the hostname to name.");
4866
4867static PyObject *
4868socket_sethostname(PyObject *self, PyObject *args)
4869{
4870 PyObject *hnobj;
4871 Py_buffer buf;
4872 int res, flag = 0;
4873
Christian Heimesd2774c72013-06-19 02:06:29 +02004874#ifdef _AIX
4875/* issue #18259, not declared in any useful header file */
4876extern int sethostname(const char *, size_t);
4877#endif
4878
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004879 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4880 PyErr_Clear();
4881 if (!PyArg_ParseTuple(args, "O&:sethostname",
4882 PyUnicode_FSConverter, &hnobj))
4883 return NULL;
4884 flag = 1;
4885 }
4886 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4887 if (!res) {
4888 res = sethostname(buf.buf, buf.len);
4889 PyBuffer_Release(&buf);
4890 }
4891 if (flag)
4892 Py_DECREF(hnobj);
4893 if (res)
4894 return set_error();
4895 Py_RETURN_NONE;
4896}
4897#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004898
Guido van Rossum30a685f1991-06-27 15:51:29 +00004899/* Python interface to gethostbyname(name). */
4900
4901/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004902static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004903socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 char *name;
4906 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004907 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004908
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004909 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 return NULL;
4911 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004912 goto finally;
4913 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4914finally:
4915 PyMem_Free(name);
4916 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004917}
4918
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004919PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004920"gethostbyname(host) -> address\n\
4921\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004922Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004923
4924
Victor Stinner72400302016-01-28 15:41:01 +01004925static PyObject*
4926sock_decode_hostname(const char *name)
4927{
4928#ifdef MS_WINDOWS
4929 /* Issue #26227: gethostbyaddr() returns a string encoded
4930 * to the ANSI code page */
4931 return PyUnicode_DecodeFSDefault(name);
4932#else
4933 /* Decode from UTF-8 */
4934 return PyUnicode_FromString(name);
4935#endif
4936}
4937
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004938/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4939
4940static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004941gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 char **pch;
4944 PyObject *rtn_tuple = (PyObject *)NULL;
4945 PyObject *name_list = (PyObject *)NULL;
4946 PyObject *addr_list = (PyObject *)NULL;
4947 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004948 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 if (h == NULL) {
4951 /* Let's get real error message to return */
4952 set_herror(h_errno);
4953 return NULL;
4954 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 if (h->h_addrtype != af) {
4957 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004958 errno = EAFNOSUPPORT;
4959 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 return NULL;
4961 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 case AF_INET:
4966 if (alen < sizeof(struct sockaddr_in))
4967 return NULL;
4968 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004969
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004970#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 case AF_INET6:
4972 if (alen < sizeof(struct sockaddr_in6))
4973 return NULL;
4974 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004975#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 if ((name_list = PyList_New(0)) == NULL)
4980 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 if ((addr_list = PyList_New(0)) == NULL)
4983 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 /* SF #1511317: h_aliases can be NULL */
4986 if (h->h_aliases) {
4987 for (pch = h->h_aliases; *pch != NULL; pch++) {
4988 int status;
4989 tmp = PyUnicode_FromString(*pch);
4990 if (tmp == NULL)
4991 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 status = PyList_Append(name_list, tmp);
4994 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 if (status)
4997 goto err;
4998 }
4999 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5002 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 case AF_INET:
5007 {
5008 struct sockaddr_in sin;
5009 memset(&sin, 0, sizeof(sin));
5010 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005011#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5015 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 if (pch == h->h_addr_list && alen >= sizeof(sin))
5018 memcpy((char *) addr, &sin, sizeof(sin));
5019 break;
5020 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005021
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005022#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 case AF_INET6:
5024 {
5025 struct sockaddr_in6 sin6;
5026 memset(&sin6, 0, sizeof(sin6));
5027 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005028#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5032 tmp = makeipaddr((struct sockaddr *)&sin6,
5033 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5036 memcpy((char *) addr, &sin6, sizeof(sin6));
5037 break;
5038 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005039#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005042 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 "unsupported address family");
5044 return NULL;
5045 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 if (tmp == NULL)
5048 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 status = PyList_Append(addr_list, tmp);
5051 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 if (status)
5054 goto err;
5055 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005056
Victor Stinner72400302016-01-28 15:41:01 +01005057 name = sock_decode_hostname(h->h_name);
5058 if (name == NULL)
5059 goto err;
5060 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005061
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005062 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 Py_XDECREF(name_list);
5064 Py_XDECREF(addr_list);
5065 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005066}
5067
5068
5069/* Python interface to gethostbyname_ex(name). */
5070
5071/*ARGSUSED*/
5072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005073socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 char *name;
5076 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005077 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005079 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005080#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005082#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005084#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 char buf[16384];
5086 int buf_len = (sizeof buf) - 1;
5087 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005088#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005089#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005091#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005092#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005093
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005094 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005096 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005097 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005099#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005100#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005101 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005103#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005105#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 memset((void *) &data, '\0', sizeof(data));
5107 result = gethostbyname_r(name, &hp_allocated, &data);
5108 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005109#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005110#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005111#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005113#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005114 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005116#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 Py_END_ALLOW_THREADS
5118 /* Some C libraries would require addr.__ss_family instead of
5119 addr.ss_family.
5120 Therefore, we cast the sockaddr_storage into sockaddr to
5121 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005122 sa = SAS2SA(&addr);
5123 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005125#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005127#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005128finally:
5129 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005131}
5132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005133PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005134"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5135\n\
5136Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005137for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005138
5139
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005140/* Python interface to gethostbyaddr(IP). */
5141
5142/*ARGSUSED*/
5143static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005144socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005145{
Charles-François Natali8b759652011-12-23 16:44:51 +01005146 sock_addr_t addr;
5147 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 char *ip_num;
5149 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005150 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005151#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005153#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005155#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 /* glibcs up to 2.10 assume that the buf argument to
5157 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5158 does not ensure. The attribute below instructs the compiler
5159 to maintain this alignment. */
5160 char buf[16384] Py_ALIGNED(8);
5161 int buf_len = (sizeof buf) - 1;
5162 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005163#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005164#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005166#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005167#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 char *ap;
5169 int al;
5170 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005171
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005172 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 return NULL;
5174 af = AF_UNSPEC;
5175 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005176 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 af = sa->sa_family;
5178 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005179 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 switch (af) {
5181 case AF_INET:
5182 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5183 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5184 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005185#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 case AF_INET6:
5187 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5188 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5189 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005192 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005193 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 }
5195 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005196#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005197#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005198 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 &hp_allocated, buf, buf_len,
5200 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005201#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 h = gethostbyaddr_r(ap, al, af,
5203 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005204#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 memset((void *) &data, '\0', sizeof(data));
5206 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5207 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005208#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005209#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005210#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005212#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005213 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005215#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005217 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005218#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005220#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005221finally:
5222 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005224}
5225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005226PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005227"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5228\n\
5229Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005230for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005231
Guido van Rossum30a685f1991-06-27 15:51:29 +00005232
5233/* Python interface to getservbyname(name).
5234 This only returns the port number, since the other info is already
5235 known or not useful (like the list of aliases). */
5236
5237/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005239socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 char *name, *proto=NULL;
5242 struct servent *sp;
5243 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5244 return NULL;
5245 Py_BEGIN_ALLOW_THREADS
5246 sp = getservbyname(name, proto);
5247 Py_END_ALLOW_THREADS
5248 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005249 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 return NULL;
5251 }
5252 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005253}
5254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005255PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005256"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005257\n\
5258Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005259The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5260otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005261
Guido van Rossum30a685f1991-06-27 15:51:29 +00005262
Barry Warsaw11b91a02004-06-28 00:50:43 +00005263/* Python interface to getservbyport(port).
5264 This only returns the service name, since the other info is already
5265 known or not useful (like the list of aliases). */
5266
5267/*ARGSUSED*/
5268static PyObject *
5269socket_getservbyport(PyObject *self, PyObject *args)
5270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 int port;
5272 char *proto=NULL;
5273 struct servent *sp;
5274 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5275 return NULL;
5276 if (port < 0 || port > 0xffff) {
5277 PyErr_SetString(
5278 PyExc_OverflowError,
5279 "getservbyport: port must be 0-65535.");
5280 return NULL;
5281 }
5282 Py_BEGIN_ALLOW_THREADS
5283 sp = getservbyport(htons((short)port), proto);
5284 Py_END_ALLOW_THREADS
5285 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005286 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 return NULL;
5288 }
5289 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005290}
5291
5292PyDoc_STRVAR(getservbyport_doc,
5293"getservbyport(port[, protocolname]) -> string\n\
5294\n\
5295Return the service name from a port number and protocol name.\n\
5296The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5297otherwise any protocol will match.");
5298
Guido van Rossum3901d851996-12-19 16:35:04 +00005299/* Python interface to getprotobyname(name).
5300 This only returns the protocol number, since the other info is
5301 already known or not useful (like the list of aliases). */
5302
5303/*ARGSUSED*/
5304static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005305socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 char *name;
5308 struct protoent *sp;
5309 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5310 return NULL;
5311 Py_BEGIN_ALLOW_THREADS
5312 sp = getprotobyname(name);
5313 Py_END_ALLOW_THREADS
5314 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005315 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 return NULL;
5317 }
5318 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005319}
5320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005321PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005322"getprotobyname(name) -> integer\n\
5323\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005324Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005325
Guido van Rossum3901d851996-12-19 16:35:04 +00005326
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005327#ifndef NO_DUP
5328/* dup() function for socket fds */
5329
5330static PyObject *
5331socket_dup(PyObject *self, PyObject *fdobj)
5332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 SOCKET_T fd, newfd;
5334 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005335#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005336 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005337#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 fd = PyLong_AsSocket_t(fdobj);
5340 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5341 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005342
Victor Stinnerdaf45552013-08-28 00:53:59 +02005343#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005344 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005345 return set_error();
5346
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005347 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005348 FROM_PROTOCOL_INFO,
5349 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 if (newfd == INVALID_SOCKET)
5351 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005352
Victor Stinnerdaf45552013-08-28 00:53:59 +02005353 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5354 closesocket(newfd);
5355 PyErr_SetFromWindowsErr(0);
5356 return NULL;
5357 }
5358#else
5359 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5360 newfd = _Py_dup(fd);
5361 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005362 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005363#endif
5364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 newfdobj = PyLong_FromSocket_t(newfd);
5366 if (newfdobj == NULL)
5367 SOCKETCLOSE(newfd);
5368 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005369}
5370
5371PyDoc_STRVAR(dup_doc,
5372"dup(integer) -> integer\n\
5373\n\
5374Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5375sockets; on some platforms os.dup() won't work for socket file descriptors.");
5376#endif
5377
5378
Dave Cole331708b2004-08-09 04:51:41 +00005379#ifdef HAVE_SOCKETPAIR
5380/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005381 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005382 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005383
5384/*ARGSUSED*/
5385static PyObject *
5386socket_socketpair(PyObject *self, PyObject *args)
5387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 PySocketSockObject *s0 = NULL, *s1 = NULL;
5389 SOCKET_T sv[2];
5390 int family, type = SOCK_STREAM, proto = 0;
5391 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005392#ifdef SOCK_CLOEXEC
5393 int *atomic_flag_works = &sock_cloexec_works;
5394#else
5395 int *atomic_flag_works = NULL;
5396#endif
5397 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005398
5399#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005401#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5405 &family, &type, &proto))
5406 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005409 Py_BEGIN_ALLOW_THREADS
5410#ifdef SOCK_CLOEXEC
5411 if (sock_cloexec_works != 0) {
5412 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5413 if (sock_cloexec_works == -1) {
5414 if (ret >= 0) {
5415 sock_cloexec_works = 1;
5416 }
5417 else if (errno == EINVAL) {
5418 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5419 sock_cloexec_works = 0;
5420 ret = socketpair(family, type, proto, sv);
5421 }
5422 }
5423 }
5424 else
5425#endif
5426 {
5427 ret = socketpair(family, type, proto, sv);
5428 }
5429 Py_END_ALLOW_THREADS
5430
5431 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005433
5434 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5435 goto finally;
5436 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5437 goto finally;
5438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 s0 = new_sockobject(sv[0], family, type, proto);
5440 if (s0 == NULL)
5441 goto finally;
5442 s1 = new_sockobject(sv[1], family, type, proto);
5443 if (s1 == NULL)
5444 goto finally;
5445 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005446
5447finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 if (res == NULL) {
5449 if (s0 == NULL)
5450 SOCKETCLOSE(sv[0]);
5451 if (s1 == NULL)
5452 SOCKETCLOSE(sv[1]);
5453 }
5454 Py_XDECREF(s0);
5455 Py_XDECREF(s1);
5456 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005457}
5458
5459PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005460"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005461\n\
5462Create a pair of socket objects from the sockets returned by the platform\n\
5463socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005464The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005465AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005466
5467#endif /* HAVE_SOCKETPAIR */
5468
5469
Guido van Rossum006bf911996-06-12 04:04:55 +00005470static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005471socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005472{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005473 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005474
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005475 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 return NULL;
5477 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005478 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005480 "ntohs: can't convert negative Python int to C "
5481 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 return NULL;
5483 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005484 if (x > 0xffff) {
5485 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5486 "ntohs: Python int too large to convert to C "
5487 "16-bit unsigned integer (The silent truncation "
5488 "is deprecated)",
5489 1)) {
5490 return NULL;
5491 }
5492 }
5493 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005494}
5495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005496PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005497"ntohs(integer) -> integer\n\
5498\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005499Convert a 16-bit unsigned integer from network to host byte order.\n\
5500Note that in case the received integer does not fit in 16-bit unsigned\n\
5501integer, but does fit in a positive C int, it is silently truncated to\n\
550216-bit unsigned integer.\n\
5503However, this silent truncation feature is deprecated, and will raise an \n\
5504exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005505
5506
Guido van Rossum006bf911996-06-12 04:04:55 +00005507static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005508socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 if (PyLong_Check(arg)) {
5513 x = PyLong_AsUnsignedLong(arg);
5514 if (x == (unsigned long) -1 && PyErr_Occurred())
5515 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005516#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 {
5518 unsigned long y;
5519 /* only want the trailing 32 bits */
5520 y = x & 0xFFFFFFFFUL;
5521 if (y ^ x)
5522 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005523 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 x = y;
5525 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 }
5528 else
5529 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005530 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005533}
5534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005535PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005536"ntohl(integer) -> integer\n\
5537\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005538Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005539
5540
Guido van Rossum006bf911996-06-12 04:04:55 +00005541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005542socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005543{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005544 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005545
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005546 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 return NULL;
5548 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005549 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005551 "htons: can't convert negative Python int to C "
5552 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 return NULL;
5554 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005555 if (x > 0xffff) {
5556 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5557 "htons: Python int too large to convert to C "
5558 "16-bit unsigned integer (The silent truncation "
5559 "is deprecated)",
5560 1)) {
5561 return NULL;
5562 }
5563 }
5564 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005565}
5566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005567PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005568"htons(integer) -> integer\n\
5569\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005570Convert a 16-bit unsigned integer from host to network byte order.\n\
5571Note that in case the received integer does not fit in 16-bit unsigned\n\
5572integer, but does fit in a positive C int, it is silently truncated to\n\
557316-bit unsigned integer.\n\
5574However, this silent truncation feature is deprecated, and will raise an \n\
5575exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005576
5577
Guido van Rossum006bf911996-06-12 04:04:55 +00005578static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005579socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 if (PyLong_Check(arg)) {
5584 x = PyLong_AsUnsignedLong(arg);
5585 if (x == (unsigned long) -1 && PyErr_Occurred())
5586 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005587#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 {
5589 unsigned long y;
5590 /* only want the trailing 32 bits */
5591 y = x & 0xFFFFFFFFUL;
5592 if (y ^ x)
5593 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005594 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 x = y;
5596 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 }
5599 else
5600 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005601 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 Py_TYPE(arg)->tp_name);
5603 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005604}
5605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005606PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005607"htonl(integer) -> integer\n\
5608\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005609Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005610
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005611/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005613PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005614"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005615\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005616Convert 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 +00005617binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005618
5619static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005620socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005621{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005622#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005624#endif
5625
5626#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005627#if (SIZEOF_INT != 4)
5628#error "Not sure if in_addr_t exists and int is not 32-bits."
5629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 /* Have to use inet_addr() instead */
5631 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5636 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005637
Tim Peters1df9fdd2003-02-13 03:13:40 +00005638
5639#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005640
5641#ifdef USE_INET_ATON_WEAKLINK
5642 if (inet_aton != NULL) {
5643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 if (inet_aton(ip_addr, &buf))
5645 return PyBytes_FromStringAndSize((char *)(&buf),
5646 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005647
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005648 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 "illegal IP address string passed to inet_aton");
5650 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005651
Thomas Wouters477c8d52006-05-27 19:21:47 +00005652#ifdef USE_INET_ATON_WEAKLINK
5653 } else {
5654#endif
5655
5656#endif
5657
5658#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 /* special-case this address as inet_addr might return INADDR_NONE
5661 * for this */
5662 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005663 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005665
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005666 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005670 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 "illegal IP address string passed to inet_aton");
5672 return NULL;
5673 }
5674 }
5675 return PyBytes_FromStringAndSize((char *) &packed_addr,
5676 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005677
5678#ifdef USE_INET_ATON_WEAKLINK
5679 }
5680#endif
5681
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005682#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005683}
5684
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005685PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005686"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005687\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005688Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005689
5690static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005691socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005692{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005693 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005695
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005696 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 return NULL;
5698 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005699
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005700 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005701 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005703 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 return NULL;
5705 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005706
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005707 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5708 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005709
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005710 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005712}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005713
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005714#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005715
5716PyDoc_STRVAR(inet_pton_doc,
5717"inet_pton(af, ip) -> packed IP address string\n\
5718\n\
5719Convert an IP address from string format to a packed string suitable\n\
5720for use with low-level network functions.");
5721
5722static PyObject *
5723socket_inet_pton(PyObject *self, PyObject *args)
5724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 int af;
5726 char* ip;
5727 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005728#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005729 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005730#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5734 return NULL;
5735 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005736
Martin v. Löwis04697e82004-06-02 12:35:29 +00005737#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005739 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 "can't use AF_INET6, IPv6 is disabled");
5741 return NULL;
5742 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005743#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 retval = inet_pton(af, ip, packed);
5746 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005747 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 return NULL;
5749 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005750 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 "illegal IP address string passed to inet_pton");
5752 return NULL;
5753 } else if (af == AF_INET) {
5754 return PyBytes_FromStringAndSize(packed,
5755 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005756#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 } else if (af == AF_INET6) {
5758 return PyBytes_FromStringAndSize(packed,
5759 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005762 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 return NULL;
5764 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005765}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005766
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005767PyDoc_STRVAR(inet_ntop_doc,
5768"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5769\n\
5770Convert a packed IP address of the given family to string format.");
5771
5772static PyObject *
5773socket_inet_ntop(PyObject *self, PyObject *args)
5774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005776 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005778#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005779 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005780#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005782#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5785 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005786
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005787 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 return NULL;
5789 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005792 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 PyErr_SetString(PyExc_ValueError,
5794 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005795 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 return NULL;
5797 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005798#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005800 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 PyErr_SetString(PyExc_ValueError,
5802 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005803 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 return NULL;
5805 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 } else {
5808 PyErr_Format(PyExc_ValueError,
5809 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005810 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 return NULL;
5812 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005813
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005814 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5815 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005817 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 return NULL;
5819 } else {
5820 return PyUnicode_FromString(retval);
5821 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005822}
5823
5824#endif /* HAVE_INET_PTON */
5825
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005826/* Python interface to getaddrinfo(host, port). */
5827
5828/*ARGSUSED*/
5829static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005830socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005831{
Victor Stinner77af1722011-05-26 14:05:59 +02005832 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005833 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 struct addrinfo hints, *res;
5835 struct addrinfo *res0 = NULL;
5836 PyObject *hobj = NULL;
5837 PyObject *pobj = (PyObject *)NULL;
5838 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005839 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 int family, socktype, protocol, flags;
5841 int error;
5842 PyObject *all = (PyObject *)NULL;
5843 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005844
Georg Brandl6083a4b2013-10-14 06:51:46 +02005845 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005847 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005848 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 &protocol, &flags)) {
5850 return NULL;
5851 }
5852 if (hobj == Py_None) {
5853 hptr = NULL;
5854 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005855 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 if (!idna)
5857 return NULL;
5858 assert(PyBytes_Check(idna));
5859 hptr = PyBytes_AS_STRING(idna);
5860 } else if (PyBytes_Check(hobj)) {
5861 hptr = PyBytes_AsString(hobj);
5862 } else {
5863 PyErr_SetString(PyExc_TypeError,
5864 "getaddrinfo() argument 1 must be string or None");
5865 return NULL;
5866 }
5867 if (PyLong_CheckExact(pobj)) {
5868 long value = PyLong_AsLong(pobj);
5869 if (value == -1 && PyErr_Occurred())
5870 goto err;
5871 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5872 pptr = pbuf;
5873 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005874 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005875 if (pptr == NULL)
5876 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005878 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 } else if (pobj == Py_None) {
5880 pptr = (char *)NULL;
5881 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005882 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 goto err;
5884 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005885#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005886 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5887 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005888 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5889 * This workaround avoids a segfault in libsystem.
5890 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005891 pptr = "00";
5892 }
5893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 memset(&hints, 0, sizeof(hints));
5895 hints.ai_family = family;
5896 hints.ai_socktype = socktype;
5897 hints.ai_protocol = protocol;
5898 hints.ai_flags = flags;
5899 Py_BEGIN_ALLOW_THREADS
5900 ACQUIRE_GETADDRINFO_LOCK
5901 error = getaddrinfo(hptr, pptr, &hints, &res0);
5902 Py_END_ALLOW_THREADS
5903 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5904 if (error) {
5905 set_gaierror(error);
5906 goto err;
5907 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005908
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005909 all = PyList_New(0);
5910 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 goto err;
5912 for (res = res0; res; res = res->ai_next) {
5913 PyObject *single;
5914 PyObject *addr =
5915 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5916 if (addr == NULL)
5917 goto err;
5918 single = Py_BuildValue("iiisO", res->ai_family,
5919 res->ai_socktype, res->ai_protocol,
5920 res->ai_canonname ? res->ai_canonname : "",
5921 addr);
5922 Py_DECREF(addr);
5923 if (single == NULL)
5924 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 if (PyList_Append(all, single))
5927 goto err;
5928 Py_XDECREF(single);
5929 }
5930 Py_XDECREF(idna);
5931 if (res0)
5932 freeaddrinfo(res0);
5933 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005934 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 Py_XDECREF(all);
5936 Py_XDECREF(idna);
5937 if (res0)
5938 freeaddrinfo(res0);
5939 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005940}
5941
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005942PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005943"getaddrinfo(host, port [, family, type, proto, flags])\n\
5944 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005945\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005946Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005947
5948/* Python interface to getnameinfo(sa, flags). */
5949
5950/*ARGSUSED*/
5951static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005952socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 PyObject *sa = (PyObject *)NULL;
5955 int flags;
5956 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005957 int port;
5958 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5960 struct addrinfo hints, *res = NULL;
5961 int error;
5962 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005963 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 flags = flowinfo = scope_id = 0;
5966 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5967 return NULL;
5968 if (!PyTuple_Check(sa)) {
5969 PyErr_SetString(PyExc_TypeError,
5970 "getnameinfo() argument 1 must be a tuple");
5971 return NULL;
5972 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005973 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 &hostp, &port, &flowinfo, &scope_id))
5975 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005976 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005977 PyErr_SetString(PyExc_OverflowError,
5978 "getsockaddrarg: flowinfo must be 0-1048575.");
5979 return NULL;
5980 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5982 memset(&hints, 0, sizeof(hints));
5983 hints.ai_family = AF_UNSPEC;
5984 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005985 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 Py_BEGIN_ALLOW_THREADS
5987 ACQUIRE_GETADDRINFO_LOCK
5988 error = getaddrinfo(hostp, pbuf, &hints, &res);
5989 Py_END_ALLOW_THREADS
5990 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5991 if (error) {
5992 set_gaierror(error);
5993 goto fail;
5994 }
5995 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005996 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 "sockaddr resolved to multiple addresses");
5998 goto fail;
5999 }
6000 switch (res->ai_family) {
6001 case AF_INET:
6002 {
6003 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006004 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 "IPv4 sockaddr must be 2 tuple");
6006 goto fail;
6007 }
6008 break;
6009 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006010#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 case AF_INET6:
6012 {
6013 struct sockaddr_in6 *sin6;
6014 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006015 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 sin6->sin6_scope_id = scope_id;
6017 break;
6018 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006021 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6023 if (error) {
6024 set_gaierror(error);
6025 goto fail;
6026 }
Victor Stinner72400302016-01-28 15:41:01 +01006027
6028 name = sock_decode_hostname(hbuf);
6029 if (name == NULL)
6030 goto fail;
6031 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006032
6033fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 if (res)
6035 freeaddrinfo(res);
6036 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006037}
6038
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006039PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006040"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006041\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006042Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006043
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006044
6045/* Python API to getting and setting the default timeout value. */
6046
6047static PyObject *
6048socket_getdefaulttimeout(PyObject *self)
6049{
Victor Stinner71694d52015-03-28 01:18:54 +01006050 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006051 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 }
Victor Stinner71694d52015-03-28 01:18:54 +01006053 else {
6054 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6055 return PyFloat_FromDouble(seconds);
6056 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006057}
6058
6059PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006060"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006061\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006062Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006063A value of None indicates that new socket objects have no timeout.\n\
6064When the socket module is first imported, the default is None.");
6065
6066static PyObject *
6067socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6068{
Victor Stinner71694d52015-03-28 01:18:54 +01006069 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006070
Victor Stinner71694d52015-03-28 01:18:54 +01006071 if (socket_parse_timeout(&timeout, arg) < 0)
6072 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006075
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006076 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006077}
6078
6079PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006080"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006081\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006082Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006083A value of None indicates that new socket objects have no timeout.\n\
6084When the socket module is first imported, the default is None.");
6085
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006086#ifdef HAVE_IF_NAMEINDEX
6087/* Python API for getting interface indices and names */
6088
6089static PyObject *
6090socket_if_nameindex(PyObject *self, PyObject *arg)
6091{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006092 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006093 int i;
6094 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006095
Charles-François Natali60713592011-05-20 16:55:06 +02006096 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006097 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006098 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006099 return NULL;
6100 }
6101
6102 list = PyList_New(0);
6103 if (list == NULL) {
6104 if_freenameindex(ni);
6105 return NULL;
6106 }
6107
Charles-François Natali60713592011-05-20 16:55:06 +02006108 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6109 PyObject *ni_tuple = Py_BuildValue("IO&",
6110 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006111
6112 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6113 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006114 Py_DECREF(list);
6115 if_freenameindex(ni);
6116 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006117 }
6118 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006119 }
6120
6121 if_freenameindex(ni);
6122 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006123}
6124
6125PyDoc_STRVAR(if_nameindex_doc,
6126"if_nameindex()\n\
6127\n\
6128Returns a list of network interface information (index, name) tuples.");
6129
Charles-François Natali60713592011-05-20 16:55:06 +02006130static PyObject *
6131socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006132{
Charles-François Natali60713592011-05-20 16:55:06 +02006133 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006134 unsigned long index;
6135
Charles-François Natali60713592011-05-20 16:55:06 +02006136 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6137 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006138 return NULL;
6139
Charles-François Natali60713592011-05-20 16:55:06 +02006140 index = if_nametoindex(PyBytes_AS_STRING(oname));
6141 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006142 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006143 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006144 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006145 return NULL;
6146 }
6147
6148 return PyLong_FromUnsignedLong(index);
6149}
6150
6151PyDoc_STRVAR(if_nametoindex_doc,
6152"if_nametoindex(if_name)\n\
6153\n\
6154Returns the interface index corresponding to the interface name if_name.");
6155
Charles-François Natali60713592011-05-20 16:55:06 +02006156static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006157socket_if_indextoname(PyObject *self, PyObject *arg)
6158{
Charles-François Natali60713592011-05-20 16:55:06 +02006159 unsigned long index;
6160 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006161
Charles-François Natali60713592011-05-20 16:55:06 +02006162 index = PyLong_AsUnsignedLong(arg);
6163 if (index == (unsigned long) -1)
6164 return NULL;
6165
6166 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006167 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006168 return NULL;
6169 }
6170
Charles-François Natali60713592011-05-20 16:55:06 +02006171 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006172}
6173
6174PyDoc_STRVAR(if_indextoname_doc,
6175"if_indextoname(if_index)\n\
6176\n\
6177Returns the interface name corresponding to the interface index if_index.");
6178
6179#endif /* HAVE_IF_NAMEINDEX */
6180
6181
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006182#ifdef CMSG_LEN
6183/* Python interface to CMSG_LEN(length). */
6184
6185static PyObject *
6186socket_CMSG_LEN(PyObject *self, PyObject *args)
6187{
6188 Py_ssize_t length;
6189 size_t result;
6190
6191 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6192 return NULL;
6193 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6194 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6195 return NULL;
6196 }
6197 return PyLong_FromSize_t(result);
6198}
6199
6200PyDoc_STRVAR(CMSG_LEN_doc,
6201"CMSG_LEN(length) -> control message length\n\
6202\n\
6203Return the total length, without trailing padding, of an ancillary\n\
6204data item with associated data of the given length. This value can\n\
6205often be used as the buffer size for recvmsg() to receive a single\n\
6206item of ancillary data, but RFC 3542 requires portable applications to\n\
6207use CMSG_SPACE() and thus include space for padding, even when the\n\
6208item will be the last in the buffer. Raises OverflowError if length\n\
6209is outside the permissible range of values.");
6210
6211
6212#ifdef CMSG_SPACE
6213/* Python interface to CMSG_SPACE(length). */
6214
6215static PyObject *
6216socket_CMSG_SPACE(PyObject *self, PyObject *args)
6217{
6218 Py_ssize_t length;
6219 size_t result;
6220
6221 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6222 return NULL;
6223 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6224 PyErr_SetString(PyExc_OverflowError,
6225 "CMSG_SPACE() argument out of range");
6226 return NULL;
6227 }
6228 return PyLong_FromSize_t(result);
6229}
6230
6231PyDoc_STRVAR(CMSG_SPACE_doc,
6232"CMSG_SPACE(length) -> buffer size\n\
6233\n\
6234Return the buffer size needed for recvmsg() to receive an ancillary\n\
6235data item with associated data of the given length, along with any\n\
6236trailing padding. The buffer space needed to receive multiple items\n\
6237is the sum of the CMSG_SPACE() values for their associated data\n\
6238lengths. Raises OverflowError if length is outside the permissible\n\
6239range of values.");
6240#endif /* CMSG_SPACE */
6241#endif /* CMSG_LEN */
6242
6243
Guido van Rossum30a685f1991-06-27 15:51:29 +00006244/* List of functions exported by this module. */
6245
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006246static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 {"gethostbyname", socket_gethostbyname,
6248 METH_VARARGS, gethostbyname_doc},
6249 {"gethostbyname_ex", socket_gethostbyname_ex,
6250 METH_VARARGS, ghbn_ex_doc},
6251 {"gethostbyaddr", socket_gethostbyaddr,
6252 METH_VARARGS, gethostbyaddr_doc},
6253 {"gethostname", socket_gethostname,
6254 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006255#ifdef HAVE_SETHOSTNAME
6256 {"sethostname", socket_sethostname,
6257 METH_VARARGS, sethostname_doc},
6258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 {"getservbyname", socket_getservbyname,
6260 METH_VARARGS, getservbyname_doc},
6261 {"getservbyport", socket_getservbyport,
6262 METH_VARARGS, getservbyport_doc},
6263 {"getprotobyname", socket_getprotobyname,
6264 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006265#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 {"dup", socket_dup,
6267 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006268#endif
Dave Cole331708b2004-08-09 04:51:41 +00006269#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 {"socketpair", socket_socketpair,
6271 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 {"ntohs", socket_ntohs,
6274 METH_VARARGS, ntohs_doc},
6275 {"ntohl", socket_ntohl,
6276 METH_O, ntohl_doc},
6277 {"htons", socket_htons,
6278 METH_VARARGS, htons_doc},
6279 {"htonl", socket_htonl,
6280 METH_O, htonl_doc},
6281 {"inet_aton", socket_inet_aton,
6282 METH_VARARGS, inet_aton_doc},
6283 {"inet_ntoa", socket_inet_ntoa,
6284 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006285#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 {"inet_pton", socket_inet_pton,
6287 METH_VARARGS, inet_pton_doc},
6288 {"inet_ntop", socket_inet_ntop,
6289 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006290#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006291 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6292 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 {"getnameinfo", socket_getnameinfo,
6294 METH_VARARGS, getnameinfo_doc},
6295 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6296 METH_NOARGS, getdefaulttimeout_doc},
6297 {"setdefaulttimeout", socket_setdefaulttimeout,
6298 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006299#ifdef HAVE_IF_NAMEINDEX
6300 {"if_nameindex", socket_if_nameindex,
6301 METH_NOARGS, if_nameindex_doc},
6302 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006303 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006304 {"if_indextoname", socket_if_indextoname,
6305 METH_O, if_indextoname_doc},
6306#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006307#ifdef CMSG_LEN
6308 {"CMSG_LEN", socket_CMSG_LEN,
6309 METH_VARARGS, CMSG_LEN_doc},
6310#ifdef CMSG_SPACE
6311 {"CMSG_SPACE", socket_CMSG_SPACE,
6312 METH_VARARGS, CMSG_SPACE_doc},
6313#endif
6314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006316};
6317
Guido van Rossum30a685f1991-06-27 15:51:29 +00006318
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006319#ifdef MS_WINDOWS
6320#define OS_INIT_DEFINED
6321
6322/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006323
6324static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006325os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006328}
6329
6330static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006331os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 WSADATA WSAData;
6334 int ret;
6335 ret = WSAStartup(0x0101, &WSAData);
6336 switch (ret) {
6337 case 0: /* No error */
6338 Py_AtExit(os_cleanup);
6339 return 1; /* Success */
6340 case WSASYSNOTREADY:
6341 PyErr_SetString(PyExc_ImportError,
6342 "WSAStartup failed: network not ready");
6343 break;
6344 case WSAVERNOTSUPPORTED:
6345 case WSAEINVAL:
6346 PyErr_SetString(
6347 PyExc_ImportError,
6348 "WSAStartup failed: requested version not supported");
6349 break;
6350 default:
6351 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6352 break;
6353 }
6354 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006355}
6356
Guido van Rossum8d665e61996-06-26 18:22:49 +00006357#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006358
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006359
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006360
6361#ifndef OS_INIT_DEFINED
6362static int
6363os_init(void)
6364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006366}
6367#endif
6368
6369
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006370/* C API table - always add new things to the end for binary
6371 compatibility. */
6372static
6373PySocketModule_APIObject PySocketModuleAPI =
6374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006376 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006378};
6379
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006380
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006381/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006382
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006383 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006384 "socket.py" which implements some additional functionality.
6385 The import of "_socket" may fail with an ImportError exception if
6386 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006387 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006388 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006389*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006391PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006392"Implementation module for socket operations.\n\
6393\n\
6394See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006395
Martin v. Löwis1a214512008-06-11 05:26:20 +00006396static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 PyModuleDef_HEAD_INIT,
6398 PySocket_MODULE_NAME,
6399 socket_doc,
6400 -1,
6401 socket_methods,
6402 NULL,
6403 NULL,
6404 NULL,
6405 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006406};
6407
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006408PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006409PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 if (!os_init())
6414 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006415
Victor Stinnerdaf45552013-08-28 00:53:59 +02006416#ifdef MS_WINDOWS
6417 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006418#if defined(_MSC_VER) && _MSC_VER >= 1800
6419 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6420#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006421 DWORD version = GetVersion();
6422 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6423 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6424 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006425 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6426#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006427 }
6428#endif
6429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 Py_TYPE(&sock_type) = &PyType_Type;
6431 m = PyModule_Create(&socketmodule);
6432 if (m == NULL)
6433 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006434
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006435 Py_INCREF(PyExc_OSError);
6436 PySocketModuleAPI.error = PyExc_OSError;
6437 Py_INCREF(PyExc_OSError);
6438 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006440 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 if (socket_herror == NULL)
6442 return NULL;
6443 Py_INCREF(socket_herror);
6444 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006445 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 NULL);
6447 if (socket_gaierror == NULL)
6448 return NULL;
6449 Py_INCREF(socket_gaierror);
6450 PyModule_AddObject(m, "gaierror", socket_gaierror);
6451 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006452 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 if (socket_timeout == NULL)
6454 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006455 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 Py_INCREF(socket_timeout);
6457 PyModule_AddObject(m, "timeout", socket_timeout);
6458 Py_INCREF((PyObject *)&sock_type);
6459 if (PyModule_AddObject(m, "SocketType",
6460 (PyObject *)&sock_type) != 0)
6461 return NULL;
6462 Py_INCREF((PyObject *)&sock_type);
6463 if (PyModule_AddObject(m, "socket",
6464 (PyObject *)&sock_type) != 0)
6465 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006466
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006467#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 Py_INCREF(has_ipv6);
6473 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 /* Export C API */
6476 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6477 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6478 ) != 0)
6479 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006482#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006484#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006486#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006488#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006489#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006492#endif
6493#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006495#endif
6496#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006499#endif
6500#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006503#endif
6504#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006507#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006508#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006511#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006512#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006515#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006516#ifdef HAVE_SOCKADDR_ALG
6517 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6518#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006519#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006522#endif
6523#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006525#endif
6526#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006529#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006530#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006533#endif
6534#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006535 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006537#endif
6538#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006541#endif
6542#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006545#endif
6546#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, AF_NETLINK);
6549 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006550#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006551 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006552#endif
6553#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006554 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006555#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6557 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006558#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006560#endif
6561#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006563#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006564#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006566#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006567#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006569#endif
6570#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006572#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006574#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006576#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006577#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006579#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006580#ifdef NETLINK_CRYPTO
6581 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6582#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006583#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006584#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006587#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006588#ifdef AF_LINK
6589 PyModule_AddIntMacro(m, AF_LINK);
6590#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006591#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006594#endif
6595#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006598#endif
6599#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006602#endif
6603#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006606#endif
6607#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006610#endif
6611#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006614#endif
6615#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006618#endif
6619#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006622#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006623
Hye-Shik Chang81268602004-02-02 06:05:24 +00006624#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6626 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6627 PyModule_AddIntMacro(m, BTPROTO_HCI);
6628 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006629#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006631#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006632#if !defined(__FreeBSD__)
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_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006635#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6637 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006638#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6641 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006642#endif
6643
Charles-François Natali47413c12011-10-06 19:47:44 +02006644#ifdef AF_CAN
6645 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006647#endif
6648#ifdef PF_CAN
6649 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006651#endif
6652
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006653/* Reliable Datagram Sockets */
6654#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006656#endif
6657#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006659#endif
6660
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006661/* Kernel event messages */
6662#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006664#endif
6665#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006667#endif
6668
Antoine Pitroub156a462010-10-27 20:13:57 +00006669#ifdef AF_PACKET
6670 PyModule_AddIntMacro(m, AF_PACKET);
6671#endif
6672#ifdef PF_PACKET
6673 PyModule_AddIntMacro(m, PF_PACKET);
6674#endif
6675#ifdef PACKET_HOST
6676 PyModule_AddIntMacro(m, PACKET_HOST);
6677#endif
6678#ifdef PACKET_BROADCAST
6679 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6680#endif
6681#ifdef PACKET_MULTICAST
6682 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6683#endif
6684#ifdef PACKET_OTHERHOST
6685 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6686#endif
6687#ifdef PACKET_OUTGOING
6688 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6689#endif
6690#ifdef PACKET_LOOPBACK
6691 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6692#endif
6693#ifdef PACKET_FASTROUTE
6694 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006695#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006696
Christian Heimes043d6f62008-01-07 17:19:16 +00006697#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006700 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6702 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6703 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006704
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6706 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6707 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006709 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, SOL_TIPC);
6711 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6712 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6713 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6714 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006715
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6717 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6718 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6719 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6723 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006724#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006727#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6729 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6730 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6731 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6732 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6733 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006734#endif
6735
Christian Heimesdffa3942016-09-05 23:54:41 +02006736#ifdef HAVE_SOCKADDR_ALG
6737 /* Socket options */
6738 PyModule_AddIntMacro(m, ALG_SET_KEY);
6739 PyModule_AddIntMacro(m, ALG_SET_IV);
6740 PyModule_AddIntMacro(m, ALG_SET_OP);
6741 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6742 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6743 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6744
6745 /* Operations */
6746 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6747 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6748 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6749 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6750#endif
6751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, SOCK_STREAM);
6754 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006755/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006756#ifdef SOCK_RAW
6757 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006759#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006761#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006763#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006764#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006766#endif
6767#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006769#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006771#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006779#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006780#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006782#endif
6783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006801#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006802#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006805#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006825#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006831#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006833#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006834#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006836#endif
6837#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006839#endif
6840#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006842#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006843#ifdef SO_PASSSEC
6844 PyModule_AddIntMacro(m, SO_PASSSEC);
6845#endif
6846#ifdef SO_PEERSEC
6847 PyModule_AddIntMacro(m, SO_PEERSEC);
6848#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006849#ifdef SO_BINDTODEVICE
6850 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6851#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006852#ifdef SO_PRIORITY
6853 PyModule_AddIntMacro(m, SO_PRIORITY);
6854#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006855#ifdef SO_MARK
6856 PyModule_AddIntMacro(m, SO_MARK);
6857#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006858#ifdef SO_DOMAIN
6859 PyModule_AddIntMacro(m, SO_DOMAIN);
6860#endif
6861#ifdef SO_PROTOCOL
6862 PyModule_AddIntMacro(m, SO_PROTOCOL);
6863#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865 /* Maximum number of connections for "listen" */
6866#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006868#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006870#endif
6871
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006872 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006873#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006875#endif
6876#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006878#endif
6879#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006881#endif
6882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883 /* Flags for send, recv */
6884#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006905#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006908#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006911#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006913#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006914#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006916#endif
6917#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006919#endif
6920#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006922#endif
6923#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006925#endif
6926#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006928#endif
6929#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006931#endif
6932#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006934#endif
6935#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006937#endif
6938#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006940#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006941#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006943#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 /* Protocol level and numbers, usable for [gs]etsockopt */
6946#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006951#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006971#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006976#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006978#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006979#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006981#endif
6982#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6984 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006985#endif
6986#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6988 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6989 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006990
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6992 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6993 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006994#endif
6995#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6997 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6998 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6999 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007000#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007001#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7002 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7003#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007004#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007006 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7007 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7008 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7009 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7010 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7011 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7012 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7013 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7014 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7015 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7016 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7017 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7018#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007019#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007021#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007022#ifdef HAVE_SOCKADDR_ALG
7023 PyModule_AddIntMacro(m, SOL_ALG);
7024#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007025#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007027#endif
7028#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007030#endif
7031#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007033#endif
7034#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007036#endif
7037#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007039#endif
7040#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007045#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007053#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007068#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007071#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007073#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007074 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007075#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007076#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007082#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007084#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007087#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007093#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007094 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007096#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007135#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007143#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007144#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007148 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007149#endif
7150/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007158#endif
7159
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007160#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007162#endif
7163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 /* Some port configuration */
7165#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007167#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007172#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007173 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
7175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007176 /* Some reserved IP v.4 addresses */
7177#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007179#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007182#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007184#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007189#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197#ifdef INADDR_ALLHOSTS_GROUP
7198 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7199 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007200#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007205#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007210#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007212#endif
7213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 /* IPv4 [gs]etsockopt options */
7215#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007262#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007263#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007265#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7268#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007277#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007286 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007287#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007291#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007293#endif
7294#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007296#endif
7297#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007299#endif
7300#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007302#endif
7303#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007305#endif
7306#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007308#endif
7309#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007311#endif
7312#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007314#endif
7315#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007317#endif
7318#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007320#endif
7321#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007323#endif
7324#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007326#endif
7327#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007329#endif
7330#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007332#endif
7333#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007335#endif
7336#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007338#endif
7339#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007341#endif
7342#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007344#endif
7345#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007347#endif
7348#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007350#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352 /* TCP options */
7353#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007388#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007389#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007391#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007392#ifdef TCP_CONGESTION
7393 PyModule_AddIntMacro(m, TCP_CONGESTION);
7394#endif
7395#ifdef TCP_USER_TIMEOUT
7396 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7397#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007398#ifdef TCP_NOTSENT_LOWAT
7399 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7400#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402 /* IPX options */
7403#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007405#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007406
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007407/* Reliable Datagram Sockets */
7408#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007410#endif
7411#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007413#endif
7414#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007416#endif
7417#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007419#endif
7420#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007422#endif
7423#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007425#endif
7426#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007428#endif
7429#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007431#endif
7432#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007434#endif
7435#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007437#endif
7438#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007440#endif
7441#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007443#endif
7444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007446#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007448#endif
7449#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007451#endif
7452#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007454#endif
7455#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007457#endif
7458#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007460#endif
7461#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007463#endif
7464#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007466#endif
7467#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007469#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007472#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007473#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007475#endif
7476#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007478#endif
7479#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007481#endif
7482#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007484#endif
7485#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007487#endif
7488#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007490#endif
7491#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007493#endif
7494#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007496#endif
7497#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007499#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007500#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007502#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007503#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007505#endif
7506#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007508#endif
7509#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007511#endif
7512#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007514#endif
7515#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007517#endif
7518#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007520#endif
7521#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007523#endif
7524#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007526#endif
7527#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007529#endif
7530#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007532#endif
7533#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007535#endif
7536#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007538#endif
7539#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007541#endif
7542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007543 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007544#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007546#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007550#endif
7551#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007553#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007554 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007555#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007557#endif
7558#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007560#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007562#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007563 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007564#endif
7565
Christian Heimesfaf2f632008-01-06 16:59:19 +00007566#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007568 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7569#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007570 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007571#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007572 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007573 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7574#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007575 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007576#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007577 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007579 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580 PyObject *tmp;
7581 tmp = PyLong_FromUnsignedLong(codes[i]);
7582 if (tmp == NULL)
7583 return NULL;
7584 PyModule_AddObject(m, names[i], tmp);
7585 }
7586 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, RCVALL_OFF);
7588 PyModule_AddIntMacro(m, RCVALL_ON);
7589 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007590#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007592#endif
7593#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007595#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007596#endif /* _MSTCPIP_ */
7597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007599#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007603}