blob: 8d0f9e6df8a718884f379703323d8d95e4dddba8 [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
Christian Heimesdffa3942016-09-05 23:54:41 +0200291#ifdef HAVE_SOCKADDR_ALG
292#include <linux/if_alg.h>
293#ifndef AF_ALG
294#define AF_ALG 38
295#endif
296#ifndef SOL_ALG
297#define SOL_ALG 279
298#endif
299
300/* Linux 3.19 */
301#ifndef ALG_SET_AEAD_ASSOCLEN
302#define ALG_SET_AEAD_ASSOCLEN 4
303#endif
304#ifndef ALG_SET_AEAD_AUTHSIZE
305#define ALG_SET_AEAD_AUTHSIZE 5
306#endif
307/* Linux 4.8 */
308#ifndef ALG_SET_PUBKEY
309#define ALG_SET_PUBKEY 6
310#endif
311
312#ifndef ALG_OP_SIGN
313#define ALG_OP_SIGN 2
314#endif
315#ifndef ALG_OP_VERIFY
316#define ALG_OP_VERIFY 3
317#endif
318
319#endif /* HAVE_SOCKADDR_ALG */
320
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000321/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000322#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000323#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000324
325/* Addressing includes */
326
Guido van Rossum6f489d91996-06-28 20:15:15 +0000327#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000328
329/* Non-MS WINDOWS includes */
330# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000331# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000332
Guido van Rossum9376b741999-09-15 22:01:40 +0000333/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000334# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000335
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000336# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000337
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000338#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000339
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000340/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000341# ifdef HAVE_FCNTL_H
342# include <fcntl.h>
343# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000344
Steve Dower65e4cb12014-11-22 12:54:57 -0800345#if defined(_MSC_VER) && _MSC_VER >= 1800
346/* Provides the IsWindows7SP1OrGreater() function */
347#include <VersionHelpers.h>
348#endif
349
Jeremy Hylton22308652001-02-02 03:23:09 +0000350#endif
351
Skip Montanaro7befb992004-02-10 16:50:21 +0000352#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000353
Neal Norwitz39d22e52002-11-02 19:55:21 +0000354#ifndef O_NONBLOCK
355# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000356#endif
357
Trent Micka708d6e2004-09-07 17:48:26 +0000358/* include Python's addrinfo.h unless it causes trouble */
359#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
360 /* Do not include addinfo.h on some newer IRIX versions.
361 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
362 * for example, but not by 6.5.10.
363 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000364#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000365 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
366 * EAI_* constants are defined in (the already included) ws2tcpip.h.
367 */
368#else
369# include "addrinfo.h"
370#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000371
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000372#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000373#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000374int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000375const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000376#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000377#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000378
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000379#ifdef __APPLE__
380/* On OS X, getaddrinfo returns no error indication of lookup
381 failure, so we must use the emulation instead of the libinfo
382 implementation. Unfortunately, performing an autoconf test
383 for this bug would require DNS access for the machine performing
384 the configuration, which is not acceptable. Therefore, we
385 determine the bug just by checking for __APPLE__. If this bug
386 gets ever fixed, perhaps checking for sys/version.h would be
387 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000388#ifndef HAVE_GETNAMEINFO
389/* This bug seems to be fixed in Jaguar. Ths easiest way I could
390 Find to check for Jaguar is that it has getnameinfo(), which
391 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000392#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000393#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000394
395#ifdef HAVE_INET_ATON
396#define USE_INET_ATON_WEAKLINK
397#endif
398
Jack Jansen84262fb2002-07-02 14:40:42 +0000399#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000400
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000401/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000402#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000403/* avoid clashes with the C library definition of the symbol. */
404#define getaddrinfo fake_getaddrinfo
405#define gai_strerror fake_gai_strerror
406#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000407#include "getaddrinfo.c"
408#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000409#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000410#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000411#include "getnameinfo.c"
412#endif
413
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000414#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000415#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000416#endif
417
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000418#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000419#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000420#define EAFNOSUPPORT WSAEAFNOSUPPORT
421#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000422#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000423
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000424#ifndef SOCKETCLOSE
425#define SOCKETCLOSE close
426#endif
427
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000428#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000429#define USE_BLUETOOTH 1
430#if defined(__FreeBSD__)
431#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
432#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000433#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000434#define SOL_HCI SOL_HCI_RAW
435#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000436#define sockaddr_l2 sockaddr_l2cap
437#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000438#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000439#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
440#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000441#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000442#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000443#define sockaddr_l2 sockaddr_bt
444#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000445#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000446#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000447#define SOL_HCI BTPROTO_HCI
448#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000449#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
450#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000451#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000453#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000454#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
455#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000456#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000457#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
458#endif
459#endif
460
Charles-François Natali8b759652011-12-23 16:44:51 +0100461/* Convert "sock_addr_t *" to "struct sockaddr *". */
462#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000463
Martin v. Löwise9416172003-05-03 10:12:45 +0000464/*
465 * Constants for getnameinfo()
466 */
467#if !defined(NI_MAXHOST)
468#define NI_MAXHOST 1025
469#endif
470#if !defined(NI_MAXSERV)
471#define NI_MAXSERV 32
472#endif
473
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000474#ifndef INVALID_SOCKET /* MS defines this */
475#define INVALID_SOCKET (-1)
476#endif
477
Charles-François Natali0cc86852013-09-13 19:53:08 +0200478#ifndef INADDR_NONE
479#define INADDR_NONE (-1)
480#endif
481
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000482/* XXX There's a problem here: *static* functions are not supposed to have
483 a Py prefix (or use CapitalizedWords). Later... */
484
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485/* Global variable holding the exception type for errors detected
486 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000487static PyObject *socket_herror;
488static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000489static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Tim Peters643a7fc2002-02-17 04:13:21 +0000491/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492 The sock_type variable contains pointers to various functions,
493 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000494 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000495static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000496
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000497#if defined(HAVE_POLL_H)
498#include <poll.h>
499#elif defined(HAVE_SYS_POLL_H)
500#include <sys/poll.h>
501#endif
502
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000503/* Largest value to try to store in a socklen_t (used when handling
504 ancillary data). POSIX requires socklen_t to hold at least
505 (2**31)-1 and recommends against storing larger values, but
506 socklen_t was originally int in the BSD interface, so to be on the
507 safe side we use the smaller of (2**31)-1 and INT_MAX. */
508#if INT_MAX > 0x7fffffff
509#define SOCKLEN_T_LIMIT 0x7fffffff
510#else
511#define SOCKLEN_T_LIMIT INT_MAX
512#endif
513
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200514#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000515/* Instead of select(), we'll use poll() since poll() works on any fd. */
516#define IS_SELECTABLE(s) 1
517/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000518#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200519/* If there's no timeout left, we don't have to call select, so it's a safe,
520 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100521#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000522#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000523
524static PyObject*
525select_error(void)
526{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200527 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000529}
530
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000531#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000532#ifndef WSAEAGAIN
533#define WSAEAGAIN WSAEWOULDBLOCK
534#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000535#define CHECK_ERRNO(expected) \
536 (WSAGetLastError() == WSA ## expected)
537#else
538#define CHECK_ERRNO(expected) \
539 (errno == expected)
540#endif
541
Victor Stinnerdaf45552013-08-28 00:53:59 +0200542#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200543# define GET_SOCK_ERROR WSAGetLastError()
544# define SET_SOCK_ERROR(err) WSASetLastError(err)
545# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
546# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
547#else
548# define GET_SOCK_ERROR errno
549# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
550# define SOCK_TIMEOUT_ERR EWOULDBLOCK
551# define SOCK_INPROGRESS_ERR EINPROGRESS
552#endif
553
554
555#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200556/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
557static int support_wsa_no_inherit = -1;
558#endif
559
Guido van Rossum30a685f1991-06-27 15:51:29 +0000560/* Convenience function to raise an error according to errno
561 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562
Guido van Rossum73624e91994-10-10 17:59:00 +0000563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000566#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 int err_no = WSAGetLastError();
568 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
569 recognizes the error codes used by both GetLastError() and
570 WSAGetLastError */
571 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200572 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000573#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000574
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200575 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000576}
577
Guido van Rossum30a685f1991-06-27 15:51:29 +0000578
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000580set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583
584#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 if (v != NULL) {
590 PyErr_SetObject(socket_herror, v);
591 Py_DECREF(v);
592 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000595}
596
597
598static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000599set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000602
Martin v. Löwis272cb402002-03-01 08:31:07 +0000603#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 /* EAI_SYSTEM is not available on Windows XP. */
605 if (error == EAI_SYSTEM)
606 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000607#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000608
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 if (v != NULL) {
615 PyErr_SetObject(socket_gaierror, v);
616 Py_DECREF(v);
617 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620}
621
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000622/* Function to perform the setting of socket blocking mode
623 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624static int
625internal_setblocking(PySocketSockObject *s, int block)
626{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400627 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200628#ifdef MS_WINDOWS
629 u_long arg;
630#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100631#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100632 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100633 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000635#ifdef SOCK_NONBLOCK
636 if (block)
637 s->sock_type &= (~SOCK_NONBLOCK);
638 else
639 s->sock_type |= SOCK_NONBLOCK;
640#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100644#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200646 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400647 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100648#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200650 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400651 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100653 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 else
Victor Stinner9a954832013-12-04 00:41:24 +0100655 new_delay_flag = delay_flag | O_NONBLOCK;
656 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200657 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400658 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100659#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200661 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200662 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400663 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000664#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400665
666 result = 0;
667
668 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000669 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671
Yury Selivanovfa22b292016-10-18 16:03:52 -0400672 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200673#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400674 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200675#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400676 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200677#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400678 }
679
680 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000681}
682
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000683static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200684internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
685 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100688#ifdef HAVE_POLL
689 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200690 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100691#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200693 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100694#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000695
Victor Stinnerb7df3142015-03-27 22:59:32 +0100696#ifdef WITH_THREAD
697 /* must be called with the GIL held */
698 assert(PyGILState_Check());
699#endif
700
Victor Stinner416f2e62015-03-31 13:56:29 +0200701 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200702 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200705 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 /* Prefer poll, if available, since you can poll() any fd
709 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000710#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100711 pollfd.fd = s->sock_fd;
712 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200713 if (connect) {
714 /* On Windows, the socket becomes writable on connection success,
715 but a connection failure is notified as an error. On POSIX, the
716 socket becomes writable on connection success or on connection
717 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200718 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200719 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000720
Victor Stinner71694d52015-03-28 01:18:54 +0100721 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200722 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200723 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000724
Victor Stinner71694d52015-03-28 01:18:54 +0100725 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200726 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100727 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000728#else
Victor Stinnerced11742015-04-09 10:27:25 +0200729 if (interval >= 0) {
730 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
731 tvp = &tv;
732 }
733 else
734 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000735
Victor Stinner71694d52015-03-28 01:18:54 +0100736 FD_ZERO(&fds);
737 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200738 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200739 if (connect) {
740 /* On Windows, the socket becomes writable on connection success,
741 but a connection failure is notified as an error. On POSIX, the
742 socket becomes writable on connection success or on connection
743 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200744 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200745 }
Victor Stinner71694d52015-03-28 01:18:54 +0100746
747 /* See if the socket is ready */
748 Py_BEGIN_ALLOW_THREADS;
749 if (writing)
750 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200751 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100752 else
753 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200754 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100755 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000756#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 if (n < 0)
759 return -1;
760 if (n == 0)
761 return 1;
762 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000763}
764
Victor Stinner31bf2d52015-04-01 21:57:09 +0200765/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000766
Victor Stinner81c41db2015-04-02 11:50:57 +0200767 On error, raise an exception and return -1 if err is set, or fill err and
768 return -1 otherwise. If a signal was received and the signal handler raised
769 an exception, return -1, and set err to -1 if err is set.
770
771 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100772
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773 If the socket has a timeout, wait until the socket is ready before calling
774 the function: wait until the socket is writable if writing is nonzero, wait
775 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100776
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200778 the function, except if the signal handler raised an exception (PEP 475).
779
780 When the function is retried, recompute the timeout using a monotonic clock.
781
Victor Stinner81c41db2015-04-02 11:50:57 +0200782 sock_call_ex() must be called with the GIL held. The socket function is
783 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200785sock_call_ex(PySocketSockObject *s,
786 int writing,
787 int (*sock_func) (PySocketSockObject *s, void *data),
788 void *data,
789 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200790 int *err,
791 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792{
Victor Stinner8912d142015-04-06 23:16:34 +0200793 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200794 _PyTime_t deadline = 0;
795 int deadline_initialized = 0;
796 int res;
797
Victor Stinner92f01132015-10-11 09:54:42 +0200798#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200799 /* sock_call() must be called with the GIL held. */
800 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200801#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200802
803 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200804 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 /* For connect(), poll even for blocking socket. The connection
807 runs asynchronously. */
808 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200809 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200810 _PyTime_t interval;
811
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 if (deadline_initialized) {
813 /* recompute the timeout */
814 interval = deadline - _PyTime_GetMonotonicClock();
815 }
816 else {
817 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200818 deadline = _PyTime_GetMonotonicClock() + timeout;
819 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200821
Victor Stinner10550cd2015-04-03 13:22:27 +0200822 if (interval >= 0)
823 res = internal_select(s, writing, interval, connect);
824 else
825 res = 1;
826 }
827 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200828 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200829 }
830
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 if (err)
833 *err = GET_SOCK_ERROR;
834
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835 if (CHECK_ERRNO(EINTR)) {
836 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200837 if (PyErr_CheckSignals()) {
838 if (err)
839 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842
843 /* retry select() */
844 continue;
845 }
846
847 /* select() failed */
848 s->errorhandler();
849 return -1;
850 }
851
852 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 if (err)
854 *err = SOCK_TIMEOUT_ERR;
855 else
856 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200857 return -1;
858 }
859
860 /* the socket is ready */
861 }
862
Victor Stinner81c41db2015-04-02 11:50:57 +0200863 /* inner loop to retry sock_func() when sock_func() is interrupted
864 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200865 while (1) {
866 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200867 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200868 Py_END_ALLOW_THREADS
869
870 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200871 /* sock_func() succeeded */
872 if (err)
873 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 return 0;
875 }
876
Victor Stinner81c41db2015-04-02 11:50:57 +0200877 if (err)
878 *err = GET_SOCK_ERROR;
879
Victor Stinner31bf2d52015-04-01 21:57:09 +0200880 if (!CHECK_ERRNO(EINTR))
881 break;
882
Victor Stinner81c41db2015-04-02 11:50:57 +0200883 /* sock_func() was interrupted by a signal */
884 if (PyErr_CheckSignals()) {
885 if (err)
886 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200888 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200889
Victor Stinner81c41db2015-04-02 11:50:57 +0200890 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891 }
892
893 if (s->sock_timeout > 0
894 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200895 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200896
897 For example, select() could indicate a socket is ready for
898 reading, but the data then discarded by the OS because of a
899 wrong checksum.
900
901 Loop on select() to recheck for socket readyness. */
902 continue;
903 }
904
Victor Stinner81c41db2015-04-02 11:50:57 +0200905 /* sock_func() failed */
906 if (!err)
907 s->errorhandler();
908 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000909 return -1;
910 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200911}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000912
Victor Stinner81c41db2015-04-02 11:50:57 +0200913static int
914sock_call(PySocketSockObject *s,
915 int writing,
916 int (*func) (PySocketSockObject *s, void *data),
917 void *data)
918{
Victor Stinner8912d142015-04-06 23:16:34 +0200919 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200920}
921
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000922
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000923/* Initialize a new socket object. */
924
Victor Stinner88ed6402015-04-09 10:23:12 +0200925/* Default timeout for new sockets */
926static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000927
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200928static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000929init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 s->sock_fd = fd;
933 s->sock_family = family;
934 s->sock_type = type;
935 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000938#ifdef SOCK_NONBLOCK
939 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100940 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000941 else
942#endif
943 {
944 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200945 if (defaulttimeout >= 0) {
946 if (internal_setblocking(s, 0) == -1) {
947 return -1;
948 }
949 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000950 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200951 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000952}
953
954
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955/* Create a new socket object.
956 This just creates the object and initializes it.
957 If the creation fails, return NULL and set an exception (implicit
958 in NEWOBJ()). */
959
Guido van Rossum73624e91994-10-10 17:59:00 +0000960static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000961new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 PySocketSockObject *s;
964 s = (PySocketSockObject *)
965 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200966 if (s == NULL)
967 return NULL;
968 if (init_sockobject(s, fd, family, type, proto) == -1) {
969 Py_DECREF(s);
970 return NULL;
971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973}
974
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975
Guido van Rossum48a680c2001-03-02 06:34:14 +0000976/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000977 thread to be in gethostbyname or getaddrinfo */
978#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200979static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000980#endif
981
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983/* Convert a string specifying a host name or one of a few symbolic
984 names to a numeric IP address. This usually calls gethostbyname()
985 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000986 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987 an error occurred; then an exception is raised. */
988
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200990setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 struct addrinfo hints, *res;
993 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
996 if (name[0] == '\0') {
997 int siz;
998 memset(&hints, 0, sizeof(hints));
999 hints.ai_family = af;
1000 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1001 hints.ai_flags = AI_PASSIVE;
1002 Py_BEGIN_ALLOW_THREADS
1003 ACQUIRE_GETADDRINFO_LOCK
1004 error = getaddrinfo(NULL, "0", &hints, &res);
1005 Py_END_ALLOW_THREADS
1006 /* We assume that those thread-unsafe getaddrinfo() versions
1007 *are* safe regarding their return value, ie. that a
1008 subsequent call to getaddrinfo() does not destroy the
1009 outcome of the first call. */
1010 RELEASE_GETADDRINFO_LOCK
1011 if (error) {
1012 set_gaierror(error);
1013 return -1;
1014 }
1015 switch (res->ai_family) {
1016 case AF_INET:
1017 siz = 4;
1018 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001019#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case AF_INET6:
1021 siz = 16;
1022 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 default:
1025 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001026 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 "unsupported address family");
1028 return -1;
1029 }
1030 if (res->ai_next) {
1031 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001032 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 "wildcard resolved to multiple address");
1034 return -1;
1035 }
1036 if (res->ai_addrlen < addr_ret_size)
1037 addr_ret_size = res->ai_addrlen;
1038 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1039 freeaddrinfo(res);
1040 return siz;
1041 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001042 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001043 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001044 if (strcmp(name, "255.255.255.255") == 0 ||
1045 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 struct sockaddr_in *sin;
1047 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001048 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 "address family mismatched");
1050 return -1;
1051 }
1052 sin = (struct sockaddr_in *)addr_ret;
1053 memset((void *) sin, '\0', sizeof(*sin));
1054 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001055#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 sin->sin_addr.s_addr = INADDR_BROADCAST;
1059 return sizeof(sin->sin_addr);
1060 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001061
1062 /* avoid a name resolution in case of numeric address */
1063#ifdef HAVE_INET_PTON
1064 /* check for an IPv4 address */
1065 if (af == AF_UNSPEC || af == AF_INET) {
1066 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1067 memset(sin, 0, sizeof(*sin));
1068 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1069 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001070#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001071 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001072#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001073 return 4;
1074 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001076#ifdef ENABLE_IPV6
1077 /* check for an IPv6 address - if the address contains a scope ID, we
1078 * fallback to getaddrinfo(), which can handle translation from interface
1079 * name to interface index */
1080 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1081 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1082 memset(sin, 0, sizeof(*sin));
1083 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1084 sin->sin6_family = AF_INET6;
1085#ifdef HAVE_SOCKADDR_SA_LEN
1086 sin->sin6_len = sizeof(*sin);
1087#endif
1088 return 16;
1089 }
1090 }
1091#endif /* ENABLE_IPV6 */
1092#else /* HAVE_INET_PTON */
1093 /* check for an IPv4 address */
1094 if (af == AF_INET || af == AF_UNSPEC) {
1095 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1096 memset(sin, 0, sizeof(*sin));
1097 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1098 sin->sin_family = AF_INET;
1099#ifdef HAVE_SOCKADDR_SA_LEN
1100 sin->sin_len = sizeof(*sin);
1101#endif
1102 return 4;
1103 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001104 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001105#endif /* HAVE_INET_PTON */
1106
1107 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 memset(&hints, 0, sizeof(hints));
1109 hints.ai_family = af;
1110 Py_BEGIN_ALLOW_THREADS
1111 ACQUIRE_GETADDRINFO_LOCK
1112 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001113#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (error == EAI_NONAME && af == AF_UNSPEC) {
1115 /* On Tru64 V5.1, numeric-to-addr conversion fails
1116 if no address family is given. Assume IPv4 for now.*/
1117 hints.ai_family = AF_INET;
1118 error = getaddrinfo(name, NULL, &hints, &res);
1119 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 Py_END_ALLOW_THREADS
1122 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1123 if (error) {
1124 set_gaierror(error);
1125 return -1;
1126 }
1127 if (res->ai_addrlen < addr_ret_size)
1128 addr_ret_size = res->ai_addrlen;
1129 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1130 freeaddrinfo(res);
1131 switch (addr_ret->sa_family) {
1132 case AF_INET:
1133 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001134#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case AF_INET6:
1136 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001139 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 return -1;
1141 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001142}
1143
Guido van Rossum30a685f1991-06-27 15:51:29 +00001144
Guido van Rossum30a685f1991-06-27 15:51:29 +00001145/* Create a string object representing an IP address.
1146 This is always a string of the form 'dd.dd.dd.dd' (with variable
1147 size numbers). */
1148
Guido van Rossum73624e91994-10-10 17:59:00 +00001149static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001150makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 char buf[NI_MAXHOST];
1153 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1156 NI_NUMERICHOST);
1157 if (error) {
1158 set_gaierror(error);
1159 return NULL;
1160 }
1161 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162}
1163
1164
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165#ifdef USE_BLUETOOTH
1166/* Convert a string representation of a Bluetooth address into a numeric
1167 address. Returns the length (6), or raises an exception and returns -1 if
1168 an error occurred. */
1169
1170static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001171setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 unsigned int b0, b1, b2, b3, b4, b5;
1174 char ch;
1175 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1178 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1179 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1180 bdaddr->b[0] = b0;
1181 bdaddr->b[1] = b1;
1182 bdaddr->b[2] = b2;
1183 bdaddr->b[3] = b3;
1184 bdaddr->b[4] = b4;
1185 bdaddr->b[5] = b5;
1186 return 6;
1187 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001188 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 return -1;
1190 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001191}
1192
1193/* Create a string representation of the Bluetooth address. This is always a
1194 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1195 value (zero padded if necessary). */
1196
1197static PyObject *
1198makebdaddr(bdaddr_t *bdaddr)
1199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1203 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1204 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1205 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001206}
1207#endif
1208
1209
Guido van Rossum30a685f1991-06-27 15:51:29 +00001210/* Create an object representing the given socket address,
1211 suitable for passing it back to bind(), connect() etc.
1212 The family field of the sockaddr structure is inspected
1213 to determine what kind of address it really is. */
1214
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001215/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001216static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001217makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 if (addrlen == 0) {
1220 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001221 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 case AF_INET:
1227 {
1228 struct sockaddr_in *a;
1229 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1230 PyObject *ret = NULL;
1231 if (addrobj) {
1232 a = (struct sockaddr_in *)addr;
1233 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1234 Py_DECREF(addrobj);
1235 }
1236 return ret;
1237 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001239#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 case AF_UNIX:
1241 {
1242 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001243#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1245 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001246 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 }
1248 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001249#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 {
1251 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001252 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 }
1254 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001255#endif /* AF_UNIX */
1256
Martin v. Löwis11017b12006-01-14 18:12:57 +00001257#if defined(AF_NETLINK)
1258 case AF_NETLINK:
1259 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1261 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001262 }
1263#endif /* AF_NETLINK */
1264
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001265#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 case AF_INET6:
1267 {
1268 struct sockaddr_in6 *a;
1269 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1270 PyObject *ret = NULL;
1271 if (addrobj) {
1272 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001273 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 addrobj,
1275 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001276 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 a->sin6_scope_id);
1278 Py_DECREF(addrobj);
1279 }
1280 return ret;
1281 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001282#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001284#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 case AF_BLUETOOTH:
1286 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 case BTPROTO_L2CAP:
1289 {
1290 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1291 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1292 PyObject *ret = NULL;
1293 if (addrobj) {
1294 ret = Py_BuildValue("Oi",
1295 addrobj,
1296 _BT_L2_MEMB(a, psm));
1297 Py_DECREF(addrobj);
1298 }
1299 return ret;
1300 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 case BTPROTO_RFCOMM:
1303 {
1304 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1305 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1306 PyObject *ret = NULL;
1307 if (addrobj) {
1308 ret = Py_BuildValue("Oi",
1309 addrobj,
1310 _BT_RC_MEMB(a, channel));
1311 Py_DECREF(addrobj);
1312 }
1313 return ret;
1314 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 case BTPROTO_HCI:
1317 {
1318 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001319#if defined(__NetBSD__) || defined(__DragonFly__)
1320 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1321#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 PyObject *ret = NULL;
1323 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1324 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001327
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001328#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 case BTPROTO_SCO:
1330 {
1331 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1332 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1333 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001334#endif
1335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 default:
1337 PyErr_SetString(PyExc_ValueError,
1338 "Unknown Bluetooth protocol");
1339 return NULL;
1340 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001341#endif
1342
Antoine Pitroub156a462010-10-27 20:13:57 +00001343#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case AF_PACKET:
1345 {
1346 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1347 char *ifname = "";
1348 struct ifreq ifr;
1349 /* need to look up interface name give index */
1350 if (a->sll_ifindex) {
1351 ifr.ifr_ifindex = a->sll_ifindex;
1352 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1353 ifname = ifr.ifr_name;
1354 }
1355 return Py_BuildValue("shbhy#",
1356 ifname,
1357 ntohs(a->sll_protocol),
1358 a->sll_pkttype,
1359 a->sll_hatype,
1360 a->sll_addr,
1361 a->sll_halen);
1362 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001363#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001364
Christian Heimes043d6f62008-01-07 17:19:16 +00001365#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 case AF_TIPC:
1367 {
1368 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1369 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1370 return Py_BuildValue("IIIII",
1371 a->addrtype,
1372 a->addr.nameseq.type,
1373 a->addr.nameseq.lower,
1374 a->addr.nameseq.upper,
1375 a->scope);
1376 } else if (a->addrtype == TIPC_ADDR_NAME) {
1377 return Py_BuildValue("IIIII",
1378 a->addrtype,
1379 a->addr.name.name.type,
1380 a->addr.name.name.instance,
1381 a->addr.name.name.instance,
1382 a->scope);
1383 } else if (a->addrtype == TIPC_ADDR_ID) {
1384 return Py_BuildValue("IIIII",
1385 a->addrtype,
1386 a->addr.id.node,
1387 a->addr.id.ref,
1388 0,
1389 a->scope);
1390 } else {
1391 PyErr_SetString(PyExc_ValueError,
1392 "Invalid address type");
1393 return NULL;
1394 }
1395 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001396#endif
1397
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001398#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001399 case AF_CAN:
1400 {
1401 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1402 char *ifname = "";
1403 struct ifreq ifr;
1404 /* need to look up interface name given index */
1405 if (a->can_ifindex) {
1406 ifr.ifr_ifindex = a->can_ifindex;
1407 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1408 ifname = ifr.ifr_name;
1409 }
1410
1411 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1412 ifname,
1413 a->can_family);
1414 }
1415#endif
1416
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001417#ifdef PF_SYSTEM
1418 case PF_SYSTEM:
1419 switch(proto) {
1420#ifdef SYSPROTO_CONTROL
1421 case SYSPROTO_CONTROL:
1422 {
1423 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1424 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1425 }
1426#endif
1427 default:
1428 PyErr_SetString(PyExc_ValueError,
1429 "Invalid address type");
1430 return 0;
1431 }
1432#endif
1433
Christian Heimesdffa3942016-09-05 23:54:41 +02001434#ifdef HAVE_SOCKADDR_ALG
1435 case AF_ALG:
1436 {
1437 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1438 return Py_BuildValue("s#s#HH",
1439 a->salg_type,
1440 strnlen((const char*)a->salg_type,
1441 sizeof(a->salg_type)),
1442 a->salg_name,
1443 strnlen((const char*)a->salg_name,
1444 sizeof(a->salg_name)),
1445 a->salg_feat,
1446 a->salg_mask);
1447 }
1448#endif
1449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 default:
1453 /* If we don't know the address family, don't raise an
1454 exception -- return it as an (int, bytes) tuple. */
1455 return Py_BuildValue("iy#",
1456 addr->sa_family,
1457 addr->sa_data,
1458 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001461}
1462
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001463/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1464 (in particular, numeric IP addresses). */
1465struct maybe_idna {
1466 PyObject *obj;
1467 char *buf;
1468};
1469
1470static void
1471idna_cleanup(struct maybe_idna *data)
1472{
1473 Py_CLEAR(data->obj);
1474}
1475
1476static int
1477idna_converter(PyObject *obj, struct maybe_idna *data)
1478{
1479 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001480 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001481 if (obj == NULL) {
1482 idna_cleanup(data);
1483 return 1;
1484 }
1485 data->obj = NULL;
1486 len = -1;
1487 if (PyBytes_Check(obj)) {
1488 data->buf = PyBytes_AsString(obj);
1489 len = PyBytes_Size(obj);
1490 }
1491 else if (PyByteArray_Check(obj)) {
1492 data->buf = PyByteArray_AsString(obj);
1493 len = PyByteArray_Size(obj);
1494 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001495 else if (PyUnicode_Check(obj)) {
1496 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1497 data->buf = PyUnicode_DATA(obj);
1498 len = PyUnicode_GET_LENGTH(obj);
1499 }
1500 else {
1501 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1502 if (!obj2) {
1503 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1504 return 0;
1505 }
1506 assert(PyBytes_Check(obj2));
1507 data->obj = obj2;
1508 data->buf = PyBytes_AS_STRING(obj2);
1509 len = PyBytes_GET_SIZE(obj2);
1510 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001511 }
1512 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001513 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1514 obj->ob_type->tp_name);
1515 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001516 }
1517 if (strlen(data->buf) != len) {
1518 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001519 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001520 return 0;
1521 }
1522 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001523}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001524
1525/* Parse a socket address argument according to the socket object's
1526 address family. Return 1 if the address was in the proper format,
1527 0 of not. The address is returned through addr_ret, its length
1528 through len_ret. */
1529
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001531getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001536#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 case AF_UNIX:
1538 {
1539 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001540 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001541 int retval = 0;
1542
1543 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1544 allow embedded nulls on Linux. */
1545 if (PyUnicode_Check(args)) {
1546 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1547 return 0;
1548 }
1549 else
1550 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001551 if (!PyArg_Parse(args, "y*", &path)) {
1552 Py_DECREF(args);
1553 return retval;
1554 }
1555 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001558#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001559 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001561 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001562 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001564 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 }
1566 }
1567 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001568#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 {
1570 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001571 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001572 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001574 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001576 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 }
1578 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001579 memcpy(addr->sun_path, path.buf, path.len);
1580 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001581 retval = 1;
1582 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001583 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001584 Py_DECREF(args);
1585 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001587#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588
Martin v. Löwis11017b12006-01-14 18:12:57 +00001589#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 case AF_NETLINK:
1591 {
1592 struct sockaddr_nl* addr;
1593 int pid, groups;
1594 addr = (struct sockaddr_nl *)addr_ret;
1595 if (!PyTuple_Check(args)) {
1596 PyErr_Format(
1597 PyExc_TypeError,
1598 "getsockaddrarg: "
1599 "AF_NETLINK address must be tuple, not %.500s",
1600 Py_TYPE(args)->tp_name);
1601 return 0;
1602 }
1603 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1604 return 0;
1605 addr->nl_family = AF_NETLINK;
1606 addr->nl_pid = pid;
1607 addr->nl_groups = groups;
1608 *len_ret = sizeof(*addr);
1609 return 1;
1610 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001611#endif
1612
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001613#ifdef AF_RDS
1614 case AF_RDS:
1615 /* RDS sockets use sockaddr_in: fall-through */
1616#endif
1617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 case AF_INET:
1619 {
1620 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001621 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 int port, result;
1623 if (!PyTuple_Check(args)) {
1624 PyErr_Format(
1625 PyExc_TypeError,
1626 "getsockaddrarg: "
1627 "AF_INET address must be tuple, not %.500s",
1628 Py_TYPE(args)->tp_name);
1629 return 0;
1630 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001631 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1632 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 return 0;
1634 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001635 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 if (result < 0)
1639 return 0;
1640 if (port < 0 || port > 0xffff) {
1641 PyErr_SetString(
1642 PyExc_OverflowError,
1643 "getsockaddrarg: port must be 0-65535.");
1644 return 0;
1645 }
1646 addr->sin_family = AF_INET;
1647 addr->sin_port = htons((short)port);
1648 *len_ret = sizeof *addr;
1649 return 1;
1650 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001652#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 case AF_INET6:
1654 {
1655 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001656 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001657 int port, result;
1658 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 flowinfo = scope_id = 0;
1660 if (!PyTuple_Check(args)) {
1661 PyErr_Format(
1662 PyExc_TypeError,
1663 "getsockaddrarg: "
1664 "AF_INET6 address must be tuple, not %.500s",
1665 Py_TYPE(args)->tp_name);
1666 return 0;
1667 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001668 if (!PyArg_ParseTuple(args, "O&i|II",
1669 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 &scope_id)) {
1671 return 0;
1672 }
1673 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001674 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001676 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 if (result < 0)
1678 return 0;
1679 if (port < 0 || port > 0xffff) {
1680 PyErr_SetString(
1681 PyExc_OverflowError,
1682 "getsockaddrarg: port must be 0-65535.");
1683 return 0;
1684 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001685 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001686 PyErr_SetString(
1687 PyExc_OverflowError,
1688 "getsockaddrarg: flowinfo must be 0-1048575.");
1689 return 0;
1690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 addr->sin6_family = s->sock_family;
1692 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001693 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 addr->sin6_scope_id = scope_id;
1695 *len_ret = sizeof *addr;
1696 return 1;
1697 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001698#endif
1699
Hye-Shik Chang81268602004-02-02 06:05:24 +00001700#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 case AF_BLUETOOTH:
1702 {
1703 switch (s->sock_proto) {
1704 case BTPROTO_L2CAP:
1705 {
1706 struct sockaddr_l2 *addr;
1707 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 addr = (struct sockaddr_l2 *)addr_ret;
1710 memset(addr, 0, sizeof(struct sockaddr_l2));
1711 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1712 if (!PyArg_ParseTuple(args, "si", &straddr,
1713 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001714 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 "wrong format");
1716 return 0;
1717 }
1718 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1719 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 *len_ret = sizeof *addr;
1722 return 1;
1723 }
1724 case BTPROTO_RFCOMM:
1725 {
1726 struct sockaddr_rc *addr;
1727 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 addr = (struct sockaddr_rc *)addr_ret;
1730 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1731 if (!PyArg_ParseTuple(args, "si", &straddr,
1732 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001733 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 "wrong format");
1735 return 0;
1736 }
1737 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1738 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 *len_ret = sizeof *addr;
1741 return 1;
1742 }
1743 case BTPROTO_HCI:
1744 {
1745 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001746#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001747 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001748
Alexander Belopolskye239d232010-12-08 23:31:48 +00001749 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001750 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001751 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001752 "wrong format");
1753 return 0;
1754 }
1755 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1756 return 0;
1757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1759 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001760 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 "wrong format");
1762 return 0;
1763 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 *len_ret = sizeof *addr;
1766 return 1;
1767 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001768#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 case BTPROTO_SCO:
1770 {
1771 struct sockaddr_sco *addr;
1772 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 addr = (struct sockaddr_sco *)addr_ret;
1775 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1776 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001777 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 "wrong format");
1779 return 0;
1780 }
1781 straddr = PyBytes_AS_STRING(args);
1782 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1783 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 *len_ret = sizeof *addr;
1786 return 1;
1787 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return 0;
1792 }
1793 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001794#endif
1795
Antoine Pitroub156a462010-10-27 20:13:57 +00001796#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 case AF_PACKET:
1798 {
1799 struct sockaddr_ll* addr;
1800 struct ifreq ifr;
1801 char *interfaceName;
1802 int protoNumber;
1803 int hatype = 0;
1804 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001805 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (!PyTuple_Check(args)) {
1808 PyErr_Format(
1809 PyExc_TypeError,
1810 "getsockaddrarg: "
1811 "AF_PACKET address must be tuple, not %.500s",
1812 Py_TYPE(args)->tp_name);
1813 return 0;
1814 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001817 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 return 0;
1819 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1820 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1821 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1822 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001823 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 return 0;
1825 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001826 if (haddr.buf && haddr.len > 8) {
1827 PyErr_SetString(PyExc_ValueError,
1828 "Hardware address must be 8 bytes or less");
1829 PyBuffer_Release(&haddr);
1830 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 }
1832 if (protoNumber < 0 || protoNumber > 0xffff) {
1833 PyErr_SetString(
1834 PyExc_OverflowError,
1835 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001836 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 return 0;
1838 }
1839 addr = (struct sockaddr_ll*)addr_ret;
1840 addr->sll_family = AF_PACKET;
1841 addr->sll_protocol = htons((short)protoNumber);
1842 addr->sll_ifindex = ifr.ifr_ifindex;
1843 addr->sll_pkttype = pkttype;
1844 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001845 if (haddr.buf) {
1846 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1847 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001849 else
1850 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001852 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 return 1;
1854 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855#endif
1856
Christian Heimes043d6f62008-01-07 17:19:16 +00001857#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 case AF_TIPC:
1859 {
1860 unsigned int atype, v1, v2, v3;
1861 unsigned int scope = TIPC_CLUSTER_SCOPE;
1862 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 if (!PyTuple_Check(args)) {
1865 PyErr_Format(
1866 PyExc_TypeError,
1867 "getsockaddrarg: "
1868 "AF_TIPC address must be tuple, not %.500s",
1869 Py_TYPE(args)->tp_name);
1870 return 0;
1871 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 if (!PyArg_ParseTuple(args,
1874 "IIII|I;Invalid TIPC address format",
1875 &atype, &v1, &v2, &v3, &scope))
1876 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 addr = (struct sockaddr_tipc *) addr_ret;
1879 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 addr->family = AF_TIPC;
1882 addr->scope = scope;
1883 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 if (atype == TIPC_ADDR_NAMESEQ) {
1886 addr->addr.nameseq.type = v1;
1887 addr->addr.nameseq.lower = v2;
1888 addr->addr.nameseq.upper = v3;
1889 } else if (atype == TIPC_ADDR_NAME) {
1890 addr->addr.name.name.type = v1;
1891 addr->addr.name.name.instance = v2;
1892 } else if (atype == TIPC_ADDR_ID) {
1893 addr->addr.id.node = v1;
1894 addr->addr.id.ref = v2;
1895 } else {
1896 /* Shouldn't happen */
1897 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1898 return 0;
1899 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return 1;
1904 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001905#endif
1906
Vinay Sajiped6783f2014-03-21 11:44:32 +00001907#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001908 case AF_CAN:
1909 switch (s->sock_proto) {
1910 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001911 /* fall-through */
1912 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 {
1914 struct sockaddr_can *addr;
1915 PyObject *interfaceName;
1916 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001917 Py_ssize_t len;
1918
Benjamin Peterson18b71912013-05-16 15:29:44 -05001919 addr = (struct sockaddr_can *)addr_ret;
1920
Charles-François Natali47413c12011-10-06 19:47:44 +02001921 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1922 &interfaceName))
1923 return 0;
1924
1925 len = PyBytes_GET_SIZE(interfaceName);
1926
1927 if (len == 0) {
1928 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001929 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001930 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1931 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001932 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1933 s->errorhandler();
1934 Py_DECREF(interfaceName);
1935 return 0;
1936 }
1937 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001938 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001939 "AF_CAN interface name too long");
1940 Py_DECREF(interfaceName);
1941 return 0;
1942 }
1943
1944 addr->can_family = AF_CAN;
1945 addr->can_ifindex = ifr.ifr_ifindex;
1946
1947 *len_ret = sizeof(*addr);
1948 Py_DECREF(interfaceName);
1949 return 1;
1950 }
1951 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001952 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001953 "getsockaddrarg: unsupported CAN protocol");
1954 return 0;
1955 }
1956#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001957
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001958#ifdef PF_SYSTEM
1959 case PF_SYSTEM:
1960 switch (s->sock_proto) {
1961#ifdef SYSPROTO_CONTROL
1962 case SYSPROTO_CONTROL:
1963 {
1964 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001965
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001966 addr = (struct sockaddr_ctl *)addr_ret;
1967 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001968 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001969
1970 if (PyUnicode_Check(args)) {
1971 struct ctl_info info;
1972 PyObject *ctl_name;
1973
1974 if (!PyArg_Parse(args, "O&",
1975 PyUnicode_FSConverter, &ctl_name)) {
1976 return 0;
1977 }
1978
Victor Stinnerf50e1872015-03-20 11:32:24 +01001979 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001980 PyErr_SetString(PyExc_ValueError,
1981 "provided string is too long");
1982 Py_DECREF(ctl_name);
1983 return 0;
1984 }
1985 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1986 sizeof(info.ctl_name));
1987 Py_DECREF(ctl_name);
1988
1989 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1990 PyErr_SetString(PyExc_OSError,
1991 "cannot find kernel control with provided name");
1992 return 0;
1993 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001994
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001995 addr->sc_id = info.ctl_id;
1996 addr->sc_unit = 0;
1997 } else if (!PyArg_ParseTuple(args, "II",
1998 &(addr->sc_id), &(addr->sc_unit))) {
1999 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2000 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002001
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002002 return 0;
2003 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002004
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002005 *len_ret = sizeof(*addr);
2006 return 1;
2007 }
2008#endif
2009 default:
2010 PyErr_SetString(PyExc_OSError,
2011 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2012 return 0;
2013 }
2014#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002015#ifdef HAVE_SOCKADDR_ALG
2016 case AF_ALG:
2017 {
2018 struct sockaddr_alg *sa;
2019 char *type;
2020 char *name;
2021 sa = (struct sockaddr_alg *)addr_ret;
2022
2023 memset(sa, 0, sizeof(*sa));
2024 sa->salg_family = AF_ALG;
2025
2026 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2027 &type, &name, &sa->salg_feat, &sa->salg_mask))
2028 return 0;
2029 /* sockaddr_alg has fixed-sized char arrays for type and name */
2030 if (strlen(type) > sizeof(sa->salg_type)) {
2031 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2032 return 0;
2033 }
2034 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2035 if (strlen(name) > sizeof(sa->salg_name)) {
2036 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2037 return 0;
2038 }
2039 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2040
2041 *len_ret = sizeof(*sa);
2042 return 1;
2043 }
2044#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002049 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002053}
2054
Guido van Rossum30a685f1991-06-27 15:51:29 +00002055
Guido van Rossum48a680c2001-03-02 06:34:14 +00002056/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002057 Return 1 if the family is known, 0 otherwise. The length is returned
2058 through len_ret. */
2059
2060static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002061getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002064
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002065#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 case AF_UNIX:
2067 {
2068 *len_ret = sizeof (struct sockaddr_un);
2069 return 1;
2070 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002071#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002072
Martin v. Löwis11017b12006-01-14 18:12:57 +00002073#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002074 case AF_NETLINK:
2075 {
2076 *len_ret = sizeof (struct sockaddr_nl);
2077 return 1;
2078 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002079#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002080
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002081#ifdef AF_RDS
2082 case AF_RDS:
2083 /* RDS sockets use sockaddr_in: fall-through */
2084#endif
2085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 case AF_INET:
2087 {
2088 *len_ret = sizeof (struct sockaddr_in);
2089 return 1;
2090 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002091
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002092#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 case AF_INET6:
2094 {
2095 *len_ret = sizeof (struct sockaddr_in6);
2096 return 1;
2097 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002098#endif
2099
Hye-Shik Chang81268602004-02-02 06:05:24 +00002100#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 case AF_BLUETOOTH:
2102 {
2103 switch(s->sock_proto)
2104 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 case BTPROTO_L2CAP:
2107 *len_ret = sizeof (struct sockaddr_l2);
2108 return 1;
2109 case BTPROTO_RFCOMM:
2110 *len_ret = sizeof (struct sockaddr_rc);
2111 return 1;
2112 case BTPROTO_HCI:
2113 *len_ret = sizeof (struct sockaddr_hci);
2114 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002115#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 case BTPROTO_SCO:
2117 *len_ret = sizeof (struct sockaddr_sco);
2118 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002121 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 "unknown BT protocol");
2123 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 }
2126 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002127#endif
2128
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002129#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 case AF_PACKET:
2131 {
2132 *len_ret = sizeof (struct sockaddr_ll);
2133 return 1;
2134 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002135#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002136
Christian Heimes043d6f62008-01-07 17:19:16 +00002137#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 case AF_TIPC:
2139 {
2140 *len_ret = sizeof (struct sockaddr_tipc);
2141 return 1;
2142 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002143#endif
2144
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002145#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002146 case AF_CAN:
2147 {
2148 *len_ret = sizeof (struct sockaddr_can);
2149 return 1;
2150 }
2151#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002152
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002153#ifdef PF_SYSTEM
2154 case PF_SYSTEM:
2155 switch(s->sock_proto) {
2156#ifdef SYSPROTO_CONTROL
2157 case SYSPROTO_CONTROL:
2158 *len_ret = sizeof (struct sockaddr_ctl);
2159 return 1;
2160#endif
2161 default:
2162 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2163 "unknown PF_SYSTEM protocol");
2164 return 0;
2165 }
2166#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002167#ifdef HAVE_SOCKADDR_ALG
2168 case AF_ALG:
2169 {
2170 *len_ret = sizeof (struct sockaddr_alg);
2171 return 1;
2172 }
2173#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002178 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002182}
2183
2184
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002185/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2186 Currently, these methods are only compiled if the RFC 2292/3542
2187 CMSG_LEN() macro is available. Older systems seem to have used
2188 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2189 it may be possible to define CMSG_LEN() that way if it's not
2190 provided. Some architectures might need extra padding after the
2191 cmsghdr, however, and CMSG_LEN() would have to take account of
2192 this. */
2193#ifdef CMSG_LEN
2194/* If length is in range, set *result to CMSG_LEN(length) and return
2195 true; otherwise, return false. */
2196static int
2197get_CMSG_LEN(size_t length, size_t *result)
2198{
2199 size_t tmp;
2200
2201 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2202 return 0;
2203 tmp = CMSG_LEN(length);
2204 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2205 return 0;
2206 *result = tmp;
2207 return 1;
2208}
2209
2210#ifdef CMSG_SPACE
2211/* If length is in range, set *result to CMSG_SPACE(length) and return
2212 true; otherwise, return false. */
2213static int
2214get_CMSG_SPACE(size_t length, size_t *result)
2215{
2216 size_t tmp;
2217
2218 /* Use CMSG_SPACE(1) here in order to take account of the padding
2219 necessary before *and* after the data. */
2220 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2221 return 0;
2222 tmp = CMSG_SPACE(length);
2223 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2224 return 0;
2225 *result = tmp;
2226 return 1;
2227}
2228#endif
2229
2230/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2231 pointer in msg->msg_control with at least "space" bytes after it,
2232 and its cmsg_len member inside the buffer. */
2233static int
2234cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2235{
2236 size_t cmsg_offset;
2237 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2238 sizeof(cmsgh->cmsg_len));
2239
Charles-François Natali466517d2011-08-28 18:23:43 +02002240 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002241 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002242 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002243 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2244 annoying under OS X as it's unsigned there and so it triggers a
2245 tautological comparison warning under Clang when compared against 0.
2246 Since the check is valid on other platforms, silence the warning under
2247 Clang. */
2248 #ifdef __clang__
2249 #pragma clang diagnostic push
2250 #pragma clang diagnostic ignored "-Wtautological-compare"
2251 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002252 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002253 #pragma GCC diagnostic push
2254 #pragma GCC diagnostic ignored "-Wtype-limits"
2255 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002256 if (msg->msg_controllen < 0)
2257 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002258 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002259 #pragma GCC diagnostic pop
2260 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002261 #ifdef __clang__
2262 #pragma clang diagnostic pop
2263 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002264 if (space < cmsg_len_end)
2265 space = cmsg_len_end;
2266 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2267 return (cmsg_offset <= (size_t)-1 - space &&
2268 cmsg_offset + space <= msg->msg_controllen);
2269}
2270
2271/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2272 *space to number of bytes following it in the buffer and return
2273 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2274 msg->msg_controllen are valid. */
2275static int
2276get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2277{
2278 size_t data_offset;
2279 char *data_ptr;
2280
2281 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2282 return 0;
2283 data_offset = data_ptr - (char *)msg->msg_control;
2284 if (data_offset > msg->msg_controllen)
2285 return 0;
2286 *space = msg->msg_controllen - data_offset;
2287 return 1;
2288}
2289
2290/* If cmsgh is invalid or not contained in the buffer pointed to by
2291 msg->msg_control, return -1. If cmsgh is valid and its associated
2292 data is entirely contained in the buffer, set *data_len to the
2293 length of the associated data and return 0. If only part of the
2294 associated data is contained in the buffer but cmsgh is otherwise
2295 valid, set *data_len to the length contained in the buffer and
2296 return 1. */
2297static int
2298get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2299{
2300 size_t space, cmsg_data_len;
2301
2302 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2303 cmsgh->cmsg_len < CMSG_LEN(0))
2304 return -1;
2305 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2306 if (!get_cmsg_data_space(msg, cmsgh, &space))
2307 return -1;
2308 if (space >= cmsg_data_len) {
2309 *data_len = cmsg_data_len;
2310 return 0;
2311 }
2312 *data_len = space;
2313 return 1;
2314}
2315#endif /* CMSG_LEN */
2316
2317
Victor Stinner31bf2d52015-04-01 21:57:09 +02002318struct sock_accept {
2319 socklen_t *addrlen;
2320 sock_addr_t *addrbuf;
2321 SOCKET_T result;
2322};
2323
2324#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2325/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2326static int accept4_works = -1;
2327#endif
2328
2329static int
2330sock_accept_impl(PySocketSockObject *s, void *data)
2331{
2332 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002333 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2334 socklen_t *paddrlen = ctx->addrlen;
2335#ifdef HAVE_SOCKADDR_ALG
2336 /* AF_ALG does not support accept() with addr and raises
2337 * ECONNABORTED instead. */
2338 if (s->sock_family == AF_ALG) {
2339 addr = NULL;
2340 paddrlen = NULL;
2341 *ctx->addrlen = 0;
2342 }
2343#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002344
2345#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2346 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002347 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002348 SOCK_CLOEXEC);
2349 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2350 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2351 accept4_works = (errno != ENOSYS);
2352 }
2353 }
2354 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002355 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002356#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002357 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002358#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002359
2360#ifdef MS_WINDOWS
2361 return (ctx->result != INVALID_SOCKET);
2362#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002363 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002364#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002365}
2366
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002367/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002368
Guido van Rossum73624e91994-10-10 17:59:00 +00002369static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002373 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 socklen_t addrlen;
2375 PyObject *sock = NULL;
2376 PyObject *addr = NULL;
2377 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002378 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (!getsockaddrlen(s, &addrlen))
2381 return NULL;
2382 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 if (!IS_SELECTABLE(s))
2385 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002386
Victor Stinner31bf2d52015-04-01 21:57:09 +02002387 ctx.addrlen = &addrlen;
2388 ctx.addrbuf = &addrbuf;
2389 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002391 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002392
Victor Stinnerdaf45552013-08-28 00:53:59 +02002393#ifdef MS_WINDOWS
2394 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2395 PyErr_SetFromWindowsErr(0);
2396 SOCKETCLOSE(newfd);
2397 goto finally;
2398 }
2399#else
2400
2401#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2402 if (!accept4_works)
2403#endif
2404 {
2405 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2406 SOCKETCLOSE(newfd);
2407 goto finally;
2408 }
2409 }
2410#endif
2411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 sock = PyLong_FromSocket_t(newfd);
2413 if (sock == NULL) {
2414 SOCKETCLOSE(newfd);
2415 goto finally;
2416 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2419 addrlen, s->sock_proto);
2420 if (addr == NULL)
2421 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002424
Guido van Rossum67f7a382002-06-06 21:08:16 +00002425finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 Py_XDECREF(sock);
2427 Py_XDECREF(addr);
2428 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002429}
2430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002432"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002433\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002434Wait for an incoming connection. Return a new socket file descriptor\n\
2435representing the connection, and the address of the client.\n\
2436For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002437
Guido van Rossum11ba0942002-06-13 15:07:44 +00002438/* s.setblocking(flag) method. Argument:
2439 False -- non-blocking mode; same as settimeout(0)
2440 True -- blocking mode; same as settimeout(None)
2441*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002442
Guido van Rossum73624e91994-10-10 17:59:00 +00002443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002444sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002445{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002446 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 block = PyLong_AsLong(arg);
2449 if (block == -1 && PyErr_Occurred())
2450 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002451
Victor Stinner9001d802015-04-06 23:06:01 +02002452 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002453 if (internal_setblocking(s, block) == -1) {
2454 return NULL;
2455 }
2456 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002457}
Guido van Rossume4485b01994-09-07 14:32:49 +00002458
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002459PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002460"setblocking(flag)\n\
2461\n\
2462Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002463setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002464setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002465
Victor Stinner71694d52015-03-28 01:18:54 +01002466static int
2467socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2468{
2469#ifdef MS_WINDOWS
2470 struct timeval tv;
2471#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002472#ifndef HAVE_POLL
2473 _PyTime_t ms;
2474#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002475 int overflow = 0;
2476
2477 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002478 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002479 return 0;
2480 }
2481
Victor Stinner869e1772015-03-30 03:49:14 +02002482 if (_PyTime_FromSecondsObject(timeout,
2483 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002484 return -1;
2485
2486 if (*timeout < 0) {
2487 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2488 return -1;
2489 }
2490
2491#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002492 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002493#endif
2494#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002495 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2496 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002497#endif
2498 if (overflow) {
2499 PyErr_SetString(PyExc_OverflowError,
2500 "timeout doesn't fit into C timeval");
2501 return -1;
2502 }
2503
2504 return 0;
2505}
2506
Guido van Rossum11ba0942002-06-13 15:07:44 +00002507/* s.settimeout(timeout) method. Argument:
2508 None -- no timeout, blocking mode; same as setblocking(True)
2509 0.0 -- non-blocking mode; same as setblocking(False)
2510 > 0 -- timeout mode; operations time out after timeout seconds
2511 < 0 -- illegal; raises an exception
2512*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002514sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002515{
Victor Stinner71694d52015-03-28 01:18:54 +01002516 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517
Victor Stinner71694d52015-03-28 01:18:54 +01002518 if (socket_parse_timeout(&timeout, arg) < 0)
2519 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002522 if (internal_setblocking(s, timeout < 0) == -1) {
2523 return NULL;
2524 }
2525 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526}
2527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002529"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002530\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002531Set a timeout on socket operations. 'timeout' can be a float,\n\
2532giving in seconds, or None. Setting a timeout of None disables\n\
2533the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002534Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002535
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002536/* s.gettimeout() method.
2537 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002538static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002539sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540{
Victor Stinner71694d52015-03-28 01:18:54 +01002541 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002542 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 }
Victor Stinner71694d52015-03-28 01:18:54 +01002544 else {
2545 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2546 return PyFloat_FromDouble(seconds);
2547 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002548}
2549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002550PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002551"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002552\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002553Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002554operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002555operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002556
Guido van Rossumaee08791992-09-08 09:05:33 +00002557/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002558 With an integer third argument, sets an integer optval with optlen=4.
2559 With None as third argument and an integer fourth argument, set
2560 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002561 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002562 use optional built-in module 'struct' to encode the string.
2563*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002564
Guido van Rossum73624e91994-10-10 17:59:00 +00002565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 int level;
2569 int optname;
2570 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002571 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002573 unsigned int optlen;
2574 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002575
Christian Heimesdffa3942016-09-05 23:54:41 +02002576 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 if (PyArg_ParseTuple(args, "iii:setsockopt",
2578 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002579 res = setsockopt(s->sock_fd, level, optname,
2580 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002581 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002583
2584 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002585 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002586 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2587 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2588 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002589 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002590 NULL, (socklen_t)optlen);
2591 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002593
2594 PyErr_Clear();
2595 /* setsockopt(level, opt, buffer) */
2596 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2597 &level, &optname, &optval))
2598 return NULL;
2599
2600#ifdef MS_WINDOWS
2601 if (optval.len > INT_MAX) {
2602 PyBuffer_Release(&optval);
2603 PyErr_Format(PyExc_OverflowError,
2604 "socket option is larger than %i bytes",
2605 INT_MAX);
2606 return NULL;
2607 }
2608 res = setsockopt(s->sock_fd, level, optname,
2609 optval.buf, (int)optval.len);
2610#else
2611 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2612#endif
2613 PyBuffer_Release(&optval);
2614
2615done:
Victor Stinnercc739322016-03-23 21:35:29 +01002616 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002618 }
2619
2620 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002621}
2622
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002623PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002624"setsockopt(level, option, value: int)\n\
2625setsockopt(level, option, value: buffer)\n\
2626setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002627\n\
2628Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002629The value argument can either be an integer, a string buffer, or \n\
2630None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002631
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002632
Guido van Rossumaee08791992-09-08 09:05:33 +00002633/* s.getsockopt() method.
2634 With two arguments, retrieves an integer option.
2635 With a third integer argument, retrieves a string buffer of that size;
2636 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002637
Guido van Rossum73624e91994-10-10 17:59:00 +00002638static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002639sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 int level;
2642 int optname;
2643 int res;
2644 PyObject *buf;
2645 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2648 &level, &optname, &buflen))
2649 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 if (buflen == 0) {
2652 int flag = 0;
2653 socklen_t flagsize = sizeof flag;
2654 res = getsockopt(s->sock_fd, level, optname,
2655 (void *)&flag, &flagsize);
2656 if (res < 0)
2657 return s->errorhandler();
2658 return PyLong_FromLong(flag);
2659 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002661 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 "getsockopt buflen out of range");
2663 return NULL;
2664 }
2665 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2666 if (buf == NULL)
2667 return NULL;
2668 res = getsockopt(s->sock_fd, level, optname,
2669 (void *)PyBytes_AS_STRING(buf), &buflen);
2670 if (res < 0) {
2671 Py_DECREF(buf);
2672 return s->errorhandler();
2673 }
2674 _PyBytes_Resize(&buf, buflen);
2675 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002676}
2677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002678PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002679"getsockopt(level, option[, buffersize]) -> value\n\
2680\n\
2681Get a socket option. See the Unix manual for level and option.\n\
2682If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002683string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002684
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002685
Fred Drake728819a2000-07-01 03:40:12 +00002686/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002687
Guido van Rossum73624e91994-10-10 17:59:00 +00002688static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002689sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 sock_addr_t addrbuf;
2692 int addrlen;
2693 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2696 return NULL;
2697 Py_BEGIN_ALLOW_THREADS
2698 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2699 Py_END_ALLOW_THREADS
2700 if (res < 0)
2701 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002702 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002703}
2704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002705PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706"bind(address)\n\
2707\n\
2708Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002709pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711
Guido van Rossum30a685f1991-06-27 15:51:29 +00002712
2713/* s.close() method.
2714 Set the file descriptor to -1 so operations tried subsequently
2715 will surely fail. */
2716
Guido van Rossum73624e91994-10-10 17:59:00 +00002717static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002718sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002721 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002722
Victor Stinner19a8e842016-03-21 16:36:48 +01002723 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002724 if (fd != INVALID_SOCKET) {
2725 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002726
2727 /* We do not want to retry upon EINTR: see
2728 http://lwn.net/Articles/576478/ and
2729 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2730 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002732 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002734 if (res < 0) {
2735 return s->errorhandler();
2736 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002738 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002739}
2740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742"close()\n\
2743\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002744Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002745
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002746static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002747sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002748{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002749 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002750 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002751 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002752}
2753
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002754PyDoc_STRVAR(detach_doc,
2755"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002756\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002757Close the socket object without closing the underlying file descriptor.\n\
2758The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002759can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002760
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002761static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002762sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002763{
Victor Stinner81c41db2015-04-02 11:50:57 +02002764 int err;
2765 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002766
Victor Stinner81c41db2015-04-02 11:50:57 +02002767 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2768 /* getsockopt() failed */
2769 return 0;
2770 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002771
Victor Stinner81c41db2015-04-02 11:50:57 +02002772 if (err == EISCONN)
2773 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002774 if (err != 0) {
2775 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2776 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002777 return 0;
2778 }
2779 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002780}
2781
2782static int
2783internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2784 int raise)
2785{
2786 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002787
2788 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002790 Py_END_ALLOW_THREADS
2791
Victor Stinner70a46f62015-03-31 22:03:59 +02002792 if (!res) {
2793 /* connect() succeeded, the socket is connected */
2794 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002796
Victor Stinner81c41db2015-04-02 11:50:57 +02002797 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002798
Victor Stinner81c41db2015-04-02 11:50:57 +02002799 /* save error, PyErr_CheckSignals() can replace it */
2800 err = GET_SOCK_ERROR;
2801 if (CHECK_ERRNO(EINTR)) {
2802 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002803 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002804
2805 /* Issue #23618: when connect() fails with EINTR, the connection is
2806 running asynchronously.
2807
2808 If the socket is blocking or has a timeout, wait until the
2809 connection completes, fails or timed out using select(), and then
2810 get the connection status using getsockopt(SO_ERROR).
2811
2812 If the socket is non-blocking, raise InterruptedError. The caller is
2813 responsible to wait until the connection completes, fails or timed
2814 out (it's the case in asyncio for example). */
2815 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2816 }
2817 else {
2818 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2819 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002820 }
2821
Victor Stinner81c41db2015-04-02 11:50:57 +02002822 if (!wait_connect) {
2823 if (raise) {
2824 /* restore error, maybe replaced by PyErr_CheckSignals() */
2825 SET_SOCK_ERROR(err);
2826 s->errorhandler();
2827 return -1;
2828 }
2829 else
2830 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002831 }
2832
Victor Stinner81c41db2015-04-02 11:50:57 +02002833 if (raise) {
2834 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002835 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2836 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002837 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002838 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002839 else {
2840 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002841 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2842 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002843 return err;
2844 }
2845 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002846}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002847
Fred Drake728819a2000-07-01 03:40:12 +00002848/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002849
Guido van Rossum73624e91994-10-10 17:59:00 +00002850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002851sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 sock_addr_t addrbuf;
2854 int addrlen;
2855 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2858 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002861 if (res < 0)
2862 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002863
Victor Stinneree699e92015-03-31 21:28:42 +02002864 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002865}
2866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002867PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002868"connect(address)\n\
2869\n\
2870Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002871is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002872
Guido van Rossum30a685f1991-06-27 15:51:29 +00002873
Fred Drake728819a2000-07-01 03:40:12 +00002874/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002875
2876static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002877sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 sock_addr_t addrbuf;
2880 int addrlen;
2881 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2884 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002885
Victor Stinner81c41db2015-04-02 11:50:57 +02002886 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002887 if (res < 0)
2888 return NULL;
2889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002891}
2892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002893PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002894"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002895\n\
2896This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002897instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002898
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002899
Guido van Rossumed233a51992-06-23 09:07:03 +00002900/* s.fileno() method */
2901
Guido van Rossum73624e91994-10-10 17:59:00 +00002902static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002903sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002909"fileno() -> integer\n\
2910\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912
Guido van Rossumed233a51992-06-23 09:07:03 +00002913
Guido van Rossumc89705d1992-11-26 08:54:07 +00002914/* s.getsockname() method */
2915
Guido van Rossum73624e91994-10-10 17:59:00 +00002916static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002917sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 sock_addr_t addrbuf;
2920 int res;
2921 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 if (!getsockaddrlen(s, &addrlen))
2924 return NULL;
2925 memset(&addrbuf, 0, addrlen);
2926 Py_BEGIN_ALLOW_THREADS
2927 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2928 Py_END_ALLOW_THREADS
2929 if (res < 0)
2930 return s->errorhandler();
2931 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2932 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002933}
2934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002935PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002936"getsockname() -> address info\n\
2937\n\
2938Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002939info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002940
Guido van Rossumc89705d1992-11-26 08:54:07 +00002941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002943/* s.getpeername() method */
2944
Guido van Rossum73624e91994-10-10 17:59:00 +00002945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 sock_addr_t addrbuf;
2949 int res;
2950 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 if (!getsockaddrlen(s, &addrlen))
2953 return NULL;
2954 memset(&addrbuf, 0, addrlen);
2955 Py_BEGIN_ALLOW_THREADS
2956 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2957 Py_END_ALLOW_THREADS
2958 if (res < 0)
2959 return s->errorhandler();
2960 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2961 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002962}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965"getpeername() -> address info\n\
2966\n\
2967Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969
Guido van Rossumb6775db1994-08-01 11:34:53 +00002970#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002971
2972
Guido van Rossum30a685f1991-06-27 15:51:29 +00002973/* s.listen(n) method */
2974
Guido van Rossum73624e91994-10-10 17:59:00 +00002975static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002976sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002977{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002978 /* We try to choose a default backlog high enough to avoid connection drops
2979 * for common workloads, yet not too high to limit resource usage. */
2980 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002982
Charles-François Natali644b8f52014-05-22 19:45:39 +01002983 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002987 /* To avoid problems on systems that don't allow a negative backlog
2988 * (which doesn't make sense anyway) we force a minimum value of 0. */
2989 if (backlog < 0)
2990 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 res = listen(s->sock_fd, backlog);
2992 Py_END_ALLOW_THREADS
2993 if (res < 0)
2994 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002995 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002996}
2997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002998PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002999"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003001Enable a server to accept connections. If backlog is specified, it must be\n\
3002at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003003unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003004connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005
Victor Stinner31bf2d52015-04-01 21:57:09 +02003006struct sock_recv {
3007 char *cbuf;
3008 Py_ssize_t len;
3009 int flags;
3010 Py_ssize_t result;
3011};
3012
3013static int
3014sock_recv_impl(PySocketSockObject *s, void *data)
3015{
3016 struct sock_recv *ctx = data;
3017
3018#ifdef MS_WINDOWS
3019 if (ctx->len > INT_MAX)
3020 ctx->len = INT_MAX;
3021 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3022#else
3023 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3024#endif
3025 return (ctx->result >= 0);
3026}
3027
Guido van Rossum82a5c661998-07-07 20:45:43 +00003028
Thomas Wouters477c8d52006-05-27 19:21:47 +00003029/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003030 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003031 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003032 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003033 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003034 * also possible that we return a number of bytes smaller than the request
3035 * bytes.
3036 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003037
Antoine Pitrou19467d22010-08-17 19:33:30 +00003038static Py_ssize_t
3039sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003040{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003041 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (!IS_SELECTABLE(s)) {
3044 select_error();
3045 return -1;
3046 }
3047 if (len == 0) {
3048 /* If 0 bytes were requested, do nothing. */
3049 return 0;
3050 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003051
Victor Stinner31bf2d52015-04-01 21:57:09 +02003052 ctx.cbuf = cbuf;
3053 ctx.len = len;
3054 ctx.flags = flags;
3055 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003057
3058 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003059}
3060
Guido van Rossum48a680c2001-03-02 06:34:14 +00003061
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003062/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003063
Guido van Rossum73624e91994-10-10 17:59:00 +00003064static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003065sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003066{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003067 Py_ssize_t recvlen, outlen;
3068 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003070
Antoine Pitrou19467d22010-08-17 19:33:30 +00003071 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 if (recvlen < 0) {
3075 PyErr_SetString(PyExc_ValueError,
3076 "negative buffersize in recv");
3077 return NULL;
3078 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 /* Allocate a new string. */
3081 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3082 if (buf == NULL)
3083 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 /* Call the guts */
3086 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3087 if (outlen < 0) {
3088 /* An error occurred, release the string and return an
3089 error. */
3090 Py_DECREF(buf);
3091 return NULL;
3092 }
3093 if (outlen != recvlen) {
3094 /* We did not read as many bytes as we anticipated, resize the
3095 string if possible and be successful. */
3096 _PyBytes_Resize(&buf, outlen);
3097 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003100}
3101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003102PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003103"recv(buffersize[, flags]) -> data\n\
3104\n\
3105Receive up to buffersize bytes from the socket. For the optional flags\n\
3106argument, see the Unix manual. When no data is available, block until\n\
3107at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003108the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003109
Guido van Rossum30a685f1991-06-27 15:51:29 +00003110
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003111/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003112
Thomas Wouters477c8d52006-05-27 19:21:47 +00003113static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003114sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117
Antoine Pitrou19467d22010-08-17 19:33:30 +00003118 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 Py_buffer pbuf;
3120 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003121 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003124 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 &pbuf, &recvlen, &flags))
3126 return NULL;
3127 buf = pbuf.buf;
3128 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 if (recvlen < 0) {
3131 PyBuffer_Release(&pbuf);
3132 PyErr_SetString(PyExc_ValueError,
3133 "negative buffersize in recv_into");
3134 return NULL;
3135 }
3136 if (recvlen == 0) {
3137 /* If nbytes was not specified, use the buffer's length */
3138 recvlen = buflen;
3139 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 /* Check if the buffer is large enough */
3142 if (buflen < recvlen) {
3143 PyBuffer_Release(&pbuf);
3144 PyErr_SetString(PyExc_ValueError,
3145 "buffer too small for requested bytes");
3146 return NULL;
3147 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 /* Call the guts */
3150 readlen = sock_recv_guts(s, buf, recvlen, flags);
3151 if (readlen < 0) {
3152 /* Return an error. */
3153 PyBuffer_Release(&pbuf);
3154 return NULL;
3155 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 PyBuffer_Release(&pbuf);
3158 /* Return the number of bytes read. Note that we do not do anything
3159 special here in the case that readlen < recvlen. */
3160 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003161}
3162
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003163PyDoc_STRVAR(recv_into_doc,
3164"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003165\n\
3166A version of recv() that stores its data into a buffer rather than creating \n\
3167a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3168is not specified (or 0), receive up to the size available in the given buffer.\n\
3169\n\
3170See recv() for documentation about the flags.");
3171
Victor Stinner31bf2d52015-04-01 21:57:09 +02003172struct sock_recvfrom {
3173 char* cbuf;
3174 Py_ssize_t len;
3175 int flags;
3176 socklen_t *addrlen;
3177 sock_addr_t *addrbuf;
3178 Py_ssize_t result;
3179};
3180
3181static int
3182sock_recvfrom_impl(PySocketSockObject *s, void *data)
3183{
3184 struct sock_recvfrom *ctx = data;
3185
3186 memset(ctx->addrbuf, 0, *ctx->addrlen);
3187
3188#ifdef MS_WINDOWS
3189 if (ctx->len > INT_MAX)
3190 ctx->len = INT_MAX;
3191 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3192 SAS2SA(ctx->addrbuf), ctx->addrlen);
3193#else
3194 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3195 SAS2SA(ctx->addrbuf), ctx->addrlen);
3196#endif
3197 return (ctx->result >= 0);
3198}
3199
Thomas Wouters477c8d52006-05-27 19:21:47 +00003200
3201/*
Christian Heimes99170a52007-12-19 02:07:34 +00003202 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3203 * into a char buffer. If you have any inc/def ref to do to the objects that
3204 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003205 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003206 * that it is also possible that we return a number of bytes smaller than the
3207 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003208 *
3209 * 'addr' is a return value for the address object. Note that you must decref
3210 * it yourself.
3211 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003212static Py_ssize_t
3213sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003218 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 if (!getsockaddrlen(s, &addrlen))
3223 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 if (!IS_SELECTABLE(s)) {
3226 select_error();
3227 return -1;
3228 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003229
Victor Stinner31bf2d52015-04-01 21:57:09 +02003230 ctx.cbuf = cbuf;
3231 ctx.len = len;
3232 ctx.flags = flags;
3233 ctx.addrbuf = &addrbuf;
3234 ctx.addrlen = &addrlen;
3235 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003237
Victor Stinner31bf2d52015-04-01 21:57:09 +02003238 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3239 s->sock_proto);
3240 if (*addr == NULL)
3241 return -1;
3242
3243 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003244}
3245
3246/* s.recvfrom(nbytes [,flags]) method */
3247
3248static PyObject *
3249sock_recvfrom(PySocketSockObject *s, PyObject *args)
3250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 PyObject *buf = NULL;
3252 PyObject *addr = NULL;
3253 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003254 int flags = 0;
3255 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256
Antoine Pitrou19467d22010-08-17 19:33:30 +00003257 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 if (recvlen < 0) {
3261 PyErr_SetString(PyExc_ValueError,
3262 "negative buffersize in recvfrom");
3263 return NULL;
3264 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3267 if (buf == NULL)
3268 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3271 recvlen, flags, &addr);
3272 if (outlen < 0) {
3273 goto finally;
3274 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 if (outlen != recvlen) {
3277 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003278 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003280 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 goto finally;
3282 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003285
3286finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 Py_XDECREF(buf);
3288 Py_XDECREF(addr);
3289 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003290}
3291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3294\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003295Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003296
Thomas Wouters477c8d52006-05-27 19:21:47 +00003297
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003298/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003299
3300static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003301sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304
Antoine Pitrou19467d22010-08-17 19:33:30 +00003305 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 Py_buffer pbuf;
3307 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003308 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003311
Antoine Pitrou19467d22010-08-17 19:33:30 +00003312 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 kwlist, &pbuf,
3314 &recvlen, &flags))
3315 return NULL;
3316 buf = pbuf.buf;
3317 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 if (recvlen < 0) {
3320 PyBuffer_Release(&pbuf);
3321 PyErr_SetString(PyExc_ValueError,
3322 "negative buffersize in recvfrom_into");
3323 return NULL;
3324 }
3325 if (recvlen == 0) {
3326 /* If nbytes was not specified, use the buffer's length */
3327 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003328 } else if (recvlen > buflen) {
3329 PyBuffer_Release(&pbuf);
3330 PyErr_SetString(PyExc_ValueError,
3331 "nbytes is greater than the length of the buffer");
3332 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3336 if (readlen < 0) {
3337 PyBuffer_Release(&pbuf);
3338 /* Return an error */
3339 Py_XDECREF(addr);
3340 return NULL;
3341 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 PyBuffer_Release(&pbuf);
3344 /* Return the number of bytes read and the address. Note that we do
3345 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003346 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347}
3348
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003349PyDoc_STRVAR(recvfrom_into_doc,
3350"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003351\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003352Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003353
Victor Stinner35bee932015-04-02 12:28:07 +02003354/* The sendmsg() and recvmsg[_into]() methods require a working
3355 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3356#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003357struct sock_recvmsg {
3358 struct msghdr *msg;
3359 int flags;
3360 ssize_t result;
3361};
3362
3363static int
3364sock_recvmsg_impl(PySocketSockObject *s, void *data)
3365{
3366 struct sock_recvmsg *ctx = data;
3367
3368 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3369 return (ctx->result >= 0);
3370}
3371
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003372/*
3373 * Call recvmsg() with the supplied iovec structures, flags, and
3374 * ancillary data buffer size (controllen). Returns the tuple return
3375 * value for recvmsg() or recvmsg_into(), with the first item provided
3376 * by the supplied makeval() function. makeval() will be called with
3377 * the length read and makeval_data as arguments, and must return a
3378 * new reference (which will be decrefed if there is a subsequent
3379 * error). On error, closes any file descriptors received via
3380 * SCM_RIGHTS.
3381 */
3382static PyObject *
3383sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3384 int flags, Py_ssize_t controllen,
3385 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3386{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003387 sock_addr_t addrbuf;
3388 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003389 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003390 PyObject *cmsg_list = NULL, *retval = NULL;
3391 void *controlbuf = NULL;
3392 struct cmsghdr *cmsgh;
3393 size_t cmsgdatalen = 0;
3394 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003395 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003396
3397 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3398 ignored" when the socket is connected (Linux fills them in
3399 anyway for AF_UNIX sockets at least). Normally msg_namelen
3400 seems to be set to 0 if there's no address, but try to
3401 initialize msg_name to something that won't be mistaken for a
3402 real address if that doesn't happen. */
3403 if (!getsockaddrlen(s, &addrbuflen))
3404 return NULL;
3405 memset(&addrbuf, 0, addrbuflen);
3406 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3407
3408 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3409 PyErr_SetString(PyExc_ValueError,
3410 "invalid ancillary data buffer length");
3411 return NULL;
3412 }
3413 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3414 return PyErr_NoMemory();
3415
3416 /* Make the system call. */
3417 if (!IS_SELECTABLE(s)) {
3418 select_error();
3419 goto finally;
3420 }
3421
Victor Stinner31bf2d52015-04-01 21:57:09 +02003422 msg.msg_name = SAS2SA(&addrbuf);
3423 msg.msg_namelen = addrbuflen;
3424 msg.msg_iov = iov;
3425 msg.msg_iovlen = iovlen;
3426 msg.msg_control = controlbuf;
3427 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003428
Victor Stinner31bf2d52015-04-01 21:57:09 +02003429 ctx.msg = &msg;
3430 ctx.flags = flags;
3431 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003433
3434 /* Make list of (level, type, data) tuples from control messages. */
3435 if ((cmsg_list = PyList_New(0)) == NULL)
3436 goto err_closefds;
3437 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3438 implementations didn't do so. */
3439 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3440 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3441 PyObject *bytes, *tuple;
3442 int tmp;
3443
3444 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3445 if (cmsg_status != 0) {
3446 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3447 "received malformed or improperly-truncated "
3448 "ancillary data", 1) == -1)
3449 goto err_closefds;
3450 }
3451 if (cmsg_status < 0)
3452 break;
3453 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003454 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455 goto err_closefds;
3456 }
3457
3458 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3459 cmsgdatalen);
3460 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3461 (int)cmsgh->cmsg_type, bytes);
3462 if (tuple == NULL)
3463 goto err_closefds;
3464 tmp = PyList_Append(cmsg_list, tuple);
3465 Py_DECREF(tuple);
3466 if (tmp != 0)
3467 goto err_closefds;
3468
3469 if (cmsg_status != 0)
3470 break;
3471 }
3472
3473 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003474 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003475 cmsg_list,
3476 (int)msg.msg_flags,
3477 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3478 ((msg.msg_namelen > addrbuflen) ?
3479 addrbuflen : msg.msg_namelen),
3480 s->sock_proto));
3481 if (retval == NULL)
3482 goto err_closefds;
3483
3484finally:
3485 Py_XDECREF(cmsg_list);
3486 PyMem_Free(controlbuf);
3487 return retval;
3488
3489err_closefds:
3490#ifdef SCM_RIGHTS
3491 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3492 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3493 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3494 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3495 if (cmsg_status < 0)
3496 break;
3497 if (cmsgh->cmsg_level == SOL_SOCKET &&
3498 cmsgh->cmsg_type == SCM_RIGHTS) {
3499 size_t numfds;
3500 int *fdp;
3501
3502 numfds = cmsgdatalen / sizeof(int);
3503 fdp = (int *)CMSG_DATA(cmsgh);
3504 while (numfds-- > 0)
3505 close(*fdp++);
3506 }
3507 if (cmsg_status != 0)
3508 break;
3509 }
3510#endif /* SCM_RIGHTS */
3511 goto finally;
3512}
3513
3514
3515static PyObject *
3516makeval_recvmsg(ssize_t received, void *data)
3517{
3518 PyObject **buf = data;
3519
3520 if (received < PyBytes_GET_SIZE(*buf))
3521 _PyBytes_Resize(buf, received);
3522 Py_XINCREF(*buf);
3523 return *buf;
3524}
3525
3526/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3527
3528static PyObject *
3529sock_recvmsg(PySocketSockObject *s, PyObject *args)
3530{
3531 Py_ssize_t bufsize, ancbufsize = 0;
3532 int flags = 0;
3533 struct iovec iov;
3534 PyObject *buf = NULL, *retval = NULL;
3535
3536 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3537 return NULL;
3538
3539 if (bufsize < 0) {
3540 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3541 return NULL;
3542 }
3543 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3544 return NULL;
3545 iov.iov_base = PyBytes_AS_STRING(buf);
3546 iov.iov_len = bufsize;
3547
3548 /* Note that we're passing a pointer to *our pointer* to the bytes
3549 object here (&buf); makeval_recvmsg() may incref the object, or
3550 deallocate it and set our pointer to NULL. */
3551 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3552 &makeval_recvmsg, &buf);
3553 Py_XDECREF(buf);
3554 return retval;
3555}
3556
3557PyDoc_STRVAR(recvmsg_doc,
3558"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3559\n\
3560Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3561socket. The ancbufsize argument sets the size in bytes of the\n\
3562internal buffer used to receive the ancillary data; it defaults to 0,\n\
3563meaning that no ancillary data will be received. Appropriate buffer\n\
3564sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3565CMSG_LEN(), and items which do not fit into the buffer might be\n\
3566truncated or discarded. The flags argument defaults to 0 and has the\n\
3567same meaning as for recv().\n\
3568\n\
3569The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3570The data item is a bytes object holding the non-ancillary data\n\
3571received. The ancdata item is a list of zero or more tuples\n\
3572(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3573(control messages) received: cmsg_level and cmsg_type are integers\n\
3574specifying the protocol level and protocol-specific type respectively,\n\
3575and cmsg_data is a bytes object holding the associated data. The\n\
3576msg_flags item is the bitwise OR of various flags indicating\n\
3577conditions on the received message; see your system documentation for\n\
3578details. If the receiving socket is unconnected, address is the\n\
3579address of the sending socket, if available; otherwise, its value is\n\
3580unspecified.\n\
3581\n\
3582If recvmsg() raises an exception after the system call returns, it\n\
3583will first attempt to close any file descriptors received via the\n\
3584SCM_RIGHTS mechanism.");
3585
3586
3587static PyObject *
3588makeval_recvmsg_into(ssize_t received, void *data)
3589{
3590 return PyLong_FromSsize_t(received);
3591}
3592
3593/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3594
3595static PyObject *
3596sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3597{
3598 Py_ssize_t ancbufsize = 0;
3599 int flags = 0;
3600 struct iovec *iovs = NULL;
3601 Py_ssize_t i, nitems, nbufs = 0;
3602 Py_buffer *bufs = NULL;
3603 PyObject *buffers_arg, *fast, *retval = NULL;
3604
3605 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3606 &buffers_arg, &ancbufsize, &flags))
3607 return NULL;
3608
3609 if ((fast = PySequence_Fast(buffers_arg,
3610 "recvmsg_into() argument 1 must be an "
3611 "iterable")) == NULL)
3612 return NULL;
3613 nitems = PySequence_Fast_GET_SIZE(fast);
3614 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003615 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003616 goto finally;
3617 }
3618
3619 /* Fill in an iovec for each item, and save the Py_buffer
3620 structs to release afterwards. */
3621 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3622 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3623 PyErr_NoMemory();
3624 goto finally;
3625 }
3626 for (; nbufs < nitems; nbufs++) {
3627 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3628 "w*;recvmsg_into() argument 1 must be an iterable "
3629 "of single-segment read-write buffers",
3630 &bufs[nbufs]))
3631 goto finally;
3632 iovs[nbufs].iov_base = bufs[nbufs].buf;
3633 iovs[nbufs].iov_len = bufs[nbufs].len;
3634 }
3635
3636 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3637 &makeval_recvmsg_into, NULL);
3638finally:
3639 for (i = 0; i < nbufs; i++)
3640 PyBuffer_Release(&bufs[i]);
3641 PyMem_Free(bufs);
3642 PyMem_Free(iovs);
3643 Py_DECREF(fast);
3644 return retval;
3645}
3646
3647PyDoc_STRVAR(recvmsg_into_doc,
3648"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3649\n\
3650Receive normal data and ancillary data from the socket, scattering the\n\
3651non-ancillary data into a series of buffers. The buffers argument\n\
3652must be an iterable of objects that export writable buffers\n\
3653(e.g. bytearray objects); these will be filled with successive chunks\n\
3654of the non-ancillary data until it has all been written or there are\n\
3655no more buffers. The ancbufsize argument sets the size in bytes of\n\
3656the internal buffer used to receive the ancillary data; it defaults to\n\
36570, meaning that no ancillary data will be received. Appropriate\n\
3658buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3659or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3660truncated or discarded. The flags argument defaults to 0 and has the\n\
3661same meaning as for recv().\n\
3662\n\
3663The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3664The nbytes item is the total number of bytes of non-ancillary data\n\
3665written into the buffers. The ancdata item is a list of zero or more\n\
3666tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3667data (control messages) received: cmsg_level and cmsg_type are\n\
3668integers specifying the protocol level and protocol-specific type\n\
3669respectively, and cmsg_data is a bytes object holding the associated\n\
3670data. The msg_flags item is the bitwise OR of various flags\n\
3671indicating conditions on the received message; see your system\n\
3672documentation for details. If the receiving socket is unconnected,\n\
3673address is the address of the sending socket, if available; otherwise,\n\
3674its value is unspecified.\n\
3675\n\
3676If recvmsg_into() raises an exception after the system call returns,\n\
3677it will first attempt to close any file descriptors received via the\n\
3678SCM_RIGHTS mechanism.");
3679#endif /* CMSG_LEN */
3680
3681
Victor Stinner31bf2d52015-04-01 21:57:09 +02003682struct sock_send {
3683 char *buf;
3684 Py_ssize_t len;
3685 int flags;
3686 Py_ssize_t result;
3687};
3688
3689static int
3690sock_send_impl(PySocketSockObject *s, void *data)
3691{
3692 struct sock_send *ctx = data;
3693
3694#ifdef MS_WINDOWS
3695 if (ctx->len > INT_MAX)
3696 ctx->len = INT_MAX;
3697 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3698#else
3699 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3700#endif
3701 return (ctx->result >= 0);
3702}
3703
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003704/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003705
Guido van Rossum73624e91994-10-10 17:59:00 +00003706static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003707sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003708{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003709 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003711 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3714 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 if (!IS_SELECTABLE(s)) {
3717 PyBuffer_Release(&pbuf);
3718 return select_error();
3719 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003720 ctx.buf = pbuf.buf;
3721 ctx.len = pbuf.len;
3722 ctx.flags = flags;
3723 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003724 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 return NULL;
3726 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003727 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003728
3729 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003730}
3731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003732PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003733"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003734\n\
3735Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003736argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003737sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003738
3739
3740/* s.sendall(data [,flags]) method */
3741
3742static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003743sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003746 Py_ssize_t len, n;
3747 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003749 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003750 int has_timeout = (s->sock_timeout > 0);
3751 _PyTime_t interval = s->sock_timeout;
3752 _PyTime_t deadline = 0;
3753 int deadline_initialized = 0;
3754 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3757 return NULL;
3758 buf = pbuf.buf;
3759 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 if (!IS_SELECTABLE(s)) {
3762 PyBuffer_Release(&pbuf);
3763 return select_error();
3764 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003767 if (has_timeout) {
3768 if (deadline_initialized) {
3769 /* recompute the timeout */
3770 interval = deadline - _PyTime_GetMonotonicClock();
3771 }
3772 else {
3773 deadline_initialized = 1;
3774 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3775 }
3776
3777 if (interval <= 0) {
3778 PyErr_SetString(socket_timeout, "timed out");
3779 goto done;
3780 }
3781 }
3782
Victor Stinner02f32ab2015-04-01 22:53:26 +02003783 ctx.buf = buf;
3784 ctx.len = len;
3785 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003786 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3787 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003788 n = ctx.result;
3789 assert(n >= 0);
3790
3791 buf += n;
3792 len -= n;
3793
3794 /* We must run our signal handlers before looping again.
3795 send() can return a successful partial write when it is
3796 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003797 if (PyErr_CheckSignals())
3798 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003799 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003801
Victor Stinner8912d142015-04-06 23:16:34 +02003802 Py_INCREF(Py_None);
3803 res = Py_None;
3804
3805done:
3806 PyBuffer_Release(&pbuf);
3807 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003808}
3809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003810PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003811"sendall(data[, flags])\n\
3812\n\
3813Send a data string to the socket. For the optional flags\n\
3814argument, see the Unix manual. This calls send() repeatedly\n\
3815until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003816to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003817
Guido van Rossum30a685f1991-06-27 15:51:29 +00003818
Victor Stinner31bf2d52015-04-01 21:57:09 +02003819struct sock_sendto {
3820 char *buf;
3821 Py_ssize_t len;
3822 int flags;
3823 int addrlen;
3824 sock_addr_t *addrbuf;
3825 Py_ssize_t result;
3826};
3827
3828static int
3829sock_sendto_impl(PySocketSockObject *s, void *data)
3830{
3831 struct sock_sendto *ctx = data;
3832
3833#ifdef MS_WINDOWS
3834 if (ctx->len > INT_MAX)
3835 ctx->len = INT_MAX;
3836 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3837 SAS2SA(ctx->addrbuf), ctx->addrlen);
3838#else
3839 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3840 SAS2SA(ctx->addrbuf), ctx->addrlen);
3841#endif
3842 return (ctx->result >= 0);
3843}
3844
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003845/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003846
Guido van Rossum73624e91994-10-10 17:59:00 +00003847static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003848sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 Py_buffer pbuf;
3851 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003852 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003854 int addrlen, flags;
3855 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003858 arglen = PyTuple_Size(args);
3859 switch (arglen) {
3860 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003861 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3862 return NULL;
3863 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003864 break;
3865 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003866 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3867 &pbuf, &flags, &addro)) {
3868 return NULL;
3869 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003870 break;
3871 default:
3872 PyErr_Format(PyExc_TypeError,
3873 "sendto() takes 2 or 3 arguments (%d given)",
3874 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003875 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 if (!IS_SELECTABLE(s)) {
3879 PyBuffer_Release(&pbuf);
3880 return select_error();
3881 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3884 PyBuffer_Release(&pbuf);
3885 return NULL;
3886 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003887
Victor Stinner31bf2d52015-04-01 21:57:09 +02003888 ctx.buf = pbuf.buf;
3889 ctx.len = pbuf.len;
3890 ctx.flags = flags;
3891 ctx.addrlen = addrlen;
3892 ctx.addrbuf = &addrbuf;
3893 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003894 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 return NULL;
3896 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003897 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003898
3899 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003900}
3901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003902PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003903"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003904\n\
3905Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003906For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003907
Guido van Rossum30a685f1991-06-27 15:51:29 +00003908
Victor Stinner35bee932015-04-02 12:28:07 +02003909/* The sendmsg() and recvmsg[_into]() methods require a working
3910 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3911#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003912struct sock_sendmsg {
3913 struct msghdr *msg;
3914 int flags;
3915 ssize_t result;
3916};
3917
3918static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003919sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3920 struct msghdr *msg,
3921 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3922 Py_ssize_t ndataparts, ndatabufs = 0;
3923 int result = -1;
3924 struct iovec *iovs = NULL;
3925 PyObject *data_fast = NULL;
3926 Py_buffer *databufs = NULL;
3927
3928 /* Fill in an iovec for each message part, and save the Py_buffer
3929 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003930 data_fast = PySequence_Fast(data_arg,
3931 "sendmsg() argument 1 must be an "
3932 "iterable");
3933 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003934 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003935 }
3936
Christian Heimesdffa3942016-09-05 23:54:41 +02003937 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3938 if (ndataparts > INT_MAX) {
3939 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3940 goto finally;
3941 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003942
Christian Heimesdffa3942016-09-05 23:54:41 +02003943 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003944 if (ndataparts > 0) {
3945 iovs = PyMem_New(struct iovec, ndataparts);
3946 if (iovs == NULL) {
3947 PyErr_NoMemory();
3948 goto finally;
3949 }
3950 msg->msg_iov = iovs;
3951
3952 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003953 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003954 PyErr_NoMemory();
3955 goto finally;
3956 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003957 }
3958 for (; ndatabufs < ndataparts; ndatabufs++) {
3959 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3960 "y*;sendmsg() argument 1 must be an iterable of "
3961 "bytes-like objects",
3962 &databufs[ndatabufs]))
3963 goto finally;
3964 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3965 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3966 }
3967 result = 0;
3968 finally:
3969 *databufsout = databufs;
3970 *ndatabufsout = ndatabufs;
3971 Py_XDECREF(data_fast);
3972 return result;
3973}
3974
3975static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003976sock_sendmsg_impl(PySocketSockObject *s, void *data)
3977{
3978 struct sock_sendmsg *ctx = data;
3979
3980 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3981 return (ctx->result >= 0);
3982}
3983
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003984/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3985
3986static PyObject *
3987sock_sendmsg(PySocketSockObject *s, PyObject *args)
3988{
Christian Heimesdffa3942016-09-05 23:54:41 +02003989 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003991 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003992 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003993 struct cmsginfo {
3994 int level;
3995 int type;
3996 Py_buffer data;
3997 } *cmsgs = NULL;
3998 void *controlbuf = NULL;
3999 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004000 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004001 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004002 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004003 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004004
4005 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004006 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004007 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004008 }
4009
4010 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004011
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004012 /* Parse destination address. */
4013 if (addr_arg != NULL && addr_arg != Py_None) {
4014 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4015 goto finally;
4016 msg.msg_name = &addrbuf;
4017 msg.msg_namelen = addrlen;
4018 }
4019
4020 /* Fill in an iovec for each message part, and save the Py_buffer
4021 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004022 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004023 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004024 }
4025
4026 if (cmsg_arg == NULL)
4027 ncmsgs = 0;
4028 else {
4029 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4030 "sendmsg() argument 2 must be an "
4031 "iterable")) == NULL)
4032 goto finally;
4033 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4034 }
4035
4036#ifndef CMSG_SPACE
4037 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004038 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004039 "sending multiple control messages is not supported "
4040 "on this system");
4041 goto finally;
4042 }
4043#endif
4044 /* Save level, type and Py_buffer for each control message,
4045 and calculate total size. */
4046 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4047 PyErr_NoMemory();
4048 goto finally;
4049 }
4050 controllen = controllen_last = 0;
4051 while (ncmsgbufs < ncmsgs) {
4052 size_t bufsize, space;
4053
4054 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4055 "(iiy*):[sendmsg() ancillary data items]",
4056 &cmsgs[ncmsgbufs].level,
4057 &cmsgs[ncmsgbufs].type,
4058 &cmsgs[ncmsgbufs].data))
4059 goto finally;
4060 bufsize = cmsgs[ncmsgbufs++].data.len;
4061
4062#ifdef CMSG_SPACE
4063 if (!get_CMSG_SPACE(bufsize, &space)) {
4064#else
4065 if (!get_CMSG_LEN(bufsize, &space)) {
4066#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004067 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004068 goto finally;
4069 }
4070 controllen += space;
4071 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004072 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073 goto finally;
4074 }
4075 controllen_last = controllen;
4076 }
4077
4078 /* Construct ancillary data block from control message info. */
4079 if (ncmsgbufs > 0) {
4080 struct cmsghdr *cmsgh = NULL;
4081
Victor Stinner52d61e42016-09-12 11:41:58 +02004082 controlbuf = PyMem_Malloc(controllen);
4083 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084 PyErr_NoMemory();
4085 goto finally;
4086 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004087 msg.msg_control = controlbuf;
4088
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 msg.msg_controllen = controllen;
4090
4091 /* Need to zero out the buffer as a workaround for glibc's
4092 CMSG_NXTHDR() implementation. After getting the pointer to
4093 the next header, it checks its (uninitialized) cmsg_len
4094 member to see if the "message" fits in the buffer, and
4095 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004096 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004097 memset(controlbuf, 0, controllen);
4098
4099 for (i = 0; i < ncmsgbufs; i++) {
4100 size_t msg_len, data_len = cmsgs[i].data.len;
4101 int enough_space = 0;
4102
4103 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4104 if (cmsgh == NULL) {
4105 PyErr_Format(PyExc_RuntimeError,
4106 "unexpected NULL result from %s()",
4107 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4108 goto finally;
4109 }
4110 if (!get_CMSG_LEN(data_len, &msg_len)) {
4111 PyErr_SetString(PyExc_RuntimeError,
4112 "item size out of range for CMSG_LEN()");
4113 goto finally;
4114 }
4115 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4116 size_t space;
4117
4118 cmsgh->cmsg_len = msg_len;
4119 if (get_cmsg_data_space(&msg, cmsgh, &space))
4120 enough_space = (space >= data_len);
4121 }
4122 if (!enough_space) {
4123 PyErr_SetString(PyExc_RuntimeError,
4124 "ancillary data does not fit in calculated "
4125 "space");
4126 goto finally;
4127 }
4128 cmsgh->cmsg_level = cmsgs[i].level;
4129 cmsgh->cmsg_type = cmsgs[i].type;
4130 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4131 }
4132 }
4133
4134 /* Make the system call. */
4135 if (!IS_SELECTABLE(s)) {
4136 select_error();
4137 goto finally;
4138 }
4139
Victor Stinner31bf2d52015-04-01 21:57:09 +02004140 ctx.msg = &msg;
4141 ctx.flags = flags;
4142 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004143 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004144
4145 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004146
4147finally:
4148 PyMem_Free(controlbuf);
4149 for (i = 0; i < ncmsgbufs; i++)
4150 PyBuffer_Release(&cmsgs[i].data);
4151 PyMem_Free(cmsgs);
4152 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004153 PyMem_Free(msg.msg_iov);
4154 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004155 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004156 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004157 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004158 return retval;
4159}
4160
4161PyDoc_STRVAR(sendmsg_doc,
4162"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4163\n\
4164Send normal and ancillary data to the socket, gathering the\n\
4165non-ancillary data from a series of buffers and concatenating it into\n\
4166a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004167data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004168The ancdata argument specifies the ancillary data (control messages)\n\
4169as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4170cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4171protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004172is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173argument defaults to 0 and has the same meaning as for send(). If\n\
4174address is supplied and not None, it sets a destination address for\n\
4175the message. The return value is the number of bytes of non-ancillary\n\
4176data sent.");
4177#endif /* CMSG_LEN */
4178
Christian Heimesdffa3942016-09-05 23:54:41 +02004179#ifdef HAVE_SOCKADDR_ALG
4180static PyObject*
4181sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4182{
4183 PyObject *retval = NULL;
4184
4185 Py_ssize_t i, ndatabufs = 0;
4186 Py_buffer *databufs = NULL;
4187 PyObject *data_arg = NULL;
4188
4189 Py_buffer iv = {NULL, NULL};
4190
4191 PyObject *opobj = NULL;
4192 int op = -1;
4193
4194 PyObject *assoclenobj = NULL;
4195 int assoclen = -1;
4196
4197 unsigned int *uiptr;
4198 int flags = 0;
4199
4200 struct msghdr msg;
4201 struct cmsghdr *header = NULL;
4202 struct af_alg_iv *alg_iv = NULL;
4203 struct sock_sendmsg ctx;
4204 Py_ssize_t controllen;
4205 void *controlbuf = NULL;
4206 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4207
4208 if (self->sock_family != AF_ALG) {
4209 PyErr_SetString(PyExc_OSError,
4210 "algset is only supported for AF_ALG");
4211 return NULL;
4212 }
4213
4214 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4215 "|O$O!y*O!i:sendmsg_afalg", keywords,
4216 &data_arg,
4217 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004218 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004219 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004220 }
4221
4222 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004223
4224 /* op is a required, keyword-only argument >= 0 */
4225 if (opobj != NULL) {
4226 op = _PyLong_AsInt(opobj);
4227 }
4228 if (op < 0) {
4229 /* override exception from _PyLong_AsInt() */
4230 PyErr_SetString(PyExc_TypeError,
4231 "Invalid or missing argument 'op'");
4232 goto finally;
4233 }
4234 /* assoclen is optional but must be >= 0 */
4235 if (assoclenobj != NULL) {
4236 assoclen = _PyLong_AsInt(assoclenobj);
4237 if (assoclen == -1 && PyErr_Occurred()) {
4238 goto finally;
4239 }
4240 if (assoclen < 0) {
4241 PyErr_SetString(PyExc_TypeError,
4242 "assoclen must be positive");
4243 goto finally;
4244 }
4245 }
4246
4247 controllen = CMSG_SPACE(4);
4248 if (iv.buf != NULL) {
4249 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4250 }
4251 if (assoclen >= 0) {
4252 controllen += CMSG_SPACE(4);
4253 }
4254
4255 controlbuf = PyMem_Malloc(controllen);
4256 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004257 PyErr_NoMemory();
4258 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004259 }
4260 memset(controlbuf, 0, controllen);
4261
Christian Heimesdffa3942016-09-05 23:54:41 +02004262 msg.msg_controllen = controllen;
4263 msg.msg_control = controlbuf;
4264
4265 /* Fill in an iovec for each message part, and save the Py_buffer
4266 structs to release afterwards. */
4267 if (data_arg != NULL) {
4268 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4269 goto finally;
4270 }
4271 }
4272
4273 /* set operation to encrypt or decrypt */
4274 header = CMSG_FIRSTHDR(&msg);
4275 if (header == NULL) {
4276 PyErr_SetString(PyExc_RuntimeError,
4277 "unexpected NULL result from CMSG_FIRSTHDR");
4278 goto finally;
4279 }
4280 header->cmsg_level = SOL_ALG;
4281 header->cmsg_type = ALG_SET_OP;
4282 header->cmsg_len = CMSG_LEN(4);
4283 uiptr = (void*)CMSG_DATA(header);
4284 *uiptr = (unsigned int)op;
4285
4286 /* set initialization vector */
4287 if (iv.buf != NULL) {
4288 header = CMSG_NXTHDR(&msg, header);
4289 if (header == NULL) {
4290 PyErr_SetString(PyExc_RuntimeError,
4291 "unexpected NULL result from CMSG_NXTHDR(iv)");
4292 goto finally;
4293 }
4294 header->cmsg_level = SOL_ALG;
4295 header->cmsg_type = ALG_SET_IV;
4296 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4297 alg_iv = (void*)CMSG_DATA(header);
4298 alg_iv->ivlen = iv.len;
4299 memcpy(alg_iv->iv, iv.buf, iv.len);
4300 }
4301
4302 /* set length of associated data for AEAD */
4303 if (assoclen >= 0) {
4304 header = CMSG_NXTHDR(&msg, header);
4305 if (header == NULL) {
4306 PyErr_SetString(PyExc_RuntimeError,
4307 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4308 goto finally;
4309 }
4310 header->cmsg_level = SOL_ALG;
4311 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4312 header->cmsg_len = CMSG_LEN(4);
4313 uiptr = (void*)CMSG_DATA(header);
4314 *uiptr = (unsigned int)assoclen;
4315 }
4316
4317 ctx.msg = &msg;
4318 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004319 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004320 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004321 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004322
4323 retval = PyLong_FromSsize_t(ctx.result);
4324
4325 finally:
4326 PyMem_Free(controlbuf);
4327 if (iv.buf != NULL) {
4328 PyBuffer_Release(&iv);
4329 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004330 PyMem_Free(msg.msg_iov);
4331 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004332 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004333 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004334 PyMem_Free(databufs);
4335 return retval;
4336}
4337
4338PyDoc_STRVAR(sendmsg_afalg_doc,
4339"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4340\n\
4341Set operation mode, IV and length of associated data for an AF_ALG\n\
4342operation socket.");
4343#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004344
Guido van Rossum30a685f1991-06-27 15:51:29 +00004345/* s.shutdown(how) method */
4346
Guido van Rossum73624e91994-10-10 17:59:00 +00004347static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004348sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 int how;
4351 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004352
Serhiy Storchaka78980432013-01-15 01:12:17 +02004353 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 if (how == -1 && PyErr_Occurred())
4355 return NULL;
4356 Py_BEGIN_ALLOW_THREADS
4357 res = shutdown(s->sock_fd, how);
4358 Py_END_ALLOW_THREADS
4359 if (res < 0)
4360 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004361 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004362}
4363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004364PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004365"shutdown(flag)\n\
4366\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004367Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4368of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004369
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004370#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004371static PyObject*
4372sock_ioctl(PySocketSockObject *s, PyObject *arg)
4373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 unsigned long cmd = SIO_RCVALL;
4375 PyObject *argO;
4376 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004378 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4379 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 switch (cmd) {
4382 case SIO_RCVALL: {
4383 unsigned int option = RCVALL_ON;
4384 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4385 return NULL;
4386 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4387 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4388 return set_error();
4389 }
4390 return PyLong_FromUnsignedLong(recv); }
4391 case SIO_KEEPALIVE_VALS: {
4392 struct tcp_keepalive ka;
4393 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4394 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4395 return NULL;
4396 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4397 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4398 return set_error();
4399 }
4400 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004401#if defined(SIO_LOOPBACK_FAST_PATH)
4402 case SIO_LOOPBACK_FAST_PATH: {
4403 unsigned int option;
4404 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4405 return NULL;
4406 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4407 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4408 return set_error();
4409 }
4410 return PyLong_FromUnsignedLong(recv); }
4411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 default:
4413 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4414 return NULL;
4415 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004416}
4417PyDoc_STRVAR(sock_ioctl_doc,
4418"ioctl(cmd, option) -> long\n\
4419\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004420Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4421SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004422SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4423SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004424#endif
4425
4426#if defined(MS_WINDOWS)
4427static PyObject*
4428sock_share(PySocketSockObject *s, PyObject *arg)
4429{
4430 WSAPROTOCOL_INFO info;
4431 DWORD processId;
4432 int result;
4433
4434 if (!PyArg_ParseTuple(arg, "I", &processId))
4435 return NULL;
4436
4437 Py_BEGIN_ALLOW_THREADS
4438 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4439 Py_END_ALLOW_THREADS
4440 if (result == SOCKET_ERROR)
4441 return set_error();
4442 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4443}
4444PyDoc_STRVAR(sock_share_doc,
4445"share(process_id) -> bytes\n\
4446\n\
4447Share the socket with another process. The target process id\n\
4448must be provided and the resulting bytes object passed to the target\n\
4449process. There the shared socket can be instantiated by calling\n\
4450socket.fromshare().");
4451
Christian Heimesfaf2f632008-01-06 16:59:19 +00004452
4453#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004454
4455/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004456
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004457static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4459 accept_doc},
4460 {"bind", (PyCFunction)sock_bind, METH_O,
4461 bind_doc},
4462 {"close", (PyCFunction)sock_close, METH_NOARGS,
4463 close_doc},
4464 {"connect", (PyCFunction)sock_connect, METH_O,
4465 connect_doc},
4466 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4467 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004468 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4469 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4471 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004472#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 {"getpeername", (PyCFunction)sock_getpeername,
4474 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 {"getsockname", (PyCFunction)sock_getsockname,
4477 METH_NOARGS, getsockname_doc},
4478 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4479 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004480#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4482 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004483#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004484#if defined(MS_WINDOWS)
4485 {"share", (PyCFunction)sock_share, METH_VARARGS,
4486 sock_share_doc},
4487#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004488 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 listen_doc},
4490 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4491 recv_doc},
4492 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4493 recv_into_doc},
4494 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4495 recvfrom_doc},
4496 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4497 recvfrom_into_doc},
4498 {"send", (PyCFunction)sock_send, METH_VARARGS,
4499 send_doc},
4500 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4501 sendall_doc},
4502 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4503 sendto_doc},
4504 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4505 setblocking_doc},
4506 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4507 settimeout_doc},
4508 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4509 gettimeout_doc},
4510 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4511 setsockopt_doc},
4512 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4513 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004514#ifdef CMSG_LEN
4515 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4516 recvmsg_doc},
4517 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4518 recvmsg_into_doc,},
4519 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4520 sendmsg_doc},
4521#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004522#ifdef HAVE_SOCKADDR_ALG
4523 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4524 sendmsg_afalg_doc},
4525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004527};
4528
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004529/* SockObject members */
4530static PyMemberDef sock_memberlist[] = {
4531 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4532 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4533 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004534 {0},
4535};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004536
Victor Stinner71694d52015-03-28 01:18:54 +01004537static PyGetSetDef sock_getsetlist[] = {
4538 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4539 {NULL} /* sentinel */
4540};
4541
Guido van Rossum73624e91994-10-10 17:59:00 +00004542/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004543 First close the file description. */
4544
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004545static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004546sock_finalize(PySocketSockObject *s)
4547{
4548 SOCKET_T fd;
4549 PyObject *error_type, *error_value, *error_traceback;
4550
4551 /* Save the current exception, if any. */
4552 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4553
Victor Stinnerd3afb622016-07-22 17:47:09 +02004554 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004555 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4556 /* Spurious errors can appear at shutdown */
4557 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4558 PyErr_WriteUnraisable((PyObject *)s);
4559 }
4560 }
4561
4562 /* Only close the socket *after* logging the ResourceWarning warning
4563 to allow the logger to call socket methods like
4564 socket.getsockname(). If the socket is closed before, socket
4565 methods fails with the EBADF error. */
4566 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004567 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004568
4569 /* We do not want to retry upon EINTR: see sock_close() */
4570 Py_BEGIN_ALLOW_THREADS
4571 (void) SOCKETCLOSE(fd);
4572 Py_END_ALLOW_THREADS
4573 }
4574
4575 /* Restore the saved exception. */
4576 PyErr_Restore(error_type, error_value, error_traceback);
4577}
4578
4579static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004580sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004581{
Victor Stinner19a8e842016-03-21 16:36:48 +01004582 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4583 return;
4584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004586}
4587
Guido van Rossum30a685f1991-06-27 15:51:29 +00004588
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004590sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004591{
Victor Stinnere254e532014-07-26 14:36:55 +02004592 long sock_fd;
4593 /* On Windows, this test is needed because SOCKET_T is unsigned */
4594 if (s->sock_fd == INVALID_SOCKET) {
4595 sock_fd = -1;
4596 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004597#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004598 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 /* this can occur on Win64, and actually there is a special
4600 ugly printf formatter for decimal pointer length integer
4601 printing, only bother if necessary*/
4602 PyErr_SetString(PyExc_OverflowError,
4603 "no printf formatter to display "
4604 "the socket descriptor in decimal");
4605 return NULL;
4606 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004607#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004608 else
4609 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 return PyUnicode_FromFormat(
4611 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004612 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 s->sock_type,
4614 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004615}
4616
4617
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004618/* Create a new, uninitialized socket object. */
4619
4620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004621sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 new = type->tp_alloc(type, 0);
4626 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004627 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004628 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 ((PySocketSockObject *)new)->errorhandler = &set_error;
4630 }
4631 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004632}
4633
4634
4635/* Initialize a new socket object. */
4636
Victor Stinnerdaf45552013-08-28 00:53:59 +02004637#ifdef SOCK_CLOEXEC
4638/* socket() and socketpair() fail with EINVAL on Linux kernel older
4639 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4640static int sock_cloexec_works = -1;
4641#endif
4642
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004643/*ARGSUSED*/
4644static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004645sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 PySocketSockObject *s = (PySocketSockObject *)self;
4648 PyObject *fdobj = NULL;
4649 SOCKET_T fd = INVALID_SOCKET;
4650 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4651 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004652#ifndef MS_WINDOWS
4653#ifdef SOCK_CLOEXEC
4654 int *atomic_flag_works = &sock_cloexec_works;
4655#else
4656 int *atomic_flag_works = NULL;
4657#endif
4658#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4661 "|iiiO:socket", keywords,
4662 &family, &type, &proto, &fdobj))
4663 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004666#ifdef MS_WINDOWS
4667 /* recreate a socket that was duplicated */
4668 if (PyBytes_Check(fdobj)) {
4669 WSAPROTOCOL_INFO info;
4670 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4671 PyErr_Format(PyExc_ValueError,
4672 "socket descriptor string has wrong size, "
4673 "should be %zu bytes.", sizeof(info));
4674 return -1;
4675 }
4676 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4677 Py_BEGIN_ALLOW_THREADS
4678 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4679 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4680 Py_END_ALLOW_THREADS
4681 if (fd == INVALID_SOCKET) {
4682 set_error();
4683 return -1;
4684 }
4685 family = info.iAddressFamily;
4686 type = info.iSocketType;
4687 proto = info.iProtocol;
4688 }
4689 else
4690#endif
4691 {
4692 fd = PyLong_AsSocket_t(fdobj);
4693 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4694 return -1;
4695 if (fd == INVALID_SOCKET) {
4696 PyErr_SetString(PyExc_ValueError,
4697 "can't use invalid socket value");
4698 return -1;
4699 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 }
4701 }
4702 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004703#ifdef MS_WINDOWS
4704 /* Windows implementation */
4705#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4706#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4707#endif
4708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004710 if (support_wsa_no_inherit) {
4711 fd = WSASocket(family, type, proto,
4712 NULL, 0,
4713 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4714 if (fd == INVALID_SOCKET) {
4715 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4716 support_wsa_no_inherit = 0;
4717 fd = socket(family, type, proto);
4718 }
4719 }
4720 else {
4721 fd = socket(family, type, proto);
4722 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 if (fd == INVALID_SOCKET) {
4726 set_error();
4727 return -1;
4728 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004729
4730 if (!support_wsa_no_inherit) {
4731 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4732 closesocket(fd);
4733 PyErr_SetFromWindowsErr(0);
4734 return -1;
4735 }
4736 }
4737#else
4738 /* UNIX */
4739 Py_BEGIN_ALLOW_THREADS
4740#ifdef SOCK_CLOEXEC
4741 if (sock_cloexec_works != 0) {
4742 fd = socket(family, type | SOCK_CLOEXEC, proto);
4743 if (sock_cloexec_works == -1) {
4744 if (fd >= 0) {
4745 sock_cloexec_works = 1;
4746 }
4747 else if (errno == EINVAL) {
4748 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4749 sock_cloexec_works = 0;
4750 fd = socket(family, type, proto);
4751 }
4752 }
4753 }
4754 else
4755#endif
4756 {
4757 fd = socket(family, type, proto);
4758 }
4759 Py_END_ALLOW_THREADS
4760
4761 if (fd == INVALID_SOCKET) {
4762 set_error();
4763 return -1;
4764 }
4765
4766 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4767 SOCKETCLOSE(fd);
4768 return -1;
4769 }
4770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004772 if (init_sockobject(s, fd, family, type, proto) == -1) {
4773 SOCKETCLOSE(fd);
4774 return -1;
4775 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004778
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004779}
4780
4781
Guido van Rossumb6775db1994-08-01 11:34:53 +00004782/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004783
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004784static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4786 "_socket.socket", /* tp_name */
4787 sizeof(PySocketSockObject), /* tp_basicsize */
4788 0, /* tp_itemsize */
4789 (destructor)sock_dealloc, /* tp_dealloc */
4790 0, /* tp_print */
4791 0, /* tp_getattr */
4792 0, /* tp_setattr */
4793 0, /* tp_reserved */
4794 (reprfunc)sock_repr, /* tp_repr */
4795 0, /* tp_as_number */
4796 0, /* tp_as_sequence */
4797 0, /* tp_as_mapping */
4798 0, /* tp_hash */
4799 0, /* tp_call */
4800 0, /* tp_str */
4801 PyObject_GenericGetAttr, /* tp_getattro */
4802 0, /* tp_setattro */
4803 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004804 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4805 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 sock_doc, /* tp_doc */
4807 0, /* tp_traverse */
4808 0, /* tp_clear */
4809 0, /* tp_richcompare */
4810 0, /* tp_weaklistoffset */
4811 0, /* tp_iter */
4812 0, /* tp_iternext */
4813 sock_methods, /* tp_methods */
4814 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004815 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 0, /* tp_base */
4817 0, /* tp_dict */
4818 0, /* tp_descr_get */
4819 0, /* tp_descr_set */
4820 0, /* tp_dictoffset */
4821 sock_initobj, /* tp_init */
4822 PyType_GenericAlloc, /* tp_alloc */
4823 sock_new, /* tp_new */
4824 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004825 0, /* tp_is_gc */
4826 0, /* tp_bases */
4827 0, /* tp_mro */
4828 0, /* tp_cache */
4829 0, /* tp_subclasses */
4830 0, /* tp_weaklist */
4831 0, /* tp_del */
4832 0, /* tp_version_tag */
4833 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004834};
4835
Guido van Rossum30a685f1991-06-27 15:51:29 +00004836
Guido van Rossum81194471991-07-27 21:42:02 +00004837/* Python interface to gethostname(). */
4838
4839/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004840static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004841socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004842{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004843#ifdef MS_WINDOWS
4844 /* Don't use winsock's gethostname, as this returns the ANSI
4845 version of the hostname, whereas we need a Unicode string.
4846 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004847 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004848 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004849 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004850 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004851
4852 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004853 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004854
4855 if (GetLastError() != ERROR_MORE_DATA)
4856 return PyErr_SetFromWindowsErr(0);
4857
4858 if (size == 0)
4859 return PyUnicode_New(0, 0);
4860
4861 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4862 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004863 name = PyMem_New(wchar_t, size);
4864 if (!name) {
4865 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004866 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004867 }
Victor Stinner74168972011-11-17 01:11:36 +01004868 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4869 name,
4870 &size))
4871 {
4872 PyMem_Free(name);
4873 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004874 }
Victor Stinner74168972011-11-17 01:11:36 +01004875
4876 result = PyUnicode_FromWideChar(name, size);
4877 PyMem_Free(name);
4878 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004879#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 char buf[1024];
4881 int res;
4882 Py_BEGIN_ALLOW_THREADS
4883 res = gethostname(buf, (int) sizeof buf - 1);
4884 Py_END_ALLOW_THREADS
4885 if (res < 0)
4886 return set_error();
4887 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004888 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004889#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004890}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004892PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004893"gethostname() -> string\n\
4894\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004895Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004896
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004897#ifdef HAVE_SETHOSTNAME
4898PyDoc_STRVAR(sethostname_doc,
4899"sethostname(name)\n\n\
4900Sets the hostname to name.");
4901
4902static PyObject *
4903socket_sethostname(PyObject *self, PyObject *args)
4904{
4905 PyObject *hnobj;
4906 Py_buffer buf;
4907 int res, flag = 0;
4908
Christian Heimesd2774c72013-06-19 02:06:29 +02004909#ifdef _AIX
4910/* issue #18259, not declared in any useful header file */
4911extern int sethostname(const char *, size_t);
4912#endif
4913
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004914 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4915 PyErr_Clear();
4916 if (!PyArg_ParseTuple(args, "O&:sethostname",
4917 PyUnicode_FSConverter, &hnobj))
4918 return NULL;
4919 flag = 1;
4920 }
4921 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4922 if (!res) {
4923 res = sethostname(buf.buf, buf.len);
4924 PyBuffer_Release(&buf);
4925 }
4926 if (flag)
4927 Py_DECREF(hnobj);
4928 if (res)
4929 return set_error();
4930 Py_RETURN_NONE;
4931}
4932#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004933
Guido van Rossum30a685f1991-06-27 15:51:29 +00004934/* Python interface to gethostbyname(name). */
4935
4936/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004937static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004938socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 char *name;
4941 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004942 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004943
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004944 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 return NULL;
4946 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004947 goto finally;
4948 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4949finally:
4950 PyMem_Free(name);
4951 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004952}
4953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004954PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004955"gethostbyname(host) -> address\n\
4956\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004957Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004958
4959
Victor Stinner72400302016-01-28 15:41:01 +01004960static PyObject*
4961sock_decode_hostname(const char *name)
4962{
4963#ifdef MS_WINDOWS
4964 /* Issue #26227: gethostbyaddr() returns a string encoded
4965 * to the ANSI code page */
4966 return PyUnicode_DecodeFSDefault(name);
4967#else
4968 /* Decode from UTF-8 */
4969 return PyUnicode_FromString(name);
4970#endif
4971}
4972
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004973/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4974
4975static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004976gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 char **pch;
4979 PyObject *rtn_tuple = (PyObject *)NULL;
4980 PyObject *name_list = (PyObject *)NULL;
4981 PyObject *addr_list = (PyObject *)NULL;
4982 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004983 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 if (h == NULL) {
4986 /* Let's get real error message to return */
4987 set_herror(h_errno);
4988 return NULL;
4989 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 if (h->h_addrtype != af) {
4992 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004993 errno = EAFNOSUPPORT;
4994 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 return NULL;
4996 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 case AF_INET:
5001 if (alen < sizeof(struct sockaddr_in))
5002 return NULL;
5003 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005004
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005005#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 case AF_INET6:
5007 if (alen < sizeof(struct sockaddr_in6))
5008 return NULL;
5009 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005010#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 if ((name_list = PyList_New(0)) == NULL)
5015 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 if ((addr_list = PyList_New(0)) == NULL)
5018 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 /* SF #1511317: h_aliases can be NULL */
5021 if (h->h_aliases) {
5022 for (pch = h->h_aliases; *pch != NULL; pch++) {
5023 int status;
5024 tmp = PyUnicode_FromString(*pch);
5025 if (tmp == NULL)
5026 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 status = PyList_Append(name_list, tmp);
5029 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 if (status)
5032 goto err;
5033 }
5034 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5037 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 case AF_INET:
5042 {
5043 struct sockaddr_in sin;
5044 memset(&sin, 0, sizeof(sin));
5045 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005046#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5050 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 if (pch == h->h_addr_list && alen >= sizeof(sin))
5053 memcpy((char *) addr, &sin, sizeof(sin));
5054 break;
5055 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005056
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005057#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 case AF_INET6:
5059 {
5060 struct sockaddr_in6 sin6;
5061 memset(&sin6, 0, sizeof(sin6));
5062 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005063#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5067 tmp = makeipaddr((struct sockaddr *)&sin6,
5068 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5071 memcpy((char *) addr, &sin6, sizeof(sin6));
5072 break;
5073 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005074#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005077 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 "unsupported address family");
5079 return NULL;
5080 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 if (tmp == NULL)
5083 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 status = PyList_Append(addr_list, tmp);
5086 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 if (status)
5089 goto err;
5090 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005091
Victor Stinner72400302016-01-28 15:41:01 +01005092 name = sock_decode_hostname(h->h_name);
5093 if (name == NULL)
5094 goto err;
5095 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005096
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005097 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 Py_XDECREF(name_list);
5099 Py_XDECREF(addr_list);
5100 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005101}
5102
5103
5104/* Python interface to gethostbyname_ex(name). */
5105
5106/*ARGSUSED*/
5107static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005108socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 char *name;
5111 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005112 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005114 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005115#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005117#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005119#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 char buf[16384];
5121 int buf_len = (sizeof buf) - 1;
5122 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005123#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005124#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005126#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005127#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005128
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005129 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005131 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005132 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005134#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005135#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005136 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005138#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005140#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 memset((void *) &data, '\0', sizeof(data));
5142 result = gethostbyname_r(name, &hp_allocated, &data);
5143 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005144#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005145#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005146#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005150#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 Py_END_ALLOW_THREADS
5152 /* Some C libraries would require addr.__ss_family instead of
5153 addr.ss_family.
5154 Therefore, we cast the sockaddr_storage into sockaddr to
5155 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005156 sa = SAS2SA(&addr);
5157 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005159#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005161#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005162finally:
5163 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005165}
5166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005167PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005168"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5169\n\
5170Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005171for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005172
5173
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005174/* Python interface to gethostbyaddr(IP). */
5175
5176/*ARGSUSED*/
5177static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005178socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005179{
Charles-François Natali8b759652011-12-23 16:44:51 +01005180 sock_addr_t addr;
5181 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 char *ip_num;
5183 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005184 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005185#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005187#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005189#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 /* glibcs up to 2.10 assume that the buf argument to
5191 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5192 does not ensure. The attribute below instructs the compiler
5193 to maintain this alignment. */
5194 char buf[16384] Py_ALIGNED(8);
5195 int buf_len = (sizeof buf) - 1;
5196 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005197#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005198#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005200#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005201#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 char *ap;
5203 int al;
5204 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005205
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005206 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 return NULL;
5208 af = AF_UNSPEC;
5209 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005210 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 af = sa->sa_family;
5212 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005213 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 switch (af) {
5215 case AF_INET:
5216 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5217 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5218 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005219#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 case AF_INET6:
5221 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5222 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5223 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005226 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005227 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 }
5229 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005230#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005231#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005232 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 &hp_allocated, buf, buf_len,
5234 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005235#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 h = gethostbyaddr_r(ap, al, af,
5237 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005238#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 memset((void *) &data, '\0', sizeof(data));
5240 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5241 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005242#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005243#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005244#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005248#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005250 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005251#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005253#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005254finally:
5255 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005257}
5258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005259PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005260"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5261\n\
5262Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005263for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005264
Guido van Rossum30a685f1991-06-27 15:51:29 +00005265
5266/* Python interface to getservbyname(name).
5267 This only returns the port number, since the other info is already
5268 known or not useful (like the list of aliases). */
5269
5270/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005272socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 char *name, *proto=NULL;
5275 struct servent *sp;
5276 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5277 return NULL;
5278 Py_BEGIN_ALLOW_THREADS
5279 sp = getservbyname(name, proto);
5280 Py_END_ALLOW_THREADS
5281 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005282 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 return NULL;
5284 }
5285 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005286}
5287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005288PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005289"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005290\n\
5291Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005292The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5293otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005294
Guido van Rossum30a685f1991-06-27 15:51:29 +00005295
Barry Warsaw11b91a02004-06-28 00:50:43 +00005296/* Python interface to getservbyport(port).
5297 This only returns the service name, since the other info is already
5298 known or not useful (like the list of aliases). */
5299
5300/*ARGSUSED*/
5301static PyObject *
5302socket_getservbyport(PyObject *self, PyObject *args)
5303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 int port;
5305 char *proto=NULL;
5306 struct servent *sp;
5307 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5308 return NULL;
5309 if (port < 0 || port > 0xffff) {
5310 PyErr_SetString(
5311 PyExc_OverflowError,
5312 "getservbyport: port must be 0-65535.");
5313 return NULL;
5314 }
5315 Py_BEGIN_ALLOW_THREADS
5316 sp = getservbyport(htons((short)port), proto);
5317 Py_END_ALLOW_THREADS
5318 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005319 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 return NULL;
5321 }
5322 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005323}
5324
5325PyDoc_STRVAR(getservbyport_doc,
5326"getservbyport(port[, protocolname]) -> string\n\
5327\n\
5328Return the service name from a port number and protocol name.\n\
5329The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5330otherwise any protocol will match.");
5331
Guido van Rossum3901d851996-12-19 16:35:04 +00005332/* Python interface to getprotobyname(name).
5333 This only returns the protocol number, since the other info is
5334 already known or not useful (like the list of aliases). */
5335
5336/*ARGSUSED*/
5337static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005338socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 char *name;
5341 struct protoent *sp;
5342 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5343 return NULL;
5344 Py_BEGIN_ALLOW_THREADS
5345 sp = getprotobyname(name);
5346 Py_END_ALLOW_THREADS
5347 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005348 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 return NULL;
5350 }
5351 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005352}
5353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005354PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005355"getprotobyname(name) -> integer\n\
5356\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005357Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005358
Guido van Rossum3901d851996-12-19 16:35:04 +00005359
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005360#ifndef NO_DUP
5361/* dup() function for socket fds */
5362
5363static PyObject *
5364socket_dup(PyObject *self, PyObject *fdobj)
5365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 SOCKET_T fd, newfd;
5367 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005368#ifdef MS_WINDOWS
5369 WSAPROTOCOL_INFO info;
5370#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 fd = PyLong_AsSocket_t(fdobj);
5373 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5374 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005375
Victor Stinnerdaf45552013-08-28 00:53:59 +02005376#ifdef MS_WINDOWS
5377 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5378 return set_error();
5379
5380 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5381 FROM_PROTOCOL_INFO,
5382 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 if (newfd == INVALID_SOCKET)
5384 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005385
Victor Stinnerdaf45552013-08-28 00:53:59 +02005386 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5387 closesocket(newfd);
5388 PyErr_SetFromWindowsErr(0);
5389 return NULL;
5390 }
5391#else
5392 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5393 newfd = _Py_dup(fd);
5394 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005395 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005396#endif
5397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 newfdobj = PyLong_FromSocket_t(newfd);
5399 if (newfdobj == NULL)
5400 SOCKETCLOSE(newfd);
5401 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005402}
5403
5404PyDoc_STRVAR(dup_doc,
5405"dup(integer) -> integer\n\
5406\n\
5407Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5408sockets; on some platforms os.dup() won't work for socket file descriptors.");
5409#endif
5410
5411
Dave Cole331708b2004-08-09 04:51:41 +00005412#ifdef HAVE_SOCKETPAIR
5413/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005414 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005415 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005416
5417/*ARGSUSED*/
5418static PyObject *
5419socket_socketpair(PyObject *self, PyObject *args)
5420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 PySocketSockObject *s0 = NULL, *s1 = NULL;
5422 SOCKET_T sv[2];
5423 int family, type = SOCK_STREAM, proto = 0;
5424 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005425#ifdef SOCK_CLOEXEC
5426 int *atomic_flag_works = &sock_cloexec_works;
5427#else
5428 int *atomic_flag_works = NULL;
5429#endif
5430 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005431
5432#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5438 &family, &type, &proto))
5439 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005442 Py_BEGIN_ALLOW_THREADS
5443#ifdef SOCK_CLOEXEC
5444 if (sock_cloexec_works != 0) {
5445 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5446 if (sock_cloexec_works == -1) {
5447 if (ret >= 0) {
5448 sock_cloexec_works = 1;
5449 }
5450 else if (errno == EINVAL) {
5451 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5452 sock_cloexec_works = 0;
5453 ret = socketpair(family, type, proto, sv);
5454 }
5455 }
5456 }
5457 else
5458#endif
5459 {
5460 ret = socketpair(family, type, proto, sv);
5461 }
5462 Py_END_ALLOW_THREADS
5463
5464 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005466
5467 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5468 goto finally;
5469 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5470 goto finally;
5471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 s0 = new_sockobject(sv[0], family, type, proto);
5473 if (s0 == NULL)
5474 goto finally;
5475 s1 = new_sockobject(sv[1], family, type, proto);
5476 if (s1 == NULL)
5477 goto finally;
5478 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005479
5480finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 if (res == NULL) {
5482 if (s0 == NULL)
5483 SOCKETCLOSE(sv[0]);
5484 if (s1 == NULL)
5485 SOCKETCLOSE(sv[1]);
5486 }
5487 Py_XDECREF(s0);
5488 Py_XDECREF(s1);
5489 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005490}
5491
5492PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005493"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005494\n\
5495Create a pair of socket objects from the sockets returned by the platform\n\
5496socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005497The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005498AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005499
5500#endif /* HAVE_SOCKETPAIR */
5501
5502
Guido van Rossum006bf911996-06-12 04:04:55 +00005503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005504socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005505{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005506 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005507
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005508 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 return NULL;
5510 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005511 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005513 "ntohs: can't convert negative Python int to C "
5514 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 return NULL;
5516 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005517 if (x > 0xffff) {
5518 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5519 "ntohs: Python int too large to convert to C "
5520 "16-bit unsigned integer (The silent truncation "
5521 "is deprecated)",
5522 1)) {
5523 return NULL;
5524 }
5525 }
5526 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005527}
5528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005529PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005530"ntohs(integer) -> integer\n\
5531\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005532Convert a 16-bit unsigned integer from network to host byte order.\n\
5533Note that in case the received integer does not fit in 16-bit unsigned\n\
5534integer, but does fit in a positive C int, it is silently truncated to\n\
553516-bit unsigned integer.\n\
5536However, this silent truncation feature is deprecated, and will raise an \n\
5537exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005538
5539
Guido van Rossum006bf911996-06-12 04:04:55 +00005540static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005541socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 if (PyLong_Check(arg)) {
5546 x = PyLong_AsUnsignedLong(arg);
5547 if (x == (unsigned long) -1 && PyErr_Occurred())
5548 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005549#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 {
5551 unsigned long y;
5552 /* only want the trailing 32 bits */
5553 y = x & 0xFFFFFFFFUL;
5554 if (y ^ x)
5555 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005556 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 x = y;
5558 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 }
5561 else
5562 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005563 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005566}
5567
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005568PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005569"ntohl(integer) -> integer\n\
5570\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005571Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005572
5573
Guido van Rossum006bf911996-06-12 04:04:55 +00005574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005575socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005576{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005577 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005578
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005579 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 return NULL;
5581 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005582 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005584 "htons: can't convert negative Python int to C "
5585 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 return NULL;
5587 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005588 if (x > 0xffff) {
5589 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5590 "htons: Python int too large to convert to C "
5591 "16-bit unsigned integer (The silent truncation "
5592 "is deprecated)",
5593 1)) {
5594 return NULL;
5595 }
5596 }
5597 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005598}
5599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005600PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005601"htons(integer) -> integer\n\
5602\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005603Convert a 16-bit unsigned integer from host to network byte order.\n\
5604Note that in case the received integer does not fit in 16-bit unsigned\n\
5605integer, but does fit in a positive C int, it is silently truncated to\n\
560616-bit unsigned integer.\n\
5607However, this silent truncation feature is deprecated, and will raise an \n\
5608exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005609
5610
Guido van Rossum006bf911996-06-12 04:04:55 +00005611static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005612socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 if (PyLong_Check(arg)) {
5617 x = PyLong_AsUnsignedLong(arg);
5618 if (x == (unsigned long) -1 && PyErr_Occurred())
5619 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005620#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 {
5622 unsigned long y;
5623 /* only want the trailing 32 bits */
5624 y = x & 0xFFFFFFFFUL;
5625 if (y ^ x)
5626 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005627 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 x = y;
5629 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 }
5632 else
5633 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005634 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 Py_TYPE(arg)->tp_name);
5636 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005637}
5638
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005639PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005640"htonl(integer) -> integer\n\
5641\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005642Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005643
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005644/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005646PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005647"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005648\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005649Convert 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 +00005650binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005651
5652static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005653socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005654{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005655#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005657#endif
5658
5659#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005660#if (SIZEOF_INT != 4)
5661#error "Not sure if in_addr_t exists and int is not 32-bits."
5662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 /* Have to use inet_addr() instead */
5664 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5669 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005670
Tim Peters1df9fdd2003-02-13 03:13:40 +00005671
5672#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005673
5674#ifdef USE_INET_ATON_WEAKLINK
5675 if (inet_aton != NULL) {
5676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 if (inet_aton(ip_addr, &buf))
5678 return PyBytes_FromStringAndSize((char *)(&buf),
5679 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005680
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005681 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 "illegal IP address string passed to inet_aton");
5683 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005684
Thomas Wouters477c8d52006-05-27 19:21:47 +00005685#ifdef USE_INET_ATON_WEAKLINK
5686 } else {
5687#endif
5688
5689#endif
5690
5691#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 /* special-case this address as inet_addr might return INADDR_NONE
5694 * for this */
5695 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005696 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005702 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 "illegal IP address string passed to inet_aton");
5704 return NULL;
5705 }
5706 }
5707 return PyBytes_FromStringAndSize((char *) &packed_addr,
5708 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005709
5710#ifdef USE_INET_ATON_WEAKLINK
5711 }
5712#endif
5713
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005714#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005715}
5716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005717PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005718"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005719\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005720Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005721
5722static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005723socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005724{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005725 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005727
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005728 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 return NULL;
5730 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005731
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005732 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005733 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005735 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 return NULL;
5737 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005738
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005739 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5740 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005743}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005744
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005745#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005746
5747PyDoc_STRVAR(inet_pton_doc,
5748"inet_pton(af, ip) -> packed IP address string\n\
5749\n\
5750Convert an IP address from string format to a packed string suitable\n\
5751for use with low-level network functions.");
5752
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005753#endif
5754
5755#ifdef HAVE_INET_PTON
5756
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005757static PyObject *
5758socket_inet_pton(PyObject *self, PyObject *args)
5759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 int af;
5761 char* ip;
5762 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005763#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005764 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005765#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5769 return NULL;
5770 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005771
Martin v. Löwis04697e82004-06-02 12:35:29 +00005772#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005774 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 "can't use AF_INET6, IPv6 is disabled");
5776 return NULL;
5777 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005778#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 retval = inet_pton(af, ip, packed);
5781 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005782 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 return NULL;
5784 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005785 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 "illegal IP address string passed to inet_pton");
5787 return NULL;
5788 } else if (af == AF_INET) {
5789 return PyBytes_FromStringAndSize(packed,
5790 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005791#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 } else if (af == AF_INET6) {
5793 return PyBytes_FromStringAndSize(packed,
5794 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005797 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 return NULL;
5799 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005800}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005801#elif defined(MS_WINDOWS)
5802
5803static PyObject *
5804socket_inet_pton(PyObject *self, PyObject *args)
5805{
5806 int af;
5807 char* ip;
5808 struct sockaddr_in6 addr;
5809 INT ret, size;
5810
5811 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5812 return NULL;
5813 }
5814
Victor Stinnere990c6e2013-11-16 00:18:58 +01005815 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005816 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5817
5818 if (ret) {
5819 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5820 return NULL;
5821 } else if(af == AF_INET) {
5822 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005823 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005824 sizeof(addr4->sin_addr));
5825 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005826 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005827 sizeof(addr.sin6_addr));
5828 } else {
5829 PyErr_SetString(PyExc_OSError, "unknown address family");
5830 return NULL;
5831 }
5832}
5833
5834#endif
5835
5836#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005837
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005838PyDoc_STRVAR(inet_ntop_doc,
5839"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5840\n\
5841Convert a packed IP address of the given family to string format.");
5842
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005843#endif
5844
5845
5846#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005847static PyObject *
5848socket_inet_ntop(PyObject *self, PyObject *args)
5849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005851 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005853#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005854 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005855#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005857#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5860 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005861
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005862 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 return NULL;
5864 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005867 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 PyErr_SetString(PyExc_ValueError,
5869 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005870 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 return NULL;
5872 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005873#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005875 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 PyErr_SetString(PyExc_ValueError,
5877 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005878 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 return NULL;
5880 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 } else {
5883 PyErr_Format(PyExc_ValueError,
5884 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005885 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 return NULL;
5887 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005888
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005889 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5890 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005892 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893 return NULL;
5894 } else {
5895 return PyUnicode_FromString(retval);
5896 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005897}
5898
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005899#elif defined(MS_WINDOWS)
5900
5901static PyObject *
5902socket_inet_ntop(PyObject *self, PyObject *args)
5903{
5904 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005905 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005906 struct sockaddr_in6 addr;
5907 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005908#ifdef ENABLE_IPV6
5909 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5910#else
5911 char ip[INET_ADDRSTRLEN + 1];
5912#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005913
5914 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5915 memset((void *) &ip[0], '\0', sizeof(ip));
5916
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005917 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005918 return NULL;
5919 }
5920
5921 if (af == AF_INET) {
5922 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5923
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005924 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005925 PyErr_SetString(PyExc_ValueError,
5926 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005927 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005928 return NULL;
5929 }
5930 memset(addr4, 0, sizeof(struct sockaddr_in));
5931 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005932 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005933 addrlen = sizeof(struct sockaddr_in);
5934 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005935 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005936 PyErr_SetString(PyExc_ValueError,
5937 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005938 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005939 return NULL;
5940 }
5941
5942 memset(&addr, 0, sizeof(addr));
5943 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005944 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005945 addrlen = sizeof(addr);
5946 } else {
5947 PyErr_Format(PyExc_ValueError,
5948 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005949 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005950 return NULL;
5951 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005952 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005953
5954 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005955 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005956 ip, &retlen);
5957
5958 if (ret) {
5959 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5960 return NULL;
5961 } else {
5962 return PyUnicode_FromString(ip);
5963 }
5964}
5965
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005966#endif /* HAVE_INET_PTON */
5967
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005968/* Python interface to getaddrinfo(host, port). */
5969
5970/*ARGSUSED*/
5971static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005972socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005973{
Victor Stinner77af1722011-05-26 14:05:59 +02005974 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005975 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 struct addrinfo hints, *res;
5977 struct addrinfo *res0 = NULL;
5978 PyObject *hobj = NULL;
5979 PyObject *pobj = (PyObject *)NULL;
5980 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005981 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 int family, socktype, protocol, flags;
5983 int error;
5984 PyObject *all = (PyObject *)NULL;
5985 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005986
Georg Brandl6083a4b2013-10-14 06:51:46 +02005987 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005989 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005990 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 &protocol, &flags)) {
5992 return NULL;
5993 }
5994 if (hobj == Py_None) {
5995 hptr = NULL;
5996 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005997 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 if (!idna)
5999 return NULL;
6000 assert(PyBytes_Check(idna));
6001 hptr = PyBytes_AS_STRING(idna);
6002 } else if (PyBytes_Check(hobj)) {
6003 hptr = PyBytes_AsString(hobj);
6004 } else {
6005 PyErr_SetString(PyExc_TypeError,
6006 "getaddrinfo() argument 1 must be string or None");
6007 return NULL;
6008 }
6009 if (PyLong_CheckExact(pobj)) {
6010 long value = PyLong_AsLong(pobj);
6011 if (value == -1 && PyErr_Occurred())
6012 goto err;
6013 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6014 pptr = pbuf;
6015 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006016 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006017 if (pptr == NULL)
6018 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006020 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 } else if (pobj == Py_None) {
6022 pptr = (char *)NULL;
6023 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006024 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 goto err;
6026 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006027#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006028 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6029 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006030 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6031 * This workaround avoids a segfault in libsystem.
6032 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006033 pptr = "00";
6034 }
6035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 memset(&hints, 0, sizeof(hints));
6037 hints.ai_family = family;
6038 hints.ai_socktype = socktype;
6039 hints.ai_protocol = protocol;
6040 hints.ai_flags = flags;
6041 Py_BEGIN_ALLOW_THREADS
6042 ACQUIRE_GETADDRINFO_LOCK
6043 error = getaddrinfo(hptr, pptr, &hints, &res0);
6044 Py_END_ALLOW_THREADS
6045 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6046 if (error) {
6047 set_gaierror(error);
6048 goto err;
6049 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006050
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006051 all = PyList_New(0);
6052 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 goto err;
6054 for (res = res0; res; res = res->ai_next) {
6055 PyObject *single;
6056 PyObject *addr =
6057 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6058 if (addr == NULL)
6059 goto err;
6060 single = Py_BuildValue("iiisO", res->ai_family,
6061 res->ai_socktype, res->ai_protocol,
6062 res->ai_canonname ? res->ai_canonname : "",
6063 addr);
6064 Py_DECREF(addr);
6065 if (single == NULL)
6066 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 if (PyList_Append(all, single))
6069 goto err;
6070 Py_XDECREF(single);
6071 }
6072 Py_XDECREF(idna);
6073 if (res0)
6074 freeaddrinfo(res0);
6075 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006076 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 Py_XDECREF(all);
6078 Py_XDECREF(idna);
6079 if (res0)
6080 freeaddrinfo(res0);
6081 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006082}
6083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006084PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006085"getaddrinfo(host, port [, family, type, proto, flags])\n\
6086 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006087\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006088Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006089
6090/* Python interface to getnameinfo(sa, flags). */
6091
6092/*ARGSUSED*/
6093static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006094socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 PyObject *sa = (PyObject *)NULL;
6097 int flags;
6098 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006099 int port;
6100 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6102 struct addrinfo hints, *res = NULL;
6103 int error;
6104 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006105 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 flags = flowinfo = scope_id = 0;
6108 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6109 return NULL;
6110 if (!PyTuple_Check(sa)) {
6111 PyErr_SetString(PyExc_TypeError,
6112 "getnameinfo() argument 1 must be a tuple");
6113 return NULL;
6114 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006115 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 &hostp, &port, &flowinfo, &scope_id))
6117 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006118 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006119 PyErr_SetString(PyExc_OverflowError,
6120 "getsockaddrarg: flowinfo must be 0-1048575.");
6121 return NULL;
6122 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6124 memset(&hints, 0, sizeof(hints));
6125 hints.ai_family = AF_UNSPEC;
6126 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006127 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 Py_BEGIN_ALLOW_THREADS
6129 ACQUIRE_GETADDRINFO_LOCK
6130 error = getaddrinfo(hostp, pbuf, &hints, &res);
6131 Py_END_ALLOW_THREADS
6132 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6133 if (error) {
6134 set_gaierror(error);
6135 goto fail;
6136 }
6137 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006138 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 "sockaddr resolved to multiple addresses");
6140 goto fail;
6141 }
6142 switch (res->ai_family) {
6143 case AF_INET:
6144 {
6145 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006146 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 "IPv4 sockaddr must be 2 tuple");
6148 goto fail;
6149 }
6150 break;
6151 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006152#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 case AF_INET6:
6154 {
6155 struct sockaddr_in6 *sin6;
6156 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006157 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 sin6->sin6_scope_id = scope_id;
6159 break;
6160 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006163 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6165 if (error) {
6166 set_gaierror(error);
6167 goto fail;
6168 }
Victor Stinner72400302016-01-28 15:41:01 +01006169
6170 name = sock_decode_hostname(hbuf);
6171 if (name == NULL)
6172 goto fail;
6173 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006174
6175fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 if (res)
6177 freeaddrinfo(res);
6178 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006179}
6180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006181PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006182"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006183\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006184Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006185
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006186
6187/* Python API to getting and setting the default timeout value. */
6188
6189static PyObject *
6190socket_getdefaulttimeout(PyObject *self)
6191{
Victor Stinner71694d52015-03-28 01:18:54 +01006192 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006193 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 }
Victor Stinner71694d52015-03-28 01:18:54 +01006195 else {
6196 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6197 return PyFloat_FromDouble(seconds);
6198 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006199}
6200
6201PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006202"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006203\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006204Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006205A value of None indicates that new socket objects have no timeout.\n\
6206When the socket module is first imported, the default is None.");
6207
6208static PyObject *
6209socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6210{
Victor Stinner71694d52015-03-28 01:18:54 +01006211 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006212
Victor Stinner71694d52015-03-28 01:18:54 +01006213 if (socket_parse_timeout(&timeout, arg) < 0)
6214 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006217
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006218 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006219}
6220
6221PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006222"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006223\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006224Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006225A value of None indicates that new socket objects have no timeout.\n\
6226When the socket module is first imported, the default is None.");
6227
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006228#ifdef HAVE_IF_NAMEINDEX
6229/* Python API for getting interface indices and names */
6230
6231static PyObject *
6232socket_if_nameindex(PyObject *self, PyObject *arg)
6233{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006234 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006235 int i;
6236 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006237
Charles-François Natali60713592011-05-20 16:55:06 +02006238 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006239 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006240 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006241 return NULL;
6242 }
6243
6244 list = PyList_New(0);
6245 if (list == NULL) {
6246 if_freenameindex(ni);
6247 return NULL;
6248 }
6249
Charles-François Natali60713592011-05-20 16:55:06 +02006250 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6251 PyObject *ni_tuple = Py_BuildValue("IO&",
6252 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006253
6254 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6255 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006256 Py_DECREF(list);
6257 if_freenameindex(ni);
6258 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006259 }
6260 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006261 }
6262
6263 if_freenameindex(ni);
6264 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006265}
6266
6267PyDoc_STRVAR(if_nameindex_doc,
6268"if_nameindex()\n\
6269\n\
6270Returns a list of network interface information (index, name) tuples.");
6271
Charles-François Natali60713592011-05-20 16:55:06 +02006272static PyObject *
6273socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006274{
Charles-François Natali60713592011-05-20 16:55:06 +02006275 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006276 unsigned long index;
6277
Charles-François Natali60713592011-05-20 16:55:06 +02006278 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6279 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006280 return NULL;
6281
Charles-François Natali60713592011-05-20 16:55:06 +02006282 index = if_nametoindex(PyBytes_AS_STRING(oname));
6283 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006284 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006285 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006286 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006287 return NULL;
6288 }
6289
6290 return PyLong_FromUnsignedLong(index);
6291}
6292
6293PyDoc_STRVAR(if_nametoindex_doc,
6294"if_nametoindex(if_name)\n\
6295\n\
6296Returns the interface index corresponding to the interface name if_name.");
6297
Charles-François Natali60713592011-05-20 16:55:06 +02006298static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006299socket_if_indextoname(PyObject *self, PyObject *arg)
6300{
Charles-François Natali60713592011-05-20 16:55:06 +02006301 unsigned long index;
6302 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006303
Charles-François Natali60713592011-05-20 16:55:06 +02006304 index = PyLong_AsUnsignedLong(arg);
6305 if (index == (unsigned long) -1)
6306 return NULL;
6307
6308 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006309 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006310 return NULL;
6311 }
6312
Charles-François Natali60713592011-05-20 16:55:06 +02006313 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006314}
6315
6316PyDoc_STRVAR(if_indextoname_doc,
6317"if_indextoname(if_index)\n\
6318\n\
6319Returns the interface name corresponding to the interface index if_index.");
6320
6321#endif /* HAVE_IF_NAMEINDEX */
6322
6323
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006324#ifdef CMSG_LEN
6325/* Python interface to CMSG_LEN(length). */
6326
6327static PyObject *
6328socket_CMSG_LEN(PyObject *self, PyObject *args)
6329{
6330 Py_ssize_t length;
6331 size_t result;
6332
6333 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6334 return NULL;
6335 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6336 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6337 return NULL;
6338 }
6339 return PyLong_FromSize_t(result);
6340}
6341
6342PyDoc_STRVAR(CMSG_LEN_doc,
6343"CMSG_LEN(length) -> control message length\n\
6344\n\
6345Return the total length, without trailing padding, of an ancillary\n\
6346data item with associated data of the given length. This value can\n\
6347often be used as the buffer size for recvmsg() to receive a single\n\
6348item of ancillary data, but RFC 3542 requires portable applications to\n\
6349use CMSG_SPACE() and thus include space for padding, even when the\n\
6350item will be the last in the buffer. Raises OverflowError if length\n\
6351is outside the permissible range of values.");
6352
6353
6354#ifdef CMSG_SPACE
6355/* Python interface to CMSG_SPACE(length). */
6356
6357static PyObject *
6358socket_CMSG_SPACE(PyObject *self, PyObject *args)
6359{
6360 Py_ssize_t length;
6361 size_t result;
6362
6363 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6364 return NULL;
6365 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6366 PyErr_SetString(PyExc_OverflowError,
6367 "CMSG_SPACE() argument out of range");
6368 return NULL;
6369 }
6370 return PyLong_FromSize_t(result);
6371}
6372
6373PyDoc_STRVAR(CMSG_SPACE_doc,
6374"CMSG_SPACE(length) -> buffer size\n\
6375\n\
6376Return the buffer size needed for recvmsg() to receive an ancillary\n\
6377data item with associated data of the given length, along with any\n\
6378trailing padding. The buffer space needed to receive multiple items\n\
6379is the sum of the CMSG_SPACE() values for their associated data\n\
6380lengths. Raises OverflowError if length is outside the permissible\n\
6381range of values.");
6382#endif /* CMSG_SPACE */
6383#endif /* CMSG_LEN */
6384
6385
Guido van Rossum30a685f1991-06-27 15:51:29 +00006386/* List of functions exported by this module. */
6387
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006388static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 {"gethostbyname", socket_gethostbyname,
6390 METH_VARARGS, gethostbyname_doc},
6391 {"gethostbyname_ex", socket_gethostbyname_ex,
6392 METH_VARARGS, ghbn_ex_doc},
6393 {"gethostbyaddr", socket_gethostbyaddr,
6394 METH_VARARGS, gethostbyaddr_doc},
6395 {"gethostname", socket_gethostname,
6396 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006397#ifdef HAVE_SETHOSTNAME
6398 {"sethostname", socket_sethostname,
6399 METH_VARARGS, sethostname_doc},
6400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 {"getservbyname", socket_getservbyname,
6402 METH_VARARGS, getservbyname_doc},
6403 {"getservbyport", socket_getservbyport,
6404 METH_VARARGS, getservbyport_doc},
6405 {"getprotobyname", socket_getprotobyname,
6406 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006407#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 {"dup", socket_dup,
6409 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006410#endif
Dave Cole331708b2004-08-09 04:51:41 +00006411#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 {"socketpair", socket_socketpair,
6413 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 {"ntohs", socket_ntohs,
6416 METH_VARARGS, ntohs_doc},
6417 {"ntohl", socket_ntohl,
6418 METH_O, ntohl_doc},
6419 {"htons", socket_htons,
6420 METH_VARARGS, htons_doc},
6421 {"htonl", socket_htonl,
6422 METH_O, htonl_doc},
6423 {"inet_aton", socket_inet_aton,
6424 METH_VARARGS, inet_aton_doc},
6425 {"inet_ntoa", socket_inet_ntoa,
6426 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006427#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 {"inet_pton", socket_inet_pton,
6429 METH_VARARGS, inet_pton_doc},
6430 {"inet_ntop", socket_inet_ntop,
6431 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006432#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006433 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6434 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 {"getnameinfo", socket_getnameinfo,
6436 METH_VARARGS, getnameinfo_doc},
6437 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6438 METH_NOARGS, getdefaulttimeout_doc},
6439 {"setdefaulttimeout", socket_setdefaulttimeout,
6440 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006441#ifdef HAVE_IF_NAMEINDEX
6442 {"if_nameindex", socket_if_nameindex,
6443 METH_NOARGS, if_nameindex_doc},
6444 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006445 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006446 {"if_indextoname", socket_if_indextoname,
6447 METH_O, if_indextoname_doc},
6448#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006449#ifdef CMSG_LEN
6450 {"CMSG_LEN", socket_CMSG_LEN,
6451 METH_VARARGS, CMSG_LEN_doc},
6452#ifdef CMSG_SPACE
6453 {"CMSG_SPACE", socket_CMSG_SPACE,
6454 METH_VARARGS, CMSG_SPACE_doc},
6455#endif
6456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006458};
6459
Guido van Rossum30a685f1991-06-27 15:51:29 +00006460
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006461#ifdef MS_WINDOWS
6462#define OS_INIT_DEFINED
6463
6464/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006465
6466static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006467os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006470}
6471
6472static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006473os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 WSADATA WSAData;
6476 int ret;
6477 ret = WSAStartup(0x0101, &WSAData);
6478 switch (ret) {
6479 case 0: /* No error */
6480 Py_AtExit(os_cleanup);
6481 return 1; /* Success */
6482 case WSASYSNOTREADY:
6483 PyErr_SetString(PyExc_ImportError,
6484 "WSAStartup failed: network not ready");
6485 break;
6486 case WSAVERNOTSUPPORTED:
6487 case WSAEINVAL:
6488 PyErr_SetString(
6489 PyExc_ImportError,
6490 "WSAStartup failed: requested version not supported");
6491 break;
6492 default:
6493 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6494 break;
6495 }
6496 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006497}
6498
Guido van Rossum8d665e61996-06-26 18:22:49 +00006499#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006500
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006501
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006502
6503#ifndef OS_INIT_DEFINED
6504static int
6505os_init(void)
6506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006508}
6509#endif
6510
6511
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006512/* C API table - always add new things to the end for binary
6513 compatibility. */
6514static
6515PySocketModule_APIObject PySocketModuleAPI =
6516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006518 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006520};
6521
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006522
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006523/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006524
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006525 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006526 "socket.py" which implements some additional functionality.
6527 The import of "_socket" may fail with an ImportError exception if
6528 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006529 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006530 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006531*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006533PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006534"Implementation module for socket operations.\n\
6535\n\
6536See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006537
Martin v. Löwis1a214512008-06-11 05:26:20 +00006538static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 PyModuleDef_HEAD_INIT,
6540 PySocket_MODULE_NAME,
6541 socket_doc,
6542 -1,
6543 socket_methods,
6544 NULL,
6545 NULL,
6546 NULL,
6547 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006548};
6549
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006550PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006551PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 if (!os_init())
6556 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006557
Victor Stinnerdaf45552013-08-28 00:53:59 +02006558#ifdef MS_WINDOWS
6559 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006560#if defined(_MSC_VER) && _MSC_VER >= 1800
6561 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6562#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006563 DWORD version = GetVersion();
6564 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6565 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6566 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006567 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6568#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006569 }
6570#endif
6571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 Py_TYPE(&sock_type) = &PyType_Type;
6573 m = PyModule_Create(&socketmodule);
6574 if (m == NULL)
6575 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006576
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006577 Py_INCREF(PyExc_OSError);
6578 PySocketModuleAPI.error = PyExc_OSError;
6579 Py_INCREF(PyExc_OSError);
6580 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006582 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 if (socket_herror == NULL)
6584 return NULL;
6585 Py_INCREF(socket_herror);
6586 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006587 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 NULL);
6589 if (socket_gaierror == NULL)
6590 return NULL;
6591 Py_INCREF(socket_gaierror);
6592 PyModule_AddObject(m, "gaierror", socket_gaierror);
6593 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006594 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 if (socket_timeout == NULL)
6596 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006597 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 Py_INCREF(socket_timeout);
6599 PyModule_AddObject(m, "timeout", socket_timeout);
6600 Py_INCREF((PyObject *)&sock_type);
6601 if (PyModule_AddObject(m, "SocketType",
6602 (PyObject *)&sock_type) != 0)
6603 return NULL;
6604 Py_INCREF((PyObject *)&sock_type);
6605 if (PyModule_AddObject(m, "socket",
6606 (PyObject *)&sock_type) != 0)
6607 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006608
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006609#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 Py_INCREF(has_ipv6);
6615 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 /* Export C API */
6618 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6619 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6620 ) != 0)
6621 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006626#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006628#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006630#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006634#endif
6635#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006637#endif
6638#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006641#endif
6642#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#endif
6646#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006650#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006653#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006654#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006657#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006658#ifdef HAVE_SOCKADDR_ALG
6659 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6660#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006661#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006664#endif
6665#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006667#endif
6668#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006671#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006672#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006675#endif
6676#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006679#endif
6680#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006683#endif
6684#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006687#endif
6688#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, AF_NETLINK);
6691 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006692#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006694#endif
6695#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006697#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6699 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006700#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006702#endif
6703#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006705#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006706#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006708#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006709#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006711#endif
6712#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006714#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006716#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006718#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006719#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006721#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006722#ifdef NETLINK_CRYPTO
6723 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6724#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006725#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006726#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006729#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006730#ifdef AF_LINK
6731 PyModule_AddIntMacro(m, AF_LINK);
6732#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006733#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006736#endif
6737#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006740#endif
6741#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#endif
6745#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006748#endif
6749#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006752#endif
6753#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006756#endif
6757#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006760#endif
6761#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006764#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006765
Hye-Shik Chang81268602004-02-02 06:05:24 +00006766#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6768 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6769 PyModule_AddIntMacro(m, BTPROTO_HCI);
6770 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006771#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006773#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006774#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006775#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006777#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6779 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006780#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6783 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006784#endif
6785
Charles-François Natali47413c12011-10-06 19:47:44 +02006786#ifdef AF_CAN
6787 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006789#endif
6790#ifdef PF_CAN
6791 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006793#endif
6794
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006795/* Reliable Datagram Sockets */
6796#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006798#endif
6799#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006801#endif
6802
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006803/* Kernel event messages */
6804#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006806#endif
6807#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006809#endif
6810
Antoine Pitroub156a462010-10-27 20:13:57 +00006811#ifdef AF_PACKET
6812 PyModule_AddIntMacro(m, AF_PACKET);
6813#endif
6814#ifdef PF_PACKET
6815 PyModule_AddIntMacro(m, PF_PACKET);
6816#endif
6817#ifdef PACKET_HOST
6818 PyModule_AddIntMacro(m, PACKET_HOST);
6819#endif
6820#ifdef PACKET_BROADCAST
6821 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6822#endif
6823#ifdef PACKET_MULTICAST
6824 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6825#endif
6826#ifdef PACKET_OTHERHOST
6827 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6828#endif
6829#ifdef PACKET_OUTGOING
6830 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6831#endif
6832#ifdef PACKET_LOOPBACK
6833 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6834#endif
6835#ifdef PACKET_FASTROUTE
6836 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006837#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006838
Christian Heimes043d6f62008-01-07 17:19:16 +00006839#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6844 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6845 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006846
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6848 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6849 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006851 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, SOL_TIPC);
6853 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6854 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6855 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6856 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006857
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6859 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6860 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6861 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6865 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006866#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006869#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6871 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6872 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6873 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6874 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6875 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006876#endif
6877
Christian Heimesdffa3942016-09-05 23:54:41 +02006878#ifdef HAVE_SOCKADDR_ALG
6879 /* Socket options */
6880 PyModule_AddIntMacro(m, ALG_SET_KEY);
6881 PyModule_AddIntMacro(m, ALG_SET_IV);
6882 PyModule_AddIntMacro(m, ALG_SET_OP);
6883 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6884 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6885 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6886
6887 /* Operations */
6888 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6889 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6890 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6891 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6892#endif
6893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, SOCK_STREAM);
6896 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006897/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006898#ifdef SOCK_RAW
6899 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006901#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006903#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006905#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006906#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006908#endif
6909#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006911#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006921#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006922#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006924#endif
6925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006943#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006944#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006947#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006975#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006976#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006978#endif
6979#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006981#endif
6982#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006984#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006985#ifdef SO_PASSSEC
6986 PyModule_AddIntMacro(m, SO_PASSSEC);
6987#endif
6988#ifdef SO_PEERSEC
6989 PyModule_AddIntMacro(m, SO_PEERSEC);
6990#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006991#ifdef SO_BINDTODEVICE
6992 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6993#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006994#ifdef SO_PRIORITY
6995 PyModule_AddIntMacro(m, SO_PRIORITY);
6996#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006997#ifdef SO_MARK
6998 PyModule_AddIntMacro(m, SO_MARK);
6999#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007000#ifdef SO_DOMAIN
7001 PyModule_AddIntMacro(m, SO_DOMAIN);
7002#endif
7003#ifdef SO_PROTOCOL
7004 PyModule_AddIntMacro(m, SO_PROTOCOL);
7005#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007007 /* Maximum number of connections for "listen" */
7008#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007010#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007012#endif
7013
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007014 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007015#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007017#endif
7018#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007020#endif
7021#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007023#endif
7024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007025 /* Flags for send, recv */
7026#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007055#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007056#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007058#endif
7059#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007061#endif
7062#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007064#endif
7065#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007067#endif
7068#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007070#endif
7071#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007073#endif
7074#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007076#endif
7077#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007079#endif
7080#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007082#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007083#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007085#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007087 /* Protocol level and numbers, usable for [gs]etsockopt */
7088#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007093#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007096#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007120#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007121#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007123#endif
7124#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7126 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007127#endif
7128#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7130 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7131 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007132
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7134 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7135 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007136#endif
7137#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7139 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7140 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7141 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007142#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007143#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7144 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7145#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007146#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007148 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7149 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7150 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7151 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7152 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7153 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7154 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7155 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7156 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7157 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7158 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7159 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7160#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007161#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007163#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007164#ifdef HAVE_SOCKADDR_ALG
7165 PyModule_AddIntMacro(m, SOL_ALG);
7166#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007167#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007169#endif
7170#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007172#endif
7173#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007175#endif
7176#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007178#endif
7179#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007181#endif
7182#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007187#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007195#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007215#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007226#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007277#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007286#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007288#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007289#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007291#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007292#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007293 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007294#endif
7295/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007298#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
7304
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007305#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007307#endif
7308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309 /* Some port configuration */
7310#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007312#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007317#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007319#endif
7320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 /* Some reserved IP v.4 addresses */
7322#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007324#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007325 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007329#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007331#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007333 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007339#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342#ifdef INADDR_ALLHOSTS_GROUP
7343 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7344 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007345#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007350#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007355#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007357#endif
7358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 /* IPv4 [gs]etsockopt options */
7360#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007369#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007372#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007396#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007405#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007407#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007408#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007410#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7413#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007422#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007432#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007436#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007438#endif
7439#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007441#endif
7442#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#endif
7445#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007447#endif
7448#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007450#endif
7451#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007453#endif
7454#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007456#endif
7457#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007459#endif
7460#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007462#endif
7463#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007465#endif
7466#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007468#endif
7469#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007471#endif
7472#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007474#endif
7475#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007477#endif
7478#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007480#endif
7481#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007483#endif
7484#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007486#endif
7487#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007489#endif
7490#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007492#endif
7493#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007495#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497 /* TCP options */
7498#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007501#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007533#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007534#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007536#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007537#ifdef TCP_CONGESTION
7538 PyModule_AddIntMacro(m, TCP_CONGESTION);
7539#endif
7540#ifdef TCP_USER_TIMEOUT
7541 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7542#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544 /* IPX options */
7545#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007547#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007548
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007549/* Reliable Datagram Sockets */
7550#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007552#endif
7553#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007555#endif
7556#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007558#endif
7559#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007561#endif
7562#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007564#endif
7565#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007567#endif
7568#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007570#endif
7571#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007573#endif
7574#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007576#endif
7577#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007579#endif
7580#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007582#endif
7583#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007585#endif
7586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007587 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007588#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
7603#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007605#endif
7606#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007611#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007612#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007614#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007615#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#endif
7618#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007620#endif
7621#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007623#endif
7624#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007626#endif
7627#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007629#endif
7630#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007632#endif
7633#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007635#endif
7636#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007638#endif
7639#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007641#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007642#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007644#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007645#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007647#endif
7648#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007650#endif
7651#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007653#endif
7654#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007656#endif
7657#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007659#endif
7660#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007662#endif
7663#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007665#endif
7666#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007668#endif
7669#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007671#endif
7672#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007674#endif
7675#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007677#endif
7678#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007680#endif
7681#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007683#endif
7684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007685 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007686#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007688#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007689 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007692#endif
7693#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007695#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007699#endif
7700#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007702#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007704#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#endif
7707
Christian Heimesfaf2f632008-01-06 16:59:19 +00007708#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007710 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7711#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007712 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007713#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007714 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007715 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7716#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007717 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007718#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007719 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007721 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007722 PyObject *tmp;
7723 tmp = PyLong_FromUnsignedLong(codes[i]);
7724 if (tmp == NULL)
7725 return NULL;
7726 PyModule_AddObject(m, names[i], tmp);
7727 }
7728 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007729 PyModule_AddIntMacro(m, RCVALL_OFF);
7730 PyModule_AddIntMacro(m, RCVALL_ON);
7731 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007732#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007734#endif
7735#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007737#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007738#endif /* _MSTCPIP_ */
7739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007740 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007741#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007742 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007745}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007746
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007747
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007748#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007749#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007750
7751/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007752/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007753
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007754int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007755inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007756{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007757 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007758#if (SIZEOF_INT != 4)
7759#error "Not sure if in_addr_t exists and int is not 32-bits."
7760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007761 unsigned int packed_addr;
7762 packed_addr = inet_addr(src);
7763 if (packed_addr == INADDR_NONE)
7764 return 0;
7765 memcpy(dst, &packed_addr, 4);
7766 return 1;
7767 }
7768 /* Should set errno to EAFNOSUPPORT */
7769 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007770}
7771
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007772const char *
7773inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007775 if (af == AF_INET) {
7776 struct in_addr packed_addr;
7777 if (size < 16)
7778 /* Should set errno to ENOSPC. */
7779 return NULL;
7780 memcpy(&packed_addr, src, sizeof(packed_addr));
7781 return strncpy(dst, inet_ntoa(packed_addr), size);
7782 }
7783 /* Should set errno to EAFNOSUPPORT */
7784 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007785}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007786
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007787#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007788#endif