blob: 274769d6b01bc56c29b99f772fbc9740d3477cc3 [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 */
1221 Py_INCREF(Py_None);
1222 return Py_None;
1223 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AF_INET:
1228 {
1229 struct sockaddr_in *a;
1230 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1231 PyObject *ret = NULL;
1232 if (addrobj) {
1233 a = (struct sockaddr_in *)addr;
1234 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1235 Py_DECREF(addrobj);
1236 }
1237 return ret;
1238 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001240#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 case AF_UNIX:
1242 {
1243 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001244#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1246 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001247 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 }
1249 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001250#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 {
1252 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001253 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 }
1255 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001256#endif /* AF_UNIX */
1257
Martin v. Löwis11017b12006-01-14 18:12:57 +00001258#if defined(AF_NETLINK)
1259 case AF_NETLINK:
1260 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1262 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001263 }
1264#endif /* AF_NETLINK */
1265
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001266#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case AF_INET6:
1268 {
1269 struct sockaddr_in6 *a;
1270 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1271 PyObject *ret = NULL;
1272 if (addrobj) {
1273 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001274 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 addrobj,
1276 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001277 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 a->sin6_scope_id);
1279 Py_DECREF(addrobj);
1280 }
1281 return ret;
1282 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001283#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001284
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001285#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 case AF_BLUETOOTH:
1287 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 case BTPROTO_L2CAP:
1290 {
1291 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1292 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1293 PyObject *ret = NULL;
1294 if (addrobj) {
1295 ret = Py_BuildValue("Oi",
1296 addrobj,
1297 _BT_L2_MEMB(a, psm));
1298 Py_DECREF(addrobj);
1299 }
1300 return ret;
1301 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 case BTPROTO_RFCOMM:
1304 {
1305 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1306 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1307 PyObject *ret = NULL;
1308 if (addrobj) {
1309 ret = Py_BuildValue("Oi",
1310 addrobj,
1311 _BT_RC_MEMB(a, channel));
1312 Py_DECREF(addrobj);
1313 }
1314 return ret;
1315 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 case BTPROTO_HCI:
1318 {
1319 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001320#if defined(__NetBSD__) || defined(__DragonFly__)
1321 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1322#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 PyObject *ret = NULL;
1324 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1325 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001328
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001329#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 case BTPROTO_SCO:
1331 {
1332 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1333 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1334 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001335#endif
1336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 default:
1338 PyErr_SetString(PyExc_ValueError,
1339 "Unknown Bluetooth protocol");
1340 return NULL;
1341 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001342#endif
1343
Antoine Pitroub156a462010-10-27 20:13:57 +00001344#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_PACKET:
1346 {
1347 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1348 char *ifname = "";
1349 struct ifreq ifr;
1350 /* need to look up interface name give index */
1351 if (a->sll_ifindex) {
1352 ifr.ifr_ifindex = a->sll_ifindex;
1353 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1354 ifname = ifr.ifr_name;
1355 }
1356 return Py_BuildValue("shbhy#",
1357 ifname,
1358 ntohs(a->sll_protocol),
1359 a->sll_pkttype,
1360 a->sll_hatype,
1361 a->sll_addr,
1362 a->sll_halen);
1363 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001364#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001365
Christian Heimes043d6f62008-01-07 17:19:16 +00001366#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 case AF_TIPC:
1368 {
1369 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1370 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1371 return Py_BuildValue("IIIII",
1372 a->addrtype,
1373 a->addr.nameseq.type,
1374 a->addr.nameseq.lower,
1375 a->addr.nameseq.upper,
1376 a->scope);
1377 } else if (a->addrtype == TIPC_ADDR_NAME) {
1378 return Py_BuildValue("IIIII",
1379 a->addrtype,
1380 a->addr.name.name.type,
1381 a->addr.name.name.instance,
1382 a->addr.name.name.instance,
1383 a->scope);
1384 } else if (a->addrtype == TIPC_ADDR_ID) {
1385 return Py_BuildValue("IIIII",
1386 a->addrtype,
1387 a->addr.id.node,
1388 a->addr.id.ref,
1389 0,
1390 a->scope);
1391 } else {
1392 PyErr_SetString(PyExc_ValueError,
1393 "Invalid address type");
1394 return NULL;
1395 }
1396 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001397#endif
1398
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001399#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001400 case AF_CAN:
1401 {
1402 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1403 char *ifname = "";
1404 struct ifreq ifr;
1405 /* need to look up interface name given index */
1406 if (a->can_ifindex) {
1407 ifr.ifr_ifindex = a->can_ifindex;
1408 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1409 ifname = ifr.ifr_name;
1410 }
1411
1412 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1413 ifname,
1414 a->can_family);
1415 }
1416#endif
1417
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001418#ifdef PF_SYSTEM
1419 case PF_SYSTEM:
1420 switch(proto) {
1421#ifdef SYSPROTO_CONTROL
1422 case SYSPROTO_CONTROL:
1423 {
1424 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1425 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1426 }
1427#endif
1428 default:
1429 PyErr_SetString(PyExc_ValueError,
1430 "Invalid address type");
1431 return 0;
1432 }
1433#endif
1434
Christian Heimesdffa3942016-09-05 23:54:41 +02001435#ifdef HAVE_SOCKADDR_ALG
1436 case AF_ALG:
1437 {
1438 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1439 return Py_BuildValue("s#s#HH",
1440 a->salg_type,
1441 strnlen((const char*)a->salg_type,
1442 sizeof(a->salg_type)),
1443 a->salg_name,
1444 strnlen((const char*)a->salg_name,
1445 sizeof(a->salg_name)),
1446 a->salg_feat,
1447 a->salg_mask);
1448 }
1449#endif
1450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 default:
1454 /* If we don't know the address family, don't raise an
1455 exception -- return it as an (int, bytes) tuple. */
1456 return Py_BuildValue("iy#",
1457 addr->sa_family,
1458 addr->sa_data,
1459 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001462}
1463
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001464/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1465 (in particular, numeric IP addresses). */
1466struct maybe_idna {
1467 PyObject *obj;
1468 char *buf;
1469};
1470
1471static void
1472idna_cleanup(struct maybe_idna *data)
1473{
1474 Py_CLEAR(data->obj);
1475}
1476
1477static int
1478idna_converter(PyObject *obj, struct maybe_idna *data)
1479{
1480 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001481 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001482 if (obj == NULL) {
1483 idna_cleanup(data);
1484 return 1;
1485 }
1486 data->obj = NULL;
1487 len = -1;
1488 if (PyBytes_Check(obj)) {
1489 data->buf = PyBytes_AsString(obj);
1490 len = PyBytes_Size(obj);
1491 }
1492 else if (PyByteArray_Check(obj)) {
1493 data->buf = PyByteArray_AsString(obj);
1494 len = PyByteArray_Size(obj);
1495 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001496 else if (PyUnicode_Check(obj)) {
1497 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1498 data->buf = PyUnicode_DATA(obj);
1499 len = PyUnicode_GET_LENGTH(obj);
1500 }
1501 else {
1502 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1503 if (!obj2) {
1504 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1505 return 0;
1506 }
1507 assert(PyBytes_Check(obj2));
1508 data->obj = obj2;
1509 data->buf = PyBytes_AS_STRING(obj2);
1510 len = PyBytes_GET_SIZE(obj2);
1511 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001512 }
1513 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001514 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1515 obj->ob_type->tp_name);
1516 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001517 }
1518 if (strlen(data->buf) != len) {
1519 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001520 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001521 return 0;
1522 }
1523 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001524}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001525
1526/* Parse a socket address argument according to the socket object's
1527 address family. Return 1 if the address was in the proper format,
1528 0 of not. The address is returned through addr_ret, its length
1529 through len_ret. */
1530
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001532getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001537#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 case AF_UNIX:
1539 {
1540 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001541 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001542 int retval = 0;
1543
1544 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1545 allow embedded nulls on Linux. */
1546 if (PyUnicode_Check(args)) {
1547 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1548 return 0;
1549 }
1550 else
1551 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 if (!PyArg_Parse(args, "y*", &path)) {
1553 Py_DECREF(args);
1554 return retval;
1555 }
1556 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001559#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001560 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001562 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001563 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001565 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 }
1567 }
1568 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001569#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 {
1571 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001572 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001573 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001575 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001577 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
1579 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001580 memcpy(addr->sun_path, path.buf, path.len);
1581 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001582 retval = 1;
1583 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001584 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001585 Py_DECREF(args);
1586 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001588#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589
Martin v. Löwis11017b12006-01-14 18:12:57 +00001590#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 case AF_NETLINK:
1592 {
1593 struct sockaddr_nl* addr;
1594 int pid, groups;
1595 addr = (struct sockaddr_nl *)addr_ret;
1596 if (!PyTuple_Check(args)) {
1597 PyErr_Format(
1598 PyExc_TypeError,
1599 "getsockaddrarg: "
1600 "AF_NETLINK address must be tuple, not %.500s",
1601 Py_TYPE(args)->tp_name);
1602 return 0;
1603 }
1604 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1605 return 0;
1606 addr->nl_family = AF_NETLINK;
1607 addr->nl_pid = pid;
1608 addr->nl_groups = groups;
1609 *len_ret = sizeof(*addr);
1610 return 1;
1611 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001612#endif
1613
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001614#ifdef AF_RDS
1615 case AF_RDS:
1616 /* RDS sockets use sockaddr_in: fall-through */
1617#endif
1618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 case AF_INET:
1620 {
1621 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001622 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 int port, result;
1624 if (!PyTuple_Check(args)) {
1625 PyErr_Format(
1626 PyExc_TypeError,
1627 "getsockaddrarg: "
1628 "AF_INET address must be tuple, not %.500s",
1629 Py_TYPE(args)->tp_name);
1630 return 0;
1631 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001632 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1633 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 return 0;
1635 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001636 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 if (result < 0)
1640 return 0;
1641 if (port < 0 || port > 0xffff) {
1642 PyErr_SetString(
1643 PyExc_OverflowError,
1644 "getsockaddrarg: port must be 0-65535.");
1645 return 0;
1646 }
1647 addr->sin_family = AF_INET;
1648 addr->sin_port = htons((short)port);
1649 *len_ret = sizeof *addr;
1650 return 1;
1651 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001653#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 case AF_INET6:
1655 {
1656 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001657 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001658 int port, result;
1659 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 flowinfo = scope_id = 0;
1661 if (!PyTuple_Check(args)) {
1662 PyErr_Format(
1663 PyExc_TypeError,
1664 "getsockaddrarg: "
1665 "AF_INET6 address must be tuple, not %.500s",
1666 Py_TYPE(args)->tp_name);
1667 return 0;
1668 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001669 if (!PyArg_ParseTuple(args, "O&i|II",
1670 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 &scope_id)) {
1672 return 0;
1673 }
1674 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001675 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001677 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 if (result < 0)
1679 return 0;
1680 if (port < 0 || port > 0xffff) {
1681 PyErr_SetString(
1682 PyExc_OverflowError,
1683 "getsockaddrarg: port must be 0-65535.");
1684 return 0;
1685 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001686 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001687 PyErr_SetString(
1688 PyExc_OverflowError,
1689 "getsockaddrarg: flowinfo must be 0-1048575.");
1690 return 0;
1691 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 addr->sin6_family = s->sock_family;
1693 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001694 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 addr->sin6_scope_id = scope_id;
1696 *len_ret = sizeof *addr;
1697 return 1;
1698 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001699#endif
1700
Hye-Shik Chang81268602004-02-02 06:05:24 +00001701#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 case AF_BLUETOOTH:
1703 {
1704 switch (s->sock_proto) {
1705 case BTPROTO_L2CAP:
1706 {
1707 struct sockaddr_l2 *addr;
1708 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 addr = (struct sockaddr_l2 *)addr_ret;
1711 memset(addr, 0, sizeof(struct sockaddr_l2));
1712 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1713 if (!PyArg_ParseTuple(args, "si", &straddr,
1714 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001715 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 "wrong format");
1717 return 0;
1718 }
1719 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1720 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 *len_ret = sizeof *addr;
1723 return 1;
1724 }
1725 case BTPROTO_RFCOMM:
1726 {
1727 struct sockaddr_rc *addr;
1728 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 addr = (struct sockaddr_rc *)addr_ret;
1731 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1732 if (!PyArg_ParseTuple(args, "si", &straddr,
1733 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001734 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 "wrong format");
1736 return 0;
1737 }
1738 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1739 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 *len_ret = sizeof *addr;
1742 return 1;
1743 }
1744 case BTPROTO_HCI:
1745 {
1746 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001747#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001748 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001749
Alexander Belopolskye239d232010-12-08 23:31:48 +00001750 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001751 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001752 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001753 "wrong format");
1754 return 0;
1755 }
1756 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1757 return 0;
1758#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1760 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001761 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 "wrong format");
1763 return 0;
1764 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 *len_ret = sizeof *addr;
1767 return 1;
1768 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001769#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 case BTPROTO_SCO:
1771 {
1772 struct sockaddr_sco *addr;
1773 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 addr = (struct sockaddr_sco *)addr_ret;
1776 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1777 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001778 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 "wrong format");
1780 return 0;
1781 }
1782 straddr = PyBytes_AS_STRING(args);
1783 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1784 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 *len_ret = sizeof *addr;
1787 return 1;
1788 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001791 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 return 0;
1793 }
1794 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001795#endif
1796
Antoine Pitroub156a462010-10-27 20:13:57 +00001797#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 case AF_PACKET:
1799 {
1800 struct sockaddr_ll* addr;
1801 struct ifreq ifr;
1802 char *interfaceName;
1803 int protoNumber;
1804 int hatype = 0;
1805 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001806 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 if (!PyTuple_Check(args)) {
1809 PyErr_Format(
1810 PyExc_TypeError,
1811 "getsockaddrarg: "
1812 "AF_PACKET address must be tuple, not %.500s",
1813 Py_TYPE(args)->tp_name);
1814 return 0;
1815 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001816 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return 0;
1820 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1821 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1822 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1823 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001824 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 return 0;
1826 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001827 if (haddr.buf && haddr.len > 8) {
1828 PyErr_SetString(PyExc_ValueError,
1829 "Hardware address must be 8 bytes or less");
1830 PyBuffer_Release(&haddr);
1831 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 }
1833 if (protoNumber < 0 || protoNumber > 0xffff) {
1834 PyErr_SetString(
1835 PyExc_OverflowError,
1836 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001837 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 return 0;
1839 }
1840 addr = (struct sockaddr_ll*)addr_ret;
1841 addr->sll_family = AF_PACKET;
1842 addr->sll_protocol = htons((short)protoNumber);
1843 addr->sll_ifindex = ifr.ifr_ifindex;
1844 addr->sll_pkttype = pkttype;
1845 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001846 if (haddr.buf) {
1847 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1848 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001850 else
1851 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001853 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 return 1;
1855 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001856#endif
1857
Christian Heimes043d6f62008-01-07 17:19:16 +00001858#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 case AF_TIPC:
1860 {
1861 unsigned int atype, v1, v2, v3;
1862 unsigned int scope = TIPC_CLUSTER_SCOPE;
1863 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 if (!PyTuple_Check(args)) {
1866 PyErr_Format(
1867 PyExc_TypeError,
1868 "getsockaddrarg: "
1869 "AF_TIPC address must be tuple, not %.500s",
1870 Py_TYPE(args)->tp_name);
1871 return 0;
1872 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 if (!PyArg_ParseTuple(args,
1875 "IIII|I;Invalid TIPC address format",
1876 &atype, &v1, &v2, &v3, &scope))
1877 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 addr = (struct sockaddr_tipc *) addr_ret;
1880 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 addr->family = AF_TIPC;
1883 addr->scope = scope;
1884 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (atype == TIPC_ADDR_NAMESEQ) {
1887 addr->addr.nameseq.type = v1;
1888 addr->addr.nameseq.lower = v2;
1889 addr->addr.nameseq.upper = v3;
1890 } else if (atype == TIPC_ADDR_NAME) {
1891 addr->addr.name.name.type = v1;
1892 addr->addr.name.name.instance = v2;
1893 } else if (atype == TIPC_ADDR_ID) {
1894 addr->addr.id.node = v1;
1895 addr->addr.id.ref = v2;
1896 } else {
1897 /* Shouldn't happen */
1898 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1899 return 0;
1900 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 return 1;
1905 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001906#endif
1907
Vinay Sajiped6783f2014-03-21 11:44:32 +00001908#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001909 case AF_CAN:
1910 switch (s->sock_proto) {
1911 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001912 /* fall-through */
1913 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001914 {
1915 struct sockaddr_can *addr;
1916 PyObject *interfaceName;
1917 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001918 Py_ssize_t len;
1919
Benjamin Peterson18b71912013-05-16 15:29:44 -05001920 addr = (struct sockaddr_can *)addr_ret;
1921
Charles-François Natali47413c12011-10-06 19:47:44 +02001922 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1923 &interfaceName))
1924 return 0;
1925
1926 len = PyBytes_GET_SIZE(interfaceName);
1927
1928 if (len == 0) {
1929 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001930 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001931 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1932 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001933 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1934 s->errorhandler();
1935 Py_DECREF(interfaceName);
1936 return 0;
1937 }
1938 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001939 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001940 "AF_CAN interface name too long");
1941 Py_DECREF(interfaceName);
1942 return 0;
1943 }
1944
1945 addr->can_family = AF_CAN;
1946 addr->can_ifindex = ifr.ifr_ifindex;
1947
1948 *len_ret = sizeof(*addr);
1949 Py_DECREF(interfaceName);
1950 return 1;
1951 }
1952 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001953 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001954 "getsockaddrarg: unsupported CAN protocol");
1955 return 0;
1956 }
1957#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001958
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001959#ifdef PF_SYSTEM
1960 case PF_SYSTEM:
1961 switch (s->sock_proto) {
1962#ifdef SYSPROTO_CONTROL
1963 case SYSPROTO_CONTROL:
1964 {
1965 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001966
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001967 addr = (struct sockaddr_ctl *)addr_ret;
1968 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001969 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001970
1971 if (PyUnicode_Check(args)) {
1972 struct ctl_info info;
1973 PyObject *ctl_name;
1974
1975 if (!PyArg_Parse(args, "O&",
1976 PyUnicode_FSConverter, &ctl_name)) {
1977 return 0;
1978 }
1979
Victor Stinnerf50e1872015-03-20 11:32:24 +01001980 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001981 PyErr_SetString(PyExc_ValueError,
1982 "provided string is too long");
1983 Py_DECREF(ctl_name);
1984 return 0;
1985 }
1986 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1987 sizeof(info.ctl_name));
1988 Py_DECREF(ctl_name);
1989
1990 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1991 PyErr_SetString(PyExc_OSError,
1992 "cannot find kernel control with provided name");
1993 return 0;
1994 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001995
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001996 addr->sc_id = info.ctl_id;
1997 addr->sc_unit = 0;
1998 } else if (!PyArg_ParseTuple(args, "II",
1999 &(addr->sc_id), &(addr->sc_unit))) {
2000 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2001 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002002
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002003 return 0;
2004 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002005
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002006 *len_ret = sizeof(*addr);
2007 return 1;
2008 }
2009#endif
2010 default:
2011 PyErr_SetString(PyExc_OSError,
2012 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2013 return 0;
2014 }
2015#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002016#ifdef HAVE_SOCKADDR_ALG
2017 case AF_ALG:
2018 {
2019 struct sockaddr_alg *sa;
2020 char *type;
2021 char *name;
2022 sa = (struct sockaddr_alg *)addr_ret;
2023
2024 memset(sa, 0, sizeof(*sa));
2025 sa->salg_family = AF_ALG;
2026
2027 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2028 &type, &name, &sa->salg_feat, &sa->salg_mask))
2029 return 0;
2030 /* sockaddr_alg has fixed-sized char arrays for type and name */
2031 if (strlen(type) > sizeof(sa->salg_type)) {
2032 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2033 return 0;
2034 }
2035 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2036 if (strlen(name) > sizeof(sa->salg_name)) {
2037 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2038 return 0;
2039 }
2040 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2041
2042 *len_ret = sizeof(*sa);
2043 return 1;
2044 }
2045#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002050 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002054}
2055
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056
Guido van Rossum48a680c2001-03-02 06:34:14 +00002057/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002058 Return 1 if the family is known, 0 otherwise. The length is returned
2059 through len_ret. */
2060
2061static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002062getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002065
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002066#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 case AF_UNIX:
2068 {
2069 *len_ret = sizeof (struct sockaddr_un);
2070 return 1;
2071 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002072#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002073
Martin v. Löwis11017b12006-01-14 18:12:57 +00002074#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002075 case AF_NETLINK:
2076 {
2077 *len_ret = sizeof (struct sockaddr_nl);
2078 return 1;
2079 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002080#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002081
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002082#ifdef AF_RDS
2083 case AF_RDS:
2084 /* RDS sockets use sockaddr_in: fall-through */
2085#endif
2086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 case AF_INET:
2088 {
2089 *len_ret = sizeof (struct sockaddr_in);
2090 return 1;
2091 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002092
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002093#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 case AF_INET6:
2095 {
2096 *len_ret = sizeof (struct sockaddr_in6);
2097 return 1;
2098 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002099#endif
2100
Hye-Shik Chang81268602004-02-02 06:05:24 +00002101#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 case AF_BLUETOOTH:
2103 {
2104 switch(s->sock_proto)
2105 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 case BTPROTO_L2CAP:
2108 *len_ret = sizeof (struct sockaddr_l2);
2109 return 1;
2110 case BTPROTO_RFCOMM:
2111 *len_ret = sizeof (struct sockaddr_rc);
2112 return 1;
2113 case BTPROTO_HCI:
2114 *len_ret = sizeof (struct sockaddr_hci);
2115 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002116#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 case BTPROTO_SCO:
2118 *len_ret = sizeof (struct sockaddr_sco);
2119 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002122 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 "unknown BT protocol");
2124 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 }
2127 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002128#endif
2129
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002130#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 case AF_PACKET:
2132 {
2133 *len_ret = sizeof (struct sockaddr_ll);
2134 return 1;
2135 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002136#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002137
Christian Heimes043d6f62008-01-07 17:19:16 +00002138#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 case AF_TIPC:
2140 {
2141 *len_ret = sizeof (struct sockaddr_tipc);
2142 return 1;
2143 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002144#endif
2145
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002146#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002147 case AF_CAN:
2148 {
2149 *len_ret = sizeof (struct sockaddr_can);
2150 return 1;
2151 }
2152#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002153
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002154#ifdef PF_SYSTEM
2155 case PF_SYSTEM:
2156 switch(s->sock_proto) {
2157#ifdef SYSPROTO_CONTROL
2158 case SYSPROTO_CONTROL:
2159 *len_ret = sizeof (struct sockaddr_ctl);
2160 return 1;
2161#endif
2162 default:
2163 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2164 "unknown PF_SYSTEM protocol");
2165 return 0;
2166 }
2167#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002168#ifdef HAVE_SOCKADDR_ALG
2169 case AF_ALG:
2170 {
2171 *len_ret = sizeof (struct sockaddr_alg);
2172 return 1;
2173 }
2174#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002179 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002183}
2184
2185
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002186/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2187 Currently, these methods are only compiled if the RFC 2292/3542
2188 CMSG_LEN() macro is available. Older systems seem to have used
2189 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2190 it may be possible to define CMSG_LEN() that way if it's not
2191 provided. Some architectures might need extra padding after the
2192 cmsghdr, however, and CMSG_LEN() would have to take account of
2193 this. */
2194#ifdef CMSG_LEN
2195/* If length is in range, set *result to CMSG_LEN(length) and return
2196 true; otherwise, return false. */
2197static int
2198get_CMSG_LEN(size_t length, size_t *result)
2199{
2200 size_t tmp;
2201
2202 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2203 return 0;
2204 tmp = CMSG_LEN(length);
2205 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2206 return 0;
2207 *result = tmp;
2208 return 1;
2209}
2210
2211#ifdef CMSG_SPACE
2212/* If length is in range, set *result to CMSG_SPACE(length) and return
2213 true; otherwise, return false. */
2214static int
2215get_CMSG_SPACE(size_t length, size_t *result)
2216{
2217 size_t tmp;
2218
2219 /* Use CMSG_SPACE(1) here in order to take account of the padding
2220 necessary before *and* after the data. */
2221 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2222 return 0;
2223 tmp = CMSG_SPACE(length);
2224 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2225 return 0;
2226 *result = tmp;
2227 return 1;
2228}
2229#endif
2230
2231/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2232 pointer in msg->msg_control with at least "space" bytes after it,
2233 and its cmsg_len member inside the buffer. */
2234static int
2235cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2236{
2237 size_t cmsg_offset;
2238 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2239 sizeof(cmsgh->cmsg_len));
2240
Charles-François Natali466517d2011-08-28 18:23:43 +02002241 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002242 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002243 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002244 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2245 annoying under OS X as it's unsigned there and so it triggers a
2246 tautological comparison warning under Clang when compared against 0.
2247 Since the check is valid on other platforms, silence the warning under
2248 Clang. */
2249 #ifdef __clang__
2250 #pragma clang diagnostic push
2251 #pragma clang diagnostic ignored "-Wtautological-compare"
2252 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002253 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002254 #pragma GCC diagnostic push
2255 #pragma GCC diagnostic ignored "-Wtype-limits"
2256 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002257 if (msg->msg_controllen < 0)
2258 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002259 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002260 #pragma GCC diagnostic pop
2261 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002262 #ifdef __clang__
2263 #pragma clang diagnostic pop
2264 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002265 if (space < cmsg_len_end)
2266 space = cmsg_len_end;
2267 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2268 return (cmsg_offset <= (size_t)-1 - space &&
2269 cmsg_offset + space <= msg->msg_controllen);
2270}
2271
2272/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2273 *space to number of bytes following it in the buffer and return
2274 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2275 msg->msg_controllen are valid. */
2276static int
2277get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2278{
2279 size_t data_offset;
2280 char *data_ptr;
2281
2282 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2283 return 0;
2284 data_offset = data_ptr - (char *)msg->msg_control;
2285 if (data_offset > msg->msg_controllen)
2286 return 0;
2287 *space = msg->msg_controllen - data_offset;
2288 return 1;
2289}
2290
2291/* If cmsgh is invalid or not contained in the buffer pointed to by
2292 msg->msg_control, return -1. If cmsgh is valid and its associated
2293 data is entirely contained in the buffer, set *data_len to the
2294 length of the associated data and return 0. If only part of the
2295 associated data is contained in the buffer but cmsgh is otherwise
2296 valid, set *data_len to the length contained in the buffer and
2297 return 1. */
2298static int
2299get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2300{
2301 size_t space, cmsg_data_len;
2302
2303 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2304 cmsgh->cmsg_len < CMSG_LEN(0))
2305 return -1;
2306 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2307 if (!get_cmsg_data_space(msg, cmsgh, &space))
2308 return -1;
2309 if (space >= cmsg_data_len) {
2310 *data_len = cmsg_data_len;
2311 return 0;
2312 }
2313 *data_len = space;
2314 return 1;
2315}
2316#endif /* CMSG_LEN */
2317
2318
Victor Stinner31bf2d52015-04-01 21:57:09 +02002319struct sock_accept {
2320 socklen_t *addrlen;
2321 sock_addr_t *addrbuf;
2322 SOCKET_T result;
2323};
2324
2325#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2326/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2327static int accept4_works = -1;
2328#endif
2329
2330static int
2331sock_accept_impl(PySocketSockObject *s, void *data)
2332{
2333 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002334 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2335 socklen_t *paddrlen = ctx->addrlen;
2336#ifdef HAVE_SOCKADDR_ALG
2337 /* AF_ALG does not support accept() with addr and raises
2338 * ECONNABORTED instead. */
2339 if (s->sock_family == AF_ALG) {
2340 addr = NULL;
2341 paddrlen = NULL;
2342 *ctx->addrlen = 0;
2343 }
2344#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002345
2346#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2347 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002348 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002349 SOCK_CLOEXEC);
2350 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2351 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2352 accept4_works = (errno != ENOSYS);
2353 }
2354 }
2355 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002356 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002357#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002358 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002359#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002360
2361#ifdef MS_WINDOWS
2362 return (ctx->result != INVALID_SOCKET);
2363#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002364 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002365#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002366}
2367
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002368/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002369
Guido van Rossum73624e91994-10-10 17:59:00 +00002370static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002374 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 socklen_t addrlen;
2376 PyObject *sock = NULL;
2377 PyObject *addr = NULL;
2378 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002379 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 if (!getsockaddrlen(s, &addrlen))
2382 return NULL;
2383 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 if (!IS_SELECTABLE(s))
2386 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002387
Victor Stinner31bf2d52015-04-01 21:57:09 +02002388 ctx.addrlen = &addrlen;
2389 ctx.addrbuf = &addrbuf;
2390 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002392 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002393
Victor Stinnerdaf45552013-08-28 00:53:59 +02002394#ifdef MS_WINDOWS
2395 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2396 PyErr_SetFromWindowsErr(0);
2397 SOCKETCLOSE(newfd);
2398 goto finally;
2399 }
2400#else
2401
2402#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2403 if (!accept4_works)
2404#endif
2405 {
2406 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2407 SOCKETCLOSE(newfd);
2408 goto finally;
2409 }
2410 }
2411#endif
2412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 sock = PyLong_FromSocket_t(newfd);
2414 if (sock == NULL) {
2415 SOCKETCLOSE(newfd);
2416 goto finally;
2417 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2420 addrlen, s->sock_proto);
2421 if (addr == NULL)
2422 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002425
Guido van Rossum67f7a382002-06-06 21:08:16 +00002426finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 Py_XDECREF(sock);
2428 Py_XDECREF(addr);
2429 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002430}
2431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002432PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002433"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002434\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002435Wait for an incoming connection. Return a new socket file descriptor\n\
2436representing the connection, and the address of the client.\n\
2437For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002438
Guido van Rossum11ba0942002-06-13 15:07:44 +00002439/* s.setblocking(flag) method. Argument:
2440 False -- non-blocking mode; same as settimeout(0)
2441 True -- blocking mode; same as settimeout(None)
2442*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002443
Guido van Rossum73624e91994-10-10 17:59:00 +00002444static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002445sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002446{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002447 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 block = PyLong_AsLong(arg);
2450 if (block == -1 && PyErr_Occurred())
2451 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002452
Victor Stinner9001d802015-04-06 23:06:01 +02002453 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002454 if (internal_setblocking(s, block) == -1) {
2455 return NULL;
2456 }
2457 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002458}
Guido van Rossume4485b01994-09-07 14:32:49 +00002459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461"setblocking(flag)\n\
2462\n\
2463Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002464setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002465setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002466
Victor Stinner71694d52015-03-28 01:18:54 +01002467static int
2468socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2469{
2470#ifdef MS_WINDOWS
2471 struct timeval tv;
2472#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002473#ifndef HAVE_POLL
2474 _PyTime_t ms;
2475#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002476 int overflow = 0;
2477
2478 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002479 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002480 return 0;
2481 }
2482
Victor Stinner869e1772015-03-30 03:49:14 +02002483 if (_PyTime_FromSecondsObject(timeout,
2484 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002485 return -1;
2486
2487 if (*timeout < 0) {
2488 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2489 return -1;
2490 }
2491
2492#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002493 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002494#endif
2495#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002496 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2497 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002498#endif
2499 if (overflow) {
2500 PyErr_SetString(PyExc_OverflowError,
2501 "timeout doesn't fit into C timeval");
2502 return -1;
2503 }
2504
2505 return 0;
2506}
2507
Guido van Rossum11ba0942002-06-13 15:07:44 +00002508/* s.settimeout(timeout) method. Argument:
2509 None -- no timeout, blocking mode; same as setblocking(True)
2510 0.0 -- non-blocking mode; same as setblocking(False)
2511 > 0 -- timeout mode; operations time out after timeout seconds
2512 < 0 -- illegal; raises an exception
2513*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002514static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002515sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002516{
Victor Stinner71694d52015-03-28 01:18:54 +01002517 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Victor Stinner71694d52015-03-28 01:18:54 +01002519 if (socket_parse_timeout(&timeout, arg) < 0)
2520 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002523 if (internal_setblocking(s, timeout < 0) == -1) {
2524 return NULL;
2525 }
2526 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002527}
2528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002529PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002530"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002531\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002532Set a timeout on socket operations. 'timeout' can be a float,\n\
2533giving in seconds, or None. Setting a timeout of None disables\n\
2534the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002535Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002536
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002537/* s.gettimeout() method.
2538 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002539static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002540sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002541{
Victor Stinner71694d52015-03-28 01:18:54 +01002542 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 Py_INCREF(Py_None);
2544 return Py_None;
2545 }
Victor Stinner71694d52015-03-28 01:18:54 +01002546 else {
2547 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2548 return PyFloat_FromDouble(seconds);
2549 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002550}
2551
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002552PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002553"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002554\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002555Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002556operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002557operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002558
Guido van Rossumaee08791992-09-08 09:05:33 +00002559/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002560 With an integer third argument, sets an integer optval with optlen=4.
2561 With None as third argument and an integer fourth argument, set
2562 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002563 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002564 use optional built-in module 'struct' to encode the string.
2565*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002566
Guido van Rossum73624e91994-10-10 17:59:00 +00002567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 int level;
2571 int optname;
2572 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002573 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002575 unsigned int optlen;
2576 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002577
Christian Heimesdffa3942016-09-05 23:54:41 +02002578 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 if (PyArg_ParseTuple(args, "iii:setsockopt",
2580 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002581 res = setsockopt(s->sock_fd, level, optname,
2582 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002583 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002585
2586 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002587 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002588 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2589 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2590 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002591 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002592 NULL, (socklen_t)optlen);
2593 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002595
2596 PyErr_Clear();
2597 /* setsockopt(level, opt, buffer) */
2598 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2599 &level, &optname, &optval))
2600 return NULL;
2601
2602#ifdef MS_WINDOWS
2603 if (optval.len > INT_MAX) {
2604 PyBuffer_Release(&optval);
2605 PyErr_Format(PyExc_OverflowError,
2606 "socket option is larger than %i bytes",
2607 INT_MAX);
2608 return NULL;
2609 }
2610 res = setsockopt(s->sock_fd, level, optname,
2611 optval.buf, (int)optval.len);
2612#else
2613 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2614#endif
2615 PyBuffer_Release(&optval);
2616
2617done:
Victor Stinnercc739322016-03-23 21:35:29 +01002618 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002620 }
2621
2622 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002623}
2624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002625PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002626"setsockopt(level, option, value: int)\n\
2627setsockopt(level, option, value: buffer)\n\
2628setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002629\n\
2630Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002631The value argument can either be an integer, a string buffer, or \n\
2632None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002633
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002634
Guido van Rossumaee08791992-09-08 09:05:33 +00002635/* s.getsockopt() method.
2636 With two arguments, retrieves an integer option.
2637 With a third integer argument, retrieves a string buffer of that size;
2638 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002639
Guido van Rossum73624e91994-10-10 17:59:00 +00002640static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002641sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 int level;
2644 int optname;
2645 int res;
2646 PyObject *buf;
2647 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2650 &level, &optname, &buflen))
2651 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 if (buflen == 0) {
2654 int flag = 0;
2655 socklen_t flagsize = sizeof flag;
2656 res = getsockopt(s->sock_fd, level, optname,
2657 (void *)&flag, &flagsize);
2658 if (res < 0)
2659 return s->errorhandler();
2660 return PyLong_FromLong(flag);
2661 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002663 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 "getsockopt buflen out of range");
2665 return NULL;
2666 }
2667 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2668 if (buf == NULL)
2669 return NULL;
2670 res = getsockopt(s->sock_fd, level, optname,
2671 (void *)PyBytes_AS_STRING(buf), &buflen);
2672 if (res < 0) {
2673 Py_DECREF(buf);
2674 return s->errorhandler();
2675 }
2676 _PyBytes_Resize(&buf, buflen);
2677 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002678}
2679
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002680PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002681"getsockopt(level, option[, buffersize]) -> value\n\
2682\n\
2683Get a socket option. See the Unix manual for level and option.\n\
2684If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002685string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002686
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002687
Fred Drake728819a2000-07-01 03:40:12 +00002688/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002689
Guido van Rossum73624e91994-10-10 17:59:00 +00002690static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002691sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 sock_addr_t addrbuf;
2694 int addrlen;
2695 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2698 return NULL;
2699 Py_BEGIN_ALLOW_THREADS
2700 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2701 Py_END_ALLOW_THREADS
2702 if (res < 0)
2703 return s->errorhandler();
2704 Py_INCREF(Py_None);
2705 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002706}
2707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709"bind(address)\n\
2710\n\
2711Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002712pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714
Guido van Rossum30a685f1991-06-27 15:51:29 +00002715
2716/* s.close() method.
2717 Set the file descriptor to -1 so operations tried subsequently
2718 will surely fail. */
2719
Guido van Rossum73624e91994-10-10 17:59:00 +00002720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002721sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002724 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002725
Victor Stinner19a8e842016-03-21 16:36:48 +01002726 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002727 if (fd != INVALID_SOCKET) {
2728 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002729
2730 /* We do not want to retry upon EINTR: see
2731 http://lwn.net/Articles/576478/ and
2732 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2733 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002735 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002737 if (res < 0) {
2738 return s->errorhandler();
2739 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 }
2741 Py_INCREF(Py_None);
2742 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002743}
2744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002746"close()\n\
2747\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002748Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002749
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002750static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002751sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002752{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002753 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002754 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002755 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002756}
2757
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002758PyDoc_STRVAR(detach_doc,
2759"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002760\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002761Close the socket object without closing the underlying file descriptor.\n\
2762The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002763can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002764
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002765static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002766sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002767{
Victor Stinner81c41db2015-04-02 11:50:57 +02002768 int err;
2769 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002770
Victor Stinner81c41db2015-04-02 11:50:57 +02002771 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2772 /* getsockopt() failed */
2773 return 0;
2774 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002775
Victor Stinner81c41db2015-04-02 11:50:57 +02002776 if (err == EISCONN)
2777 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002778 if (err != 0) {
2779 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2780 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002781 return 0;
2782 }
2783 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002784}
2785
2786static int
2787internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2788 int raise)
2789{
2790 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002791
2792 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002794 Py_END_ALLOW_THREADS
2795
Victor Stinner70a46f62015-03-31 22:03:59 +02002796 if (!res) {
2797 /* connect() succeeded, the socket is connected */
2798 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002800
Victor Stinner81c41db2015-04-02 11:50:57 +02002801 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002802
Victor Stinner81c41db2015-04-02 11:50:57 +02002803 /* save error, PyErr_CheckSignals() can replace it */
2804 err = GET_SOCK_ERROR;
2805 if (CHECK_ERRNO(EINTR)) {
2806 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002807 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002808
2809 /* Issue #23618: when connect() fails with EINTR, the connection is
2810 running asynchronously.
2811
2812 If the socket is blocking or has a timeout, wait until the
2813 connection completes, fails or timed out using select(), and then
2814 get the connection status using getsockopt(SO_ERROR).
2815
2816 If the socket is non-blocking, raise InterruptedError. The caller is
2817 responsible to wait until the connection completes, fails or timed
2818 out (it's the case in asyncio for example). */
2819 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2820 }
2821 else {
2822 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2823 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002824 }
2825
Victor Stinner81c41db2015-04-02 11:50:57 +02002826 if (!wait_connect) {
2827 if (raise) {
2828 /* restore error, maybe replaced by PyErr_CheckSignals() */
2829 SET_SOCK_ERROR(err);
2830 s->errorhandler();
2831 return -1;
2832 }
2833 else
2834 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002835 }
2836
Victor Stinner81c41db2015-04-02 11:50:57 +02002837 if (raise) {
2838 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002839 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2840 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002841 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002842 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002843 else {
2844 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002845 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2846 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002847 return err;
2848 }
2849 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002850}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002851
Fred Drake728819a2000-07-01 03:40:12 +00002852/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002853
Guido van Rossum73624e91994-10-10 17:59:00 +00002854static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002855sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 sock_addr_t addrbuf;
2858 int addrlen;
2859 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2862 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002863
Victor Stinner81c41db2015-04-02 11:50:57 +02002864 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002865 if (res < 0)
2866 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002867
Victor Stinneree699e92015-03-31 21:28:42 +02002868 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002869}
2870
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002871PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002872"connect(address)\n\
2873\n\
2874Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002876
Guido van Rossum30a685f1991-06-27 15:51:29 +00002877
Fred Drake728819a2000-07-01 03:40:12 +00002878/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002879
2880static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002881sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 sock_addr_t addrbuf;
2884 int addrlen;
2885 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2888 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002889
Victor Stinner81c41db2015-04-02 11:50:57 +02002890 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002891 if (res < 0)
2892 return NULL;
2893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002895}
2896
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002897PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002898"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002899\n\
2900This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002903
Guido van Rossumed233a51992-06-23 09:07:03 +00002904/* s.fileno() method */
2905
Guido van Rossum73624e91994-10-10 17:59:00 +00002906static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002907sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002910}
2911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002912PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002913"fileno() -> integer\n\
2914\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002915Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002916
Guido van Rossumed233a51992-06-23 09:07:03 +00002917
Guido van Rossumc89705d1992-11-26 08:54:07 +00002918/* s.getsockname() method */
2919
Guido van Rossum73624e91994-10-10 17:59:00 +00002920static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002921sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 sock_addr_t addrbuf;
2924 int res;
2925 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 if (!getsockaddrlen(s, &addrlen))
2928 return NULL;
2929 memset(&addrbuf, 0, addrlen);
2930 Py_BEGIN_ALLOW_THREADS
2931 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2932 Py_END_ALLOW_THREADS
2933 if (res < 0)
2934 return s->errorhandler();
2935 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2936 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002937}
2938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002939PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002940"getsockname() -> address info\n\
2941\n\
2942Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002943info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002944
Guido van Rossumc89705d1992-11-26 08:54:07 +00002945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002947/* s.getpeername() method */
2948
Guido van Rossum73624e91994-10-10 17:59:00 +00002949static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002950sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 sock_addr_t addrbuf;
2953 int res;
2954 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 if (!getsockaddrlen(s, &addrlen))
2957 return NULL;
2958 memset(&addrbuf, 0, addrlen);
2959 Py_BEGIN_ALLOW_THREADS
2960 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2961 Py_END_ALLOW_THREADS
2962 if (res < 0)
2963 return s->errorhandler();
2964 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2965 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002966}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969"getpeername() -> address info\n\
2970\n\
2971Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002972info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002973
Guido van Rossumb6775db1994-08-01 11:34:53 +00002974#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002975
2976
Guido van Rossum30a685f1991-06-27 15:51:29 +00002977/* s.listen(n) method */
2978
Guido van Rossum73624e91994-10-10 17:59:00 +00002979static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002980sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002981{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002982 /* We try to choose a default backlog high enough to avoid connection drops
2983 * for common workloads, yet not too high to limit resource usage. */
2984 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002986
Charles-François Natali644b8f52014-05-22 19:45:39 +01002987 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002991 /* To avoid problems on systems that don't allow a negative backlog
2992 * (which doesn't make sense anyway) we force a minimum value of 0. */
2993 if (backlog < 0)
2994 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 res = listen(s->sock_fd, backlog);
2996 Py_END_ALLOW_THREADS
2997 if (res < 0)
2998 return s->errorhandler();
2999 Py_INCREF(Py_None);
3000 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003001}
3002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003003PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003004"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003006Enable a server to accept connections. If backlog is specified, it must be\n\
3007at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003008unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003009connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003010
Victor Stinner31bf2d52015-04-01 21:57:09 +02003011struct sock_recv {
3012 char *cbuf;
3013 Py_ssize_t len;
3014 int flags;
3015 Py_ssize_t result;
3016};
3017
3018static int
3019sock_recv_impl(PySocketSockObject *s, void *data)
3020{
3021 struct sock_recv *ctx = data;
3022
3023#ifdef MS_WINDOWS
3024 if (ctx->len > INT_MAX)
3025 ctx->len = INT_MAX;
3026 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3027#else
3028 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3029#endif
3030 return (ctx->result >= 0);
3031}
3032
Guido van Rossum82a5c661998-07-07 20:45:43 +00003033
Thomas Wouters477c8d52006-05-27 19:21:47 +00003034/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003035 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003036 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003037 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003038 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003039 * also possible that we return a number of bytes smaller than the request
3040 * bytes.
3041 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003042
Antoine Pitrou19467d22010-08-17 19:33:30 +00003043static Py_ssize_t
3044sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003045{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003046 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 if (!IS_SELECTABLE(s)) {
3049 select_error();
3050 return -1;
3051 }
3052 if (len == 0) {
3053 /* If 0 bytes were requested, do nothing. */
3054 return 0;
3055 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056
Victor Stinner31bf2d52015-04-01 21:57:09 +02003057 ctx.cbuf = cbuf;
3058 ctx.len = len;
3059 ctx.flags = flags;
3060 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003062
3063 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003064}
3065
Guido van Rossum48a680c2001-03-02 06:34:14 +00003066
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003067/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003068
Guido van Rossum73624e91994-10-10 17:59:00 +00003069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003070sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003071{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003072 Py_ssize_t recvlen, outlen;
3073 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003075
Antoine Pitrou19467d22010-08-17 19:33:30 +00003076 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 if (recvlen < 0) {
3080 PyErr_SetString(PyExc_ValueError,
3081 "negative buffersize in recv");
3082 return NULL;
3083 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 /* Allocate a new string. */
3086 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3087 if (buf == NULL)
3088 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 /* Call the guts */
3091 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3092 if (outlen < 0) {
3093 /* An error occurred, release the string and return an
3094 error. */
3095 Py_DECREF(buf);
3096 return NULL;
3097 }
3098 if (outlen != recvlen) {
3099 /* We did not read as many bytes as we anticipated, resize the
3100 string if possible and be successful. */
3101 _PyBytes_Resize(&buf, outlen);
3102 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003105}
3106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003107PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108"recv(buffersize[, flags]) -> data\n\
3109\n\
3110Receive up to buffersize bytes from the socket. For the optional flags\n\
3111argument, see the Unix manual. When no data is available, block until\n\
3112at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003113the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003114
Guido van Rossum30a685f1991-06-27 15:51:29 +00003115
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003116/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003117
Thomas Wouters477c8d52006-05-27 19:21:47 +00003118static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003119sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003122
Antoine Pitrou19467d22010-08-17 19:33:30 +00003123 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 Py_buffer pbuf;
3125 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003126 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003129 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 &pbuf, &recvlen, &flags))
3131 return NULL;
3132 buf = pbuf.buf;
3133 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 if (recvlen < 0) {
3136 PyBuffer_Release(&pbuf);
3137 PyErr_SetString(PyExc_ValueError,
3138 "negative buffersize in recv_into");
3139 return NULL;
3140 }
3141 if (recvlen == 0) {
3142 /* If nbytes was not specified, use the buffer's length */
3143 recvlen = buflen;
3144 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 /* Check if the buffer is large enough */
3147 if (buflen < recvlen) {
3148 PyBuffer_Release(&pbuf);
3149 PyErr_SetString(PyExc_ValueError,
3150 "buffer too small for requested bytes");
3151 return NULL;
3152 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 /* Call the guts */
3155 readlen = sock_recv_guts(s, buf, recvlen, flags);
3156 if (readlen < 0) {
3157 /* Return an error. */
3158 PyBuffer_Release(&pbuf);
3159 return NULL;
3160 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 PyBuffer_Release(&pbuf);
3163 /* Return the number of bytes read. Note that we do not do anything
3164 special here in the case that readlen < recvlen. */
3165 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003166}
3167
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003168PyDoc_STRVAR(recv_into_doc,
3169"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003170\n\
3171A version of recv() that stores its data into a buffer rather than creating \n\
3172a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3173is not specified (or 0), receive up to the size available in the given buffer.\n\
3174\n\
3175See recv() for documentation about the flags.");
3176
Victor Stinner31bf2d52015-04-01 21:57:09 +02003177struct sock_recvfrom {
3178 char* cbuf;
3179 Py_ssize_t len;
3180 int flags;
3181 socklen_t *addrlen;
3182 sock_addr_t *addrbuf;
3183 Py_ssize_t result;
3184};
3185
3186static int
3187sock_recvfrom_impl(PySocketSockObject *s, void *data)
3188{
3189 struct sock_recvfrom *ctx = data;
3190
3191 memset(ctx->addrbuf, 0, *ctx->addrlen);
3192
3193#ifdef MS_WINDOWS
3194 if (ctx->len > INT_MAX)
3195 ctx->len = INT_MAX;
3196 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3197 SAS2SA(ctx->addrbuf), ctx->addrlen);
3198#else
3199 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3200 SAS2SA(ctx->addrbuf), ctx->addrlen);
3201#endif
3202 return (ctx->result >= 0);
3203}
3204
Thomas Wouters477c8d52006-05-27 19:21:47 +00003205
3206/*
Christian Heimes99170a52007-12-19 02:07:34 +00003207 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3208 * into a char buffer. If you have any inc/def ref to do to the objects that
3209 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003210 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003211 * that it is also possible that we return a number of bytes smaller than the
3212 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213 *
3214 * 'addr' is a return value for the address object. Note that you must decref
3215 * it yourself.
3216 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003217static Py_ssize_t
3218sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003223 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 if (!getsockaddrlen(s, &addrlen))
3228 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 if (!IS_SELECTABLE(s)) {
3231 select_error();
3232 return -1;
3233 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003234
Victor Stinner31bf2d52015-04-01 21:57:09 +02003235 ctx.cbuf = cbuf;
3236 ctx.len = len;
3237 ctx.flags = flags;
3238 ctx.addrbuf = &addrbuf;
3239 ctx.addrlen = &addrlen;
3240 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003242
Victor Stinner31bf2d52015-04-01 21:57:09 +02003243 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3244 s->sock_proto);
3245 if (*addr == NULL)
3246 return -1;
3247
3248 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003249}
3250
3251/* s.recvfrom(nbytes [,flags]) method */
3252
3253static PyObject *
3254sock_recvfrom(PySocketSockObject *s, PyObject *args)
3255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 PyObject *buf = NULL;
3257 PyObject *addr = NULL;
3258 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003259 int flags = 0;
3260 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003261
Antoine Pitrou19467d22010-08-17 19:33:30 +00003262 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 if (recvlen < 0) {
3266 PyErr_SetString(PyExc_ValueError,
3267 "negative buffersize in recvfrom");
3268 return NULL;
3269 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3272 if (buf == NULL)
3273 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3276 recvlen, flags, &addr);
3277 if (outlen < 0) {
3278 goto finally;
3279 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 if (outlen != recvlen) {
3282 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003283 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003285 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 goto finally;
3287 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
3291finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 Py_XDECREF(buf);
3293 Py_XDECREF(addr);
3294 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003295}
3296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003297PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003298"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3299\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003300Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003301
Thomas Wouters477c8d52006-05-27 19:21:47 +00003302
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003303/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304
3305static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003306sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003309
Antoine Pitrou19467d22010-08-17 19:33:30 +00003310 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 Py_buffer pbuf;
3312 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003313 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003316
Antoine Pitrou19467d22010-08-17 19:33:30 +00003317 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 kwlist, &pbuf,
3319 &recvlen, &flags))
3320 return NULL;
3321 buf = pbuf.buf;
3322 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 if (recvlen < 0) {
3325 PyBuffer_Release(&pbuf);
3326 PyErr_SetString(PyExc_ValueError,
3327 "negative buffersize in recvfrom_into");
3328 return NULL;
3329 }
3330 if (recvlen == 0) {
3331 /* If nbytes was not specified, use the buffer's length */
3332 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003333 } else if (recvlen > buflen) {
3334 PyBuffer_Release(&pbuf);
3335 PyErr_SetString(PyExc_ValueError,
3336 "nbytes is greater than the length of the buffer");
3337 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3341 if (readlen < 0) {
3342 PyBuffer_Release(&pbuf);
3343 /* Return an error */
3344 Py_XDECREF(addr);
3345 return NULL;
3346 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 PyBuffer_Release(&pbuf);
3349 /* Return the number of bytes read and the address. Note that we do
3350 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003351 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003352}
3353
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003354PyDoc_STRVAR(recvfrom_into_doc,
3355"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003356\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003357Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003358
Victor Stinner35bee932015-04-02 12:28:07 +02003359/* The sendmsg() and recvmsg[_into]() methods require a working
3360 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3361#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003362struct sock_recvmsg {
3363 struct msghdr *msg;
3364 int flags;
3365 ssize_t result;
3366};
3367
3368static int
3369sock_recvmsg_impl(PySocketSockObject *s, void *data)
3370{
3371 struct sock_recvmsg *ctx = data;
3372
3373 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3374 return (ctx->result >= 0);
3375}
3376
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003377/*
3378 * Call recvmsg() with the supplied iovec structures, flags, and
3379 * ancillary data buffer size (controllen). Returns the tuple return
3380 * value for recvmsg() or recvmsg_into(), with the first item provided
3381 * by the supplied makeval() function. makeval() will be called with
3382 * the length read and makeval_data as arguments, and must return a
3383 * new reference (which will be decrefed if there is a subsequent
3384 * error). On error, closes any file descriptors received via
3385 * SCM_RIGHTS.
3386 */
3387static PyObject *
3388sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3389 int flags, Py_ssize_t controllen,
3390 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3391{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003392 sock_addr_t addrbuf;
3393 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003394 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003395 PyObject *cmsg_list = NULL, *retval = NULL;
3396 void *controlbuf = NULL;
3397 struct cmsghdr *cmsgh;
3398 size_t cmsgdatalen = 0;
3399 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003400 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003401
3402 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3403 ignored" when the socket is connected (Linux fills them in
3404 anyway for AF_UNIX sockets at least). Normally msg_namelen
3405 seems to be set to 0 if there's no address, but try to
3406 initialize msg_name to something that won't be mistaken for a
3407 real address if that doesn't happen. */
3408 if (!getsockaddrlen(s, &addrbuflen))
3409 return NULL;
3410 memset(&addrbuf, 0, addrbuflen);
3411 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3412
3413 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3414 PyErr_SetString(PyExc_ValueError,
3415 "invalid ancillary data buffer length");
3416 return NULL;
3417 }
3418 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3419 return PyErr_NoMemory();
3420
3421 /* Make the system call. */
3422 if (!IS_SELECTABLE(s)) {
3423 select_error();
3424 goto finally;
3425 }
3426
Victor Stinner31bf2d52015-04-01 21:57:09 +02003427 msg.msg_name = SAS2SA(&addrbuf);
3428 msg.msg_namelen = addrbuflen;
3429 msg.msg_iov = iov;
3430 msg.msg_iovlen = iovlen;
3431 msg.msg_control = controlbuf;
3432 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003433
Victor Stinner31bf2d52015-04-01 21:57:09 +02003434 ctx.msg = &msg;
3435 ctx.flags = flags;
3436 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003437 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003438
3439 /* Make list of (level, type, data) tuples from control messages. */
3440 if ((cmsg_list = PyList_New(0)) == NULL)
3441 goto err_closefds;
3442 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3443 implementations didn't do so. */
3444 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3445 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3446 PyObject *bytes, *tuple;
3447 int tmp;
3448
3449 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3450 if (cmsg_status != 0) {
3451 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3452 "received malformed or improperly-truncated "
3453 "ancillary data", 1) == -1)
3454 goto err_closefds;
3455 }
3456 if (cmsg_status < 0)
3457 break;
3458 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003459 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460 goto err_closefds;
3461 }
3462
3463 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3464 cmsgdatalen);
3465 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3466 (int)cmsgh->cmsg_type, bytes);
3467 if (tuple == NULL)
3468 goto err_closefds;
3469 tmp = PyList_Append(cmsg_list, tuple);
3470 Py_DECREF(tuple);
3471 if (tmp != 0)
3472 goto err_closefds;
3473
3474 if (cmsg_status != 0)
3475 break;
3476 }
3477
3478 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003479 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003480 cmsg_list,
3481 (int)msg.msg_flags,
3482 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3483 ((msg.msg_namelen > addrbuflen) ?
3484 addrbuflen : msg.msg_namelen),
3485 s->sock_proto));
3486 if (retval == NULL)
3487 goto err_closefds;
3488
3489finally:
3490 Py_XDECREF(cmsg_list);
3491 PyMem_Free(controlbuf);
3492 return retval;
3493
3494err_closefds:
3495#ifdef SCM_RIGHTS
3496 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3497 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3498 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3499 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3500 if (cmsg_status < 0)
3501 break;
3502 if (cmsgh->cmsg_level == SOL_SOCKET &&
3503 cmsgh->cmsg_type == SCM_RIGHTS) {
3504 size_t numfds;
3505 int *fdp;
3506
3507 numfds = cmsgdatalen / sizeof(int);
3508 fdp = (int *)CMSG_DATA(cmsgh);
3509 while (numfds-- > 0)
3510 close(*fdp++);
3511 }
3512 if (cmsg_status != 0)
3513 break;
3514 }
3515#endif /* SCM_RIGHTS */
3516 goto finally;
3517}
3518
3519
3520static PyObject *
3521makeval_recvmsg(ssize_t received, void *data)
3522{
3523 PyObject **buf = data;
3524
3525 if (received < PyBytes_GET_SIZE(*buf))
3526 _PyBytes_Resize(buf, received);
3527 Py_XINCREF(*buf);
3528 return *buf;
3529}
3530
3531/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3532
3533static PyObject *
3534sock_recvmsg(PySocketSockObject *s, PyObject *args)
3535{
3536 Py_ssize_t bufsize, ancbufsize = 0;
3537 int flags = 0;
3538 struct iovec iov;
3539 PyObject *buf = NULL, *retval = NULL;
3540
3541 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3542 return NULL;
3543
3544 if (bufsize < 0) {
3545 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3546 return NULL;
3547 }
3548 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3549 return NULL;
3550 iov.iov_base = PyBytes_AS_STRING(buf);
3551 iov.iov_len = bufsize;
3552
3553 /* Note that we're passing a pointer to *our pointer* to the bytes
3554 object here (&buf); makeval_recvmsg() may incref the object, or
3555 deallocate it and set our pointer to NULL. */
3556 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3557 &makeval_recvmsg, &buf);
3558 Py_XDECREF(buf);
3559 return retval;
3560}
3561
3562PyDoc_STRVAR(recvmsg_doc,
3563"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3564\n\
3565Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3566socket. The ancbufsize argument sets the size in bytes of the\n\
3567internal buffer used to receive the ancillary data; it defaults to 0,\n\
3568meaning that no ancillary data will be received. Appropriate buffer\n\
3569sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3570CMSG_LEN(), and items which do not fit into the buffer might be\n\
3571truncated or discarded. The flags argument defaults to 0 and has the\n\
3572same meaning as for recv().\n\
3573\n\
3574The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3575The data item is a bytes object holding the non-ancillary data\n\
3576received. The ancdata item is a list of zero or more tuples\n\
3577(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3578(control messages) received: cmsg_level and cmsg_type are integers\n\
3579specifying the protocol level and protocol-specific type respectively,\n\
3580and cmsg_data is a bytes object holding the associated data. The\n\
3581msg_flags item is the bitwise OR of various flags indicating\n\
3582conditions on the received message; see your system documentation for\n\
3583details. If the receiving socket is unconnected, address is the\n\
3584address of the sending socket, if available; otherwise, its value is\n\
3585unspecified.\n\
3586\n\
3587If recvmsg() raises an exception after the system call returns, it\n\
3588will first attempt to close any file descriptors received via the\n\
3589SCM_RIGHTS mechanism.");
3590
3591
3592static PyObject *
3593makeval_recvmsg_into(ssize_t received, void *data)
3594{
3595 return PyLong_FromSsize_t(received);
3596}
3597
3598/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3599
3600static PyObject *
3601sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3602{
3603 Py_ssize_t ancbufsize = 0;
3604 int flags = 0;
3605 struct iovec *iovs = NULL;
3606 Py_ssize_t i, nitems, nbufs = 0;
3607 Py_buffer *bufs = NULL;
3608 PyObject *buffers_arg, *fast, *retval = NULL;
3609
3610 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3611 &buffers_arg, &ancbufsize, &flags))
3612 return NULL;
3613
3614 if ((fast = PySequence_Fast(buffers_arg,
3615 "recvmsg_into() argument 1 must be an "
3616 "iterable")) == NULL)
3617 return NULL;
3618 nitems = PySequence_Fast_GET_SIZE(fast);
3619 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003620 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003621 goto finally;
3622 }
3623
3624 /* Fill in an iovec for each item, and save the Py_buffer
3625 structs to release afterwards. */
3626 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3627 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3628 PyErr_NoMemory();
3629 goto finally;
3630 }
3631 for (; nbufs < nitems; nbufs++) {
3632 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3633 "w*;recvmsg_into() argument 1 must be an iterable "
3634 "of single-segment read-write buffers",
3635 &bufs[nbufs]))
3636 goto finally;
3637 iovs[nbufs].iov_base = bufs[nbufs].buf;
3638 iovs[nbufs].iov_len = bufs[nbufs].len;
3639 }
3640
3641 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3642 &makeval_recvmsg_into, NULL);
3643finally:
3644 for (i = 0; i < nbufs; i++)
3645 PyBuffer_Release(&bufs[i]);
3646 PyMem_Free(bufs);
3647 PyMem_Free(iovs);
3648 Py_DECREF(fast);
3649 return retval;
3650}
3651
3652PyDoc_STRVAR(recvmsg_into_doc,
3653"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3654\n\
3655Receive normal data and ancillary data from the socket, scattering the\n\
3656non-ancillary data into a series of buffers. The buffers argument\n\
3657must be an iterable of objects that export writable buffers\n\
3658(e.g. bytearray objects); these will be filled with successive chunks\n\
3659of the non-ancillary data until it has all been written or there are\n\
3660no more buffers. The ancbufsize argument sets the size in bytes of\n\
3661the internal buffer used to receive the ancillary data; it defaults to\n\
36620, meaning that no ancillary data will be received. Appropriate\n\
3663buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3664or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3665truncated or discarded. The flags argument defaults to 0 and has the\n\
3666same meaning as for recv().\n\
3667\n\
3668The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3669The nbytes item is the total number of bytes of non-ancillary data\n\
3670written into the buffers. The ancdata item is a list of zero or more\n\
3671tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3672data (control messages) received: cmsg_level and cmsg_type are\n\
3673integers specifying the protocol level and protocol-specific type\n\
3674respectively, and cmsg_data is a bytes object holding the associated\n\
3675data. The msg_flags item is the bitwise OR of various flags\n\
3676indicating conditions on the received message; see your system\n\
3677documentation for details. If the receiving socket is unconnected,\n\
3678address is the address of the sending socket, if available; otherwise,\n\
3679its value is unspecified.\n\
3680\n\
3681If recvmsg_into() raises an exception after the system call returns,\n\
3682it will first attempt to close any file descriptors received via the\n\
3683SCM_RIGHTS mechanism.");
3684#endif /* CMSG_LEN */
3685
3686
Victor Stinner31bf2d52015-04-01 21:57:09 +02003687struct sock_send {
3688 char *buf;
3689 Py_ssize_t len;
3690 int flags;
3691 Py_ssize_t result;
3692};
3693
3694static int
3695sock_send_impl(PySocketSockObject *s, void *data)
3696{
3697 struct sock_send *ctx = data;
3698
3699#ifdef MS_WINDOWS
3700 if (ctx->len > INT_MAX)
3701 ctx->len = INT_MAX;
3702 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3703#else
3704 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3705#endif
3706 return (ctx->result >= 0);
3707}
3708
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003709/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003710
Guido van Rossum73624e91994-10-10 17:59:00 +00003711static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003712sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003713{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003714 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003716 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3719 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 if (!IS_SELECTABLE(s)) {
3722 PyBuffer_Release(&pbuf);
3723 return select_error();
3724 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003725 ctx.buf = pbuf.buf;
3726 ctx.len = pbuf.len;
3727 ctx.flags = flags;
3728 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003729 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 return NULL;
3731 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003732 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003733
3734 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003735}
3736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003737PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003738"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003739\n\
3740Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003741argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003742sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003743
3744
3745/* s.sendall(data [,flags]) method */
3746
3747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003748sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003751 Py_ssize_t len, n;
3752 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003754 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003755 int has_timeout = (s->sock_timeout > 0);
3756 _PyTime_t interval = s->sock_timeout;
3757 _PyTime_t deadline = 0;
3758 int deadline_initialized = 0;
3759 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3762 return NULL;
3763 buf = pbuf.buf;
3764 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 if (!IS_SELECTABLE(s)) {
3767 PyBuffer_Release(&pbuf);
3768 return select_error();
3769 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003772 if (has_timeout) {
3773 if (deadline_initialized) {
3774 /* recompute the timeout */
3775 interval = deadline - _PyTime_GetMonotonicClock();
3776 }
3777 else {
3778 deadline_initialized = 1;
3779 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3780 }
3781
3782 if (interval <= 0) {
3783 PyErr_SetString(socket_timeout, "timed out");
3784 goto done;
3785 }
3786 }
3787
Victor Stinner02f32ab2015-04-01 22:53:26 +02003788 ctx.buf = buf;
3789 ctx.len = len;
3790 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003791 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3792 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003793 n = ctx.result;
3794 assert(n >= 0);
3795
3796 buf += n;
3797 len -= n;
3798
3799 /* We must run our signal handlers before looping again.
3800 send() can return a successful partial write when it is
3801 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003802 if (PyErr_CheckSignals())
3803 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003804 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003806
Victor Stinner8912d142015-04-06 23:16:34 +02003807 Py_INCREF(Py_None);
3808 res = Py_None;
3809
3810done:
3811 PyBuffer_Release(&pbuf);
3812 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003813}
3814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003815PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003816"sendall(data[, flags])\n\
3817\n\
3818Send a data string to the socket. For the optional flags\n\
3819argument, see the Unix manual. This calls send() repeatedly\n\
3820until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003821to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003822
Guido van Rossum30a685f1991-06-27 15:51:29 +00003823
Victor Stinner31bf2d52015-04-01 21:57:09 +02003824struct sock_sendto {
3825 char *buf;
3826 Py_ssize_t len;
3827 int flags;
3828 int addrlen;
3829 sock_addr_t *addrbuf;
3830 Py_ssize_t result;
3831};
3832
3833static int
3834sock_sendto_impl(PySocketSockObject *s, void *data)
3835{
3836 struct sock_sendto *ctx = data;
3837
3838#ifdef MS_WINDOWS
3839 if (ctx->len > INT_MAX)
3840 ctx->len = INT_MAX;
3841 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3842 SAS2SA(ctx->addrbuf), ctx->addrlen);
3843#else
3844 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3845 SAS2SA(ctx->addrbuf), ctx->addrlen);
3846#endif
3847 return (ctx->result >= 0);
3848}
3849
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003850/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003851
Guido van Rossum73624e91994-10-10 17:59:00 +00003852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003853sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003855 Py_buffer pbuf;
3856 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003857 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003859 int addrlen, flags;
3860 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003863 arglen = PyTuple_Size(args);
3864 switch (arglen) {
3865 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003866 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3867 return NULL;
3868 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003869 break;
3870 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003871 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3872 &pbuf, &flags, &addro)) {
3873 return NULL;
3874 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003875 break;
3876 default:
3877 PyErr_Format(PyExc_TypeError,
3878 "sendto() takes 2 or 3 arguments (%d given)",
3879 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003880 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003881 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 if (!IS_SELECTABLE(s)) {
3884 PyBuffer_Release(&pbuf);
3885 return select_error();
3886 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3889 PyBuffer_Release(&pbuf);
3890 return NULL;
3891 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003892
Victor Stinner31bf2d52015-04-01 21:57:09 +02003893 ctx.buf = pbuf.buf;
3894 ctx.len = pbuf.len;
3895 ctx.flags = flags;
3896 ctx.addrlen = addrlen;
3897 ctx.addrbuf = &addrbuf;
3898 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003899 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003900 return NULL;
3901 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003902 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003903
3904 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003905}
3906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003907PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003908"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003909\n\
3910Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003911For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003912
Guido van Rossum30a685f1991-06-27 15:51:29 +00003913
Victor Stinner35bee932015-04-02 12:28:07 +02003914/* The sendmsg() and recvmsg[_into]() methods require a working
3915 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3916#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003917struct sock_sendmsg {
3918 struct msghdr *msg;
3919 int flags;
3920 ssize_t result;
3921};
3922
3923static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003924sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3925 struct msghdr *msg,
3926 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3927 Py_ssize_t ndataparts, ndatabufs = 0;
3928 int result = -1;
3929 struct iovec *iovs = NULL;
3930 PyObject *data_fast = NULL;
3931 Py_buffer *databufs = NULL;
3932
3933 /* Fill in an iovec for each message part, and save the Py_buffer
3934 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003935 data_fast = PySequence_Fast(data_arg,
3936 "sendmsg() argument 1 must be an "
3937 "iterable");
3938 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003939 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003940 }
3941
Christian Heimesdffa3942016-09-05 23:54:41 +02003942 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3943 if (ndataparts > INT_MAX) {
3944 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3945 goto finally;
3946 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003947
Christian Heimesdffa3942016-09-05 23:54:41 +02003948 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003949 if (ndataparts > 0) {
3950 iovs = PyMem_New(struct iovec, ndataparts);
3951 if (iovs == NULL) {
3952 PyErr_NoMemory();
3953 goto finally;
3954 }
3955 msg->msg_iov = iovs;
3956
3957 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003958 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003959 PyErr_NoMemory();
3960 goto finally;
3961 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003962 }
3963 for (; ndatabufs < ndataparts; ndatabufs++) {
3964 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3965 "y*;sendmsg() argument 1 must be an iterable of "
3966 "bytes-like objects",
3967 &databufs[ndatabufs]))
3968 goto finally;
3969 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3970 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3971 }
3972 result = 0;
3973 finally:
3974 *databufsout = databufs;
3975 *ndatabufsout = ndatabufs;
3976 Py_XDECREF(data_fast);
3977 return result;
3978}
3979
3980static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003981sock_sendmsg_impl(PySocketSockObject *s, void *data)
3982{
3983 struct sock_sendmsg *ctx = data;
3984
3985 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3986 return (ctx->result >= 0);
3987}
3988
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003989/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3990
3991static PyObject *
3992sock_sendmsg(PySocketSockObject *s, PyObject *args)
3993{
Christian Heimesdffa3942016-09-05 23:54:41 +02003994 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003995 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003996 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003997 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003998 struct cmsginfo {
3999 int level;
4000 int type;
4001 Py_buffer data;
4002 } *cmsgs = NULL;
4003 void *controlbuf = NULL;
4004 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004005 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004006 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004007 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004008 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009
4010 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004011 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004012 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004013 }
4014
4015 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004016
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004017 /* Parse destination address. */
4018 if (addr_arg != NULL && addr_arg != Py_None) {
4019 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4020 goto finally;
4021 msg.msg_name = &addrbuf;
4022 msg.msg_namelen = addrlen;
4023 }
4024
4025 /* Fill in an iovec for each message part, and save the Py_buffer
4026 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004027 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004028 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004029 }
4030
4031 if (cmsg_arg == NULL)
4032 ncmsgs = 0;
4033 else {
4034 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4035 "sendmsg() argument 2 must be an "
4036 "iterable")) == NULL)
4037 goto finally;
4038 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4039 }
4040
4041#ifndef CMSG_SPACE
4042 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004043 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004044 "sending multiple control messages is not supported "
4045 "on this system");
4046 goto finally;
4047 }
4048#endif
4049 /* Save level, type and Py_buffer for each control message,
4050 and calculate total size. */
4051 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4052 PyErr_NoMemory();
4053 goto finally;
4054 }
4055 controllen = controllen_last = 0;
4056 while (ncmsgbufs < ncmsgs) {
4057 size_t bufsize, space;
4058
4059 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4060 "(iiy*):[sendmsg() ancillary data items]",
4061 &cmsgs[ncmsgbufs].level,
4062 &cmsgs[ncmsgbufs].type,
4063 &cmsgs[ncmsgbufs].data))
4064 goto finally;
4065 bufsize = cmsgs[ncmsgbufs++].data.len;
4066
4067#ifdef CMSG_SPACE
4068 if (!get_CMSG_SPACE(bufsize, &space)) {
4069#else
4070 if (!get_CMSG_LEN(bufsize, &space)) {
4071#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004072 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073 goto finally;
4074 }
4075 controllen += space;
4076 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004077 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078 goto finally;
4079 }
4080 controllen_last = controllen;
4081 }
4082
4083 /* Construct ancillary data block from control message info. */
4084 if (ncmsgbufs > 0) {
4085 struct cmsghdr *cmsgh = NULL;
4086
Victor Stinner52d61e42016-09-12 11:41:58 +02004087 controlbuf = PyMem_Malloc(controllen);
4088 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 PyErr_NoMemory();
4090 goto finally;
4091 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004092 msg.msg_control = controlbuf;
4093
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004094 msg.msg_controllen = controllen;
4095
4096 /* Need to zero out the buffer as a workaround for glibc's
4097 CMSG_NXTHDR() implementation. After getting the pointer to
4098 the next header, it checks its (uninitialized) cmsg_len
4099 member to see if the "message" fits in the buffer, and
4100 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004101 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102 memset(controlbuf, 0, controllen);
4103
4104 for (i = 0; i < ncmsgbufs; i++) {
4105 size_t msg_len, data_len = cmsgs[i].data.len;
4106 int enough_space = 0;
4107
4108 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4109 if (cmsgh == NULL) {
4110 PyErr_Format(PyExc_RuntimeError,
4111 "unexpected NULL result from %s()",
4112 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4113 goto finally;
4114 }
4115 if (!get_CMSG_LEN(data_len, &msg_len)) {
4116 PyErr_SetString(PyExc_RuntimeError,
4117 "item size out of range for CMSG_LEN()");
4118 goto finally;
4119 }
4120 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4121 size_t space;
4122
4123 cmsgh->cmsg_len = msg_len;
4124 if (get_cmsg_data_space(&msg, cmsgh, &space))
4125 enough_space = (space >= data_len);
4126 }
4127 if (!enough_space) {
4128 PyErr_SetString(PyExc_RuntimeError,
4129 "ancillary data does not fit in calculated "
4130 "space");
4131 goto finally;
4132 }
4133 cmsgh->cmsg_level = cmsgs[i].level;
4134 cmsgh->cmsg_type = cmsgs[i].type;
4135 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4136 }
4137 }
4138
4139 /* Make the system call. */
4140 if (!IS_SELECTABLE(s)) {
4141 select_error();
4142 goto finally;
4143 }
4144
Victor Stinner31bf2d52015-04-01 21:57:09 +02004145 ctx.msg = &msg;
4146 ctx.flags = flags;
4147 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004148 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004149
4150 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004151
4152finally:
4153 PyMem_Free(controlbuf);
4154 for (i = 0; i < ncmsgbufs; i++)
4155 PyBuffer_Release(&cmsgs[i].data);
4156 PyMem_Free(cmsgs);
4157 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004158 PyMem_Free(msg.msg_iov);
4159 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004160 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004161 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004162 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004163 return retval;
4164}
4165
4166PyDoc_STRVAR(sendmsg_doc,
4167"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4168\n\
4169Send normal and ancillary data to the socket, gathering the\n\
4170non-ancillary data from a series of buffers and concatenating it into\n\
4171a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004172data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004173The ancdata argument specifies the ancillary data (control messages)\n\
4174as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4175cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4176protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004177is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004178argument defaults to 0 and has the same meaning as for send(). If\n\
4179address is supplied and not None, it sets a destination address for\n\
4180the message. The return value is the number of bytes of non-ancillary\n\
4181data sent.");
4182#endif /* CMSG_LEN */
4183
Christian Heimesdffa3942016-09-05 23:54:41 +02004184#ifdef HAVE_SOCKADDR_ALG
4185static PyObject*
4186sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4187{
4188 PyObject *retval = NULL;
4189
4190 Py_ssize_t i, ndatabufs = 0;
4191 Py_buffer *databufs = NULL;
4192 PyObject *data_arg = NULL;
4193
4194 Py_buffer iv = {NULL, NULL};
4195
4196 PyObject *opobj = NULL;
4197 int op = -1;
4198
4199 PyObject *assoclenobj = NULL;
4200 int assoclen = -1;
4201
4202 unsigned int *uiptr;
4203 int flags = 0;
4204
4205 struct msghdr msg;
4206 struct cmsghdr *header = NULL;
4207 struct af_alg_iv *alg_iv = NULL;
4208 struct sock_sendmsg ctx;
4209 Py_ssize_t controllen;
4210 void *controlbuf = NULL;
4211 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4212
4213 if (self->sock_family != AF_ALG) {
4214 PyErr_SetString(PyExc_OSError,
4215 "algset is only supported for AF_ALG");
4216 return NULL;
4217 }
4218
4219 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4220 "|O$O!y*O!i:sendmsg_afalg", keywords,
4221 &data_arg,
4222 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004223 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004224 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004225 }
4226
4227 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004228
4229 /* op is a required, keyword-only argument >= 0 */
4230 if (opobj != NULL) {
4231 op = _PyLong_AsInt(opobj);
4232 }
4233 if (op < 0) {
4234 /* override exception from _PyLong_AsInt() */
4235 PyErr_SetString(PyExc_TypeError,
4236 "Invalid or missing argument 'op'");
4237 goto finally;
4238 }
4239 /* assoclen is optional but must be >= 0 */
4240 if (assoclenobj != NULL) {
4241 assoclen = _PyLong_AsInt(assoclenobj);
4242 if (assoclen == -1 && PyErr_Occurred()) {
4243 goto finally;
4244 }
4245 if (assoclen < 0) {
4246 PyErr_SetString(PyExc_TypeError,
4247 "assoclen must be positive");
4248 goto finally;
4249 }
4250 }
4251
4252 controllen = CMSG_SPACE(4);
4253 if (iv.buf != NULL) {
4254 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4255 }
4256 if (assoclen >= 0) {
4257 controllen += CMSG_SPACE(4);
4258 }
4259
4260 controlbuf = PyMem_Malloc(controllen);
4261 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004262 PyErr_NoMemory();
4263 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004264 }
4265 memset(controlbuf, 0, controllen);
4266
Christian Heimesdffa3942016-09-05 23:54:41 +02004267 msg.msg_controllen = controllen;
4268 msg.msg_control = controlbuf;
4269
4270 /* Fill in an iovec for each message part, and save the Py_buffer
4271 structs to release afterwards. */
4272 if (data_arg != NULL) {
4273 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4274 goto finally;
4275 }
4276 }
4277
4278 /* set operation to encrypt or decrypt */
4279 header = CMSG_FIRSTHDR(&msg);
4280 if (header == NULL) {
4281 PyErr_SetString(PyExc_RuntimeError,
4282 "unexpected NULL result from CMSG_FIRSTHDR");
4283 goto finally;
4284 }
4285 header->cmsg_level = SOL_ALG;
4286 header->cmsg_type = ALG_SET_OP;
4287 header->cmsg_len = CMSG_LEN(4);
4288 uiptr = (void*)CMSG_DATA(header);
4289 *uiptr = (unsigned int)op;
4290
4291 /* set initialization vector */
4292 if (iv.buf != NULL) {
4293 header = CMSG_NXTHDR(&msg, header);
4294 if (header == NULL) {
4295 PyErr_SetString(PyExc_RuntimeError,
4296 "unexpected NULL result from CMSG_NXTHDR(iv)");
4297 goto finally;
4298 }
4299 header->cmsg_level = SOL_ALG;
4300 header->cmsg_type = ALG_SET_IV;
4301 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4302 alg_iv = (void*)CMSG_DATA(header);
4303 alg_iv->ivlen = iv.len;
4304 memcpy(alg_iv->iv, iv.buf, iv.len);
4305 }
4306
4307 /* set length of associated data for AEAD */
4308 if (assoclen >= 0) {
4309 header = CMSG_NXTHDR(&msg, header);
4310 if (header == NULL) {
4311 PyErr_SetString(PyExc_RuntimeError,
4312 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4313 goto finally;
4314 }
4315 header->cmsg_level = SOL_ALG;
4316 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4317 header->cmsg_len = CMSG_LEN(4);
4318 uiptr = (void*)CMSG_DATA(header);
4319 *uiptr = (unsigned int)assoclen;
4320 }
4321
4322 ctx.msg = &msg;
4323 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004324 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004325 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004326 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004327
4328 retval = PyLong_FromSsize_t(ctx.result);
4329
4330 finally:
4331 PyMem_Free(controlbuf);
4332 if (iv.buf != NULL) {
4333 PyBuffer_Release(&iv);
4334 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004335 PyMem_Free(msg.msg_iov);
4336 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004337 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004338 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004339 PyMem_Free(databufs);
4340 return retval;
4341}
4342
4343PyDoc_STRVAR(sendmsg_afalg_doc,
4344"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4345\n\
4346Set operation mode, IV and length of associated data for an AF_ALG\n\
4347operation socket.");
4348#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004349
Guido van Rossum30a685f1991-06-27 15:51:29 +00004350/* s.shutdown(how) method */
4351
Guido van Rossum73624e91994-10-10 17:59:00 +00004352static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004353sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 int how;
4356 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004357
Serhiy Storchaka78980432013-01-15 01:12:17 +02004358 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 if (how == -1 && PyErr_Occurred())
4360 return NULL;
4361 Py_BEGIN_ALLOW_THREADS
4362 res = shutdown(s->sock_fd, how);
4363 Py_END_ALLOW_THREADS
4364 if (res < 0)
4365 return s->errorhandler();
4366 Py_INCREF(Py_None);
4367 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004368}
4369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004370PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004371"shutdown(flag)\n\
4372\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004373Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4374of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004375
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004376#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004377static PyObject*
4378sock_ioctl(PySocketSockObject *s, PyObject *arg)
4379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 unsigned long cmd = SIO_RCVALL;
4381 PyObject *argO;
4382 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4385 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 switch (cmd) {
4388 case SIO_RCVALL: {
4389 unsigned int option = RCVALL_ON;
4390 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4391 return NULL;
4392 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4393 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4394 return set_error();
4395 }
4396 return PyLong_FromUnsignedLong(recv); }
4397 case SIO_KEEPALIVE_VALS: {
4398 struct tcp_keepalive ka;
4399 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4400 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4401 return NULL;
4402 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4403 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4404 return set_error();
4405 }
4406 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004407#if defined(SIO_LOOPBACK_FAST_PATH)
4408 case SIO_LOOPBACK_FAST_PATH: {
4409 unsigned int option;
4410 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4411 return NULL;
4412 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4413 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4414 return set_error();
4415 }
4416 return PyLong_FromUnsignedLong(recv); }
4417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 default:
4419 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4420 return NULL;
4421 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004422}
4423PyDoc_STRVAR(sock_ioctl_doc,
4424"ioctl(cmd, option) -> long\n\
4425\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004426Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4427SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004428SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4429SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004430#endif
4431
4432#if defined(MS_WINDOWS)
4433static PyObject*
4434sock_share(PySocketSockObject *s, PyObject *arg)
4435{
4436 WSAPROTOCOL_INFO info;
4437 DWORD processId;
4438 int result;
4439
4440 if (!PyArg_ParseTuple(arg, "I", &processId))
4441 return NULL;
4442
4443 Py_BEGIN_ALLOW_THREADS
4444 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4445 Py_END_ALLOW_THREADS
4446 if (result == SOCKET_ERROR)
4447 return set_error();
4448 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4449}
4450PyDoc_STRVAR(sock_share_doc,
4451"share(process_id) -> bytes\n\
4452\n\
4453Share the socket with another process. The target process id\n\
4454must be provided and the resulting bytes object passed to the target\n\
4455process. There the shared socket can be instantiated by calling\n\
4456socket.fromshare().");
4457
Christian Heimesfaf2f632008-01-06 16:59:19 +00004458
4459#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004460
4461/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004462
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004463static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4465 accept_doc},
4466 {"bind", (PyCFunction)sock_bind, METH_O,
4467 bind_doc},
4468 {"close", (PyCFunction)sock_close, METH_NOARGS,
4469 close_doc},
4470 {"connect", (PyCFunction)sock_connect, METH_O,
4471 connect_doc},
4472 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4473 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004474 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4475 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4477 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004478#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 {"getpeername", (PyCFunction)sock_getpeername,
4480 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 {"getsockname", (PyCFunction)sock_getsockname,
4483 METH_NOARGS, getsockname_doc},
4484 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4485 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004486#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4488 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004489#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004490#if defined(MS_WINDOWS)
4491 {"share", (PyCFunction)sock_share, METH_VARARGS,
4492 sock_share_doc},
4493#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004494 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 listen_doc},
4496 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4497 recv_doc},
4498 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4499 recv_into_doc},
4500 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4501 recvfrom_doc},
4502 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4503 recvfrom_into_doc},
4504 {"send", (PyCFunction)sock_send, METH_VARARGS,
4505 send_doc},
4506 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4507 sendall_doc},
4508 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4509 sendto_doc},
4510 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4511 setblocking_doc},
4512 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4513 settimeout_doc},
4514 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4515 gettimeout_doc},
4516 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4517 setsockopt_doc},
4518 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4519 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004520#ifdef CMSG_LEN
4521 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4522 recvmsg_doc},
4523 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4524 recvmsg_into_doc,},
4525 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4526 sendmsg_doc},
4527#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004528#ifdef HAVE_SOCKADDR_ALG
4529 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4530 sendmsg_afalg_doc},
4531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004533};
4534
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004535/* SockObject members */
4536static PyMemberDef sock_memberlist[] = {
4537 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4538 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4539 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004540 {0},
4541};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004542
Victor Stinner71694d52015-03-28 01:18:54 +01004543static PyGetSetDef sock_getsetlist[] = {
4544 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4545 {NULL} /* sentinel */
4546};
4547
Guido van Rossum73624e91994-10-10 17:59:00 +00004548/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004549 First close the file description. */
4550
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004551static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004552sock_finalize(PySocketSockObject *s)
4553{
4554 SOCKET_T fd;
4555 PyObject *error_type, *error_value, *error_traceback;
4556
4557 /* Save the current exception, if any. */
4558 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4559
Victor Stinnerd3afb622016-07-22 17:47:09 +02004560 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004561 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4562 /* Spurious errors can appear at shutdown */
4563 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4564 PyErr_WriteUnraisable((PyObject *)s);
4565 }
4566 }
4567
4568 /* Only close the socket *after* logging the ResourceWarning warning
4569 to allow the logger to call socket methods like
4570 socket.getsockname(). If the socket is closed before, socket
4571 methods fails with the EBADF error. */
4572 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004573 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004574
4575 /* We do not want to retry upon EINTR: see sock_close() */
4576 Py_BEGIN_ALLOW_THREADS
4577 (void) SOCKETCLOSE(fd);
4578 Py_END_ALLOW_THREADS
4579 }
4580
4581 /* Restore the saved exception. */
4582 PyErr_Restore(error_type, error_value, error_traceback);
4583}
4584
4585static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004587{
Victor Stinner19a8e842016-03-21 16:36:48 +01004588 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4589 return;
4590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004592}
4593
Guido van Rossum30a685f1991-06-27 15:51:29 +00004594
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004596sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004597{
Victor Stinnere254e532014-07-26 14:36:55 +02004598 long sock_fd;
4599 /* On Windows, this test is needed because SOCKET_T is unsigned */
4600 if (s->sock_fd == INVALID_SOCKET) {
4601 sock_fd = -1;
4602 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004603#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004604 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 /* this can occur on Win64, and actually there is a special
4606 ugly printf formatter for decimal pointer length integer
4607 printing, only bother if necessary*/
4608 PyErr_SetString(PyExc_OverflowError,
4609 "no printf formatter to display "
4610 "the socket descriptor in decimal");
4611 return NULL;
4612 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004613#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004614 else
4615 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 return PyUnicode_FromFormat(
4617 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004618 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 s->sock_type,
4620 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004621}
4622
4623
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004624/* Create a new, uninitialized socket object. */
4625
4626static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004627sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 new = type->tp_alloc(type, 0);
4632 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004633 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004634 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 ((PySocketSockObject *)new)->errorhandler = &set_error;
4636 }
4637 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004638}
4639
4640
4641/* Initialize a new socket object. */
4642
Victor Stinnerdaf45552013-08-28 00:53:59 +02004643#ifdef SOCK_CLOEXEC
4644/* socket() and socketpair() fail with EINVAL on Linux kernel older
4645 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4646static int sock_cloexec_works = -1;
4647#endif
4648
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004649/*ARGSUSED*/
4650static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004651sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 PySocketSockObject *s = (PySocketSockObject *)self;
4654 PyObject *fdobj = NULL;
4655 SOCKET_T fd = INVALID_SOCKET;
4656 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4657 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004658#ifndef MS_WINDOWS
4659#ifdef SOCK_CLOEXEC
4660 int *atomic_flag_works = &sock_cloexec_works;
4661#else
4662 int *atomic_flag_works = NULL;
4663#endif
4664#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4667 "|iiiO:socket", keywords,
4668 &family, &type, &proto, &fdobj))
4669 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004672#ifdef MS_WINDOWS
4673 /* recreate a socket that was duplicated */
4674 if (PyBytes_Check(fdobj)) {
4675 WSAPROTOCOL_INFO info;
4676 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4677 PyErr_Format(PyExc_ValueError,
4678 "socket descriptor string has wrong size, "
4679 "should be %zu bytes.", sizeof(info));
4680 return -1;
4681 }
4682 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4683 Py_BEGIN_ALLOW_THREADS
4684 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4685 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4686 Py_END_ALLOW_THREADS
4687 if (fd == INVALID_SOCKET) {
4688 set_error();
4689 return -1;
4690 }
4691 family = info.iAddressFamily;
4692 type = info.iSocketType;
4693 proto = info.iProtocol;
4694 }
4695 else
4696#endif
4697 {
4698 fd = PyLong_AsSocket_t(fdobj);
4699 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4700 return -1;
4701 if (fd == INVALID_SOCKET) {
4702 PyErr_SetString(PyExc_ValueError,
4703 "can't use invalid socket value");
4704 return -1;
4705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 }
4707 }
4708 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004709#ifdef MS_WINDOWS
4710 /* Windows implementation */
4711#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4712#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4713#endif
4714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004716 if (support_wsa_no_inherit) {
4717 fd = WSASocket(family, type, proto,
4718 NULL, 0,
4719 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4720 if (fd == INVALID_SOCKET) {
4721 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4722 support_wsa_no_inherit = 0;
4723 fd = socket(family, type, proto);
4724 }
4725 }
4726 else {
4727 fd = socket(family, type, proto);
4728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 if (fd == INVALID_SOCKET) {
4732 set_error();
4733 return -1;
4734 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004735
4736 if (!support_wsa_no_inherit) {
4737 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4738 closesocket(fd);
4739 PyErr_SetFromWindowsErr(0);
4740 return -1;
4741 }
4742 }
4743#else
4744 /* UNIX */
4745 Py_BEGIN_ALLOW_THREADS
4746#ifdef SOCK_CLOEXEC
4747 if (sock_cloexec_works != 0) {
4748 fd = socket(family, type | SOCK_CLOEXEC, proto);
4749 if (sock_cloexec_works == -1) {
4750 if (fd >= 0) {
4751 sock_cloexec_works = 1;
4752 }
4753 else if (errno == EINVAL) {
4754 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4755 sock_cloexec_works = 0;
4756 fd = socket(family, type, proto);
4757 }
4758 }
4759 }
4760 else
4761#endif
4762 {
4763 fd = socket(family, type, proto);
4764 }
4765 Py_END_ALLOW_THREADS
4766
4767 if (fd == INVALID_SOCKET) {
4768 set_error();
4769 return -1;
4770 }
4771
4772 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4773 SOCKETCLOSE(fd);
4774 return -1;
4775 }
4776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004778 if (init_sockobject(s, fd, family, type, proto) == -1) {
4779 SOCKETCLOSE(fd);
4780 return -1;
4781 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004784
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004785}
4786
4787
Guido van Rossumb6775db1994-08-01 11:34:53 +00004788/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004789
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004790static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4792 "_socket.socket", /* tp_name */
4793 sizeof(PySocketSockObject), /* tp_basicsize */
4794 0, /* tp_itemsize */
4795 (destructor)sock_dealloc, /* tp_dealloc */
4796 0, /* tp_print */
4797 0, /* tp_getattr */
4798 0, /* tp_setattr */
4799 0, /* tp_reserved */
4800 (reprfunc)sock_repr, /* tp_repr */
4801 0, /* tp_as_number */
4802 0, /* tp_as_sequence */
4803 0, /* tp_as_mapping */
4804 0, /* tp_hash */
4805 0, /* tp_call */
4806 0, /* tp_str */
4807 PyObject_GenericGetAttr, /* tp_getattro */
4808 0, /* tp_setattro */
4809 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004810 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4811 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 sock_doc, /* tp_doc */
4813 0, /* tp_traverse */
4814 0, /* tp_clear */
4815 0, /* tp_richcompare */
4816 0, /* tp_weaklistoffset */
4817 0, /* tp_iter */
4818 0, /* tp_iternext */
4819 sock_methods, /* tp_methods */
4820 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004821 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 0, /* tp_base */
4823 0, /* tp_dict */
4824 0, /* tp_descr_get */
4825 0, /* tp_descr_set */
4826 0, /* tp_dictoffset */
4827 sock_initobj, /* tp_init */
4828 PyType_GenericAlloc, /* tp_alloc */
4829 sock_new, /* tp_new */
4830 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004831 0, /* tp_is_gc */
4832 0, /* tp_bases */
4833 0, /* tp_mro */
4834 0, /* tp_cache */
4835 0, /* tp_subclasses */
4836 0, /* tp_weaklist */
4837 0, /* tp_del */
4838 0, /* tp_version_tag */
4839 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004840};
4841
Guido van Rossum30a685f1991-06-27 15:51:29 +00004842
Guido van Rossum81194471991-07-27 21:42:02 +00004843/* Python interface to gethostname(). */
4844
4845/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004846static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004847socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004848{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004849#ifdef MS_WINDOWS
4850 /* Don't use winsock's gethostname, as this returns the ANSI
4851 version of the hostname, whereas we need a Unicode string.
4852 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004853 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004854 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004855 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004856 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004857
4858 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004859 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004860
4861 if (GetLastError() != ERROR_MORE_DATA)
4862 return PyErr_SetFromWindowsErr(0);
4863
4864 if (size == 0)
4865 return PyUnicode_New(0, 0);
4866
4867 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4868 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004869 name = PyMem_New(wchar_t, size);
4870 if (!name) {
4871 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004872 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004873 }
Victor Stinner74168972011-11-17 01:11:36 +01004874 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4875 name,
4876 &size))
4877 {
4878 PyMem_Free(name);
4879 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004880 }
Victor Stinner74168972011-11-17 01:11:36 +01004881
4882 result = PyUnicode_FromWideChar(name, size);
4883 PyMem_Free(name);
4884 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004885#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 char buf[1024];
4887 int res;
4888 Py_BEGIN_ALLOW_THREADS
4889 res = gethostname(buf, (int) sizeof buf - 1);
4890 Py_END_ALLOW_THREADS
4891 if (res < 0)
4892 return set_error();
4893 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004894 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004895#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004896}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004898PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004899"gethostname() -> string\n\
4900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004901Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004902
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004903#ifdef HAVE_SETHOSTNAME
4904PyDoc_STRVAR(sethostname_doc,
4905"sethostname(name)\n\n\
4906Sets the hostname to name.");
4907
4908static PyObject *
4909socket_sethostname(PyObject *self, PyObject *args)
4910{
4911 PyObject *hnobj;
4912 Py_buffer buf;
4913 int res, flag = 0;
4914
Christian Heimesd2774c72013-06-19 02:06:29 +02004915#ifdef _AIX
4916/* issue #18259, not declared in any useful header file */
4917extern int sethostname(const char *, size_t);
4918#endif
4919
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004920 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4921 PyErr_Clear();
4922 if (!PyArg_ParseTuple(args, "O&:sethostname",
4923 PyUnicode_FSConverter, &hnobj))
4924 return NULL;
4925 flag = 1;
4926 }
4927 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4928 if (!res) {
4929 res = sethostname(buf.buf, buf.len);
4930 PyBuffer_Release(&buf);
4931 }
4932 if (flag)
4933 Py_DECREF(hnobj);
4934 if (res)
4935 return set_error();
4936 Py_RETURN_NONE;
4937}
4938#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004939
Guido van Rossum30a685f1991-06-27 15:51:29 +00004940/* Python interface to gethostbyname(name). */
4941
4942/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 char *name;
4947 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004948 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004949
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004950 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 return NULL;
4952 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004953 goto finally;
4954 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4955finally:
4956 PyMem_Free(name);
4957 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004958}
4959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004960PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004961"gethostbyname(host) -> address\n\
4962\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004963Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004964
4965
Victor Stinner72400302016-01-28 15:41:01 +01004966static PyObject*
4967sock_decode_hostname(const char *name)
4968{
4969#ifdef MS_WINDOWS
4970 /* Issue #26227: gethostbyaddr() returns a string encoded
4971 * to the ANSI code page */
4972 return PyUnicode_DecodeFSDefault(name);
4973#else
4974 /* Decode from UTF-8 */
4975 return PyUnicode_FromString(name);
4976#endif
4977}
4978
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004979/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4980
4981static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004982gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 char **pch;
4985 PyObject *rtn_tuple = (PyObject *)NULL;
4986 PyObject *name_list = (PyObject *)NULL;
4987 PyObject *addr_list = (PyObject *)NULL;
4988 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004989 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 if (h == NULL) {
4992 /* Let's get real error message to return */
4993 set_herror(h_errno);
4994 return NULL;
4995 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 if (h->h_addrtype != af) {
4998 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004999 errno = EAFNOSUPPORT;
5000 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 return NULL;
5002 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 case AF_INET:
5007 if (alen < sizeof(struct sockaddr_in))
5008 return NULL;
5009 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005010
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005011#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 case AF_INET6:
5013 if (alen < sizeof(struct sockaddr_in6))
5014 return NULL;
5015 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005016#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 if ((name_list = PyList_New(0)) == NULL)
5021 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 if ((addr_list = PyList_New(0)) == NULL)
5024 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 /* SF #1511317: h_aliases can be NULL */
5027 if (h->h_aliases) {
5028 for (pch = h->h_aliases; *pch != NULL; pch++) {
5029 int status;
5030 tmp = PyUnicode_FromString(*pch);
5031 if (tmp == NULL)
5032 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 status = PyList_Append(name_list, tmp);
5035 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 if (status)
5038 goto err;
5039 }
5040 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5043 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 case AF_INET:
5048 {
5049 struct sockaddr_in sin;
5050 memset(&sin, 0, sizeof(sin));
5051 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005052#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5056 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if (pch == h->h_addr_list && alen >= sizeof(sin))
5059 memcpy((char *) addr, &sin, sizeof(sin));
5060 break;
5061 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005062
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005063#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 case AF_INET6:
5065 {
5066 struct sockaddr_in6 sin6;
5067 memset(&sin6, 0, sizeof(sin6));
5068 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005069#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5073 tmp = makeipaddr((struct sockaddr *)&sin6,
5074 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5077 memcpy((char *) addr, &sin6, sizeof(sin6));
5078 break;
5079 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005080#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005083 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 "unsupported address family");
5085 return NULL;
5086 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 if (tmp == NULL)
5089 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 status = PyList_Append(addr_list, tmp);
5092 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 if (status)
5095 goto err;
5096 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005097
Victor Stinner72400302016-01-28 15:41:01 +01005098 name = sock_decode_hostname(h->h_name);
5099 if (name == NULL)
5100 goto err;
5101 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005102
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005103 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 Py_XDECREF(name_list);
5105 Py_XDECREF(addr_list);
5106 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005107}
5108
5109
5110/* Python interface to gethostbyname_ex(name). */
5111
5112/*ARGSUSED*/
5113static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005114socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 char *name;
5117 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005118 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005120 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005121#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005123#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005125#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 char buf[16384];
5127 int buf_len = (sizeof buf) - 1;
5128 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005129#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005130#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005132#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005133#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005134
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005135 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005137 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005138 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005140#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005141#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005142 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005144#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005146#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 memset((void *) &data, '\0', sizeof(data));
5148 result = gethostbyname_r(name, &hp_allocated, &data);
5149 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005150#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005151#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005152#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005156#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 Py_END_ALLOW_THREADS
5158 /* Some C libraries would require addr.__ss_family instead of
5159 addr.ss_family.
5160 Therefore, we cast the sockaddr_storage into sockaddr to
5161 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005162 sa = SAS2SA(&addr);
5163 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005165#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005167#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005168finally:
5169 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005171}
5172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005173PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005174"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5175\n\
5176Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005177for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005178
5179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005180/* Python interface to gethostbyaddr(IP). */
5181
5182/*ARGSUSED*/
5183static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005184socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005185{
Charles-François Natali8b759652011-12-23 16:44:51 +01005186 sock_addr_t addr;
5187 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 char *ip_num;
5189 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005190 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005191#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005193#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005195#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 /* glibcs up to 2.10 assume that the buf argument to
5197 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5198 does not ensure. The attribute below instructs the compiler
5199 to maintain this alignment. */
5200 char buf[16384] Py_ALIGNED(8);
5201 int buf_len = (sizeof buf) - 1;
5202 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005203#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005204#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005206#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005207#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 char *ap;
5209 int al;
5210 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005211
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005212 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 return NULL;
5214 af = AF_UNSPEC;
5215 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005216 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 af = sa->sa_family;
5218 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005219 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 switch (af) {
5221 case AF_INET:
5222 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5223 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5224 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005225#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 case AF_INET6:
5227 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5228 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5229 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005232 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005233 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 }
5235 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005236#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005237#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005238 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 &hp_allocated, buf, buf_len,
5240 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005241#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 h = gethostbyaddr_r(ap, al, af,
5243 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005244#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 memset((void *) &data, '\0', sizeof(data));
5246 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5247 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005248#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005249#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005250#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005254#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005256 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005257#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005259#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005260finally:
5261 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005263}
5264
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005265PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005266"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5267\n\
5268Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005269for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005270
Guido van Rossum30a685f1991-06-27 15:51:29 +00005271
5272/* Python interface to getservbyname(name).
5273 This only returns the port number, since the other info is already
5274 known or not useful (like the list of aliases). */
5275
5276/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005277static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005278socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 char *name, *proto=NULL;
5281 struct servent *sp;
5282 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5283 return NULL;
5284 Py_BEGIN_ALLOW_THREADS
5285 sp = getservbyname(name, proto);
5286 Py_END_ALLOW_THREADS
5287 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005288 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 return NULL;
5290 }
5291 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005292}
5293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005294PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005295"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005296\n\
5297Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005298The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5299otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005300
Guido van Rossum30a685f1991-06-27 15:51:29 +00005301
Barry Warsaw11b91a02004-06-28 00:50:43 +00005302/* Python interface to getservbyport(port).
5303 This only returns the service name, since the other info is already
5304 known or not useful (like the list of aliases). */
5305
5306/*ARGSUSED*/
5307static PyObject *
5308socket_getservbyport(PyObject *self, PyObject *args)
5309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 int port;
5311 char *proto=NULL;
5312 struct servent *sp;
5313 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5314 return NULL;
5315 if (port < 0 || port > 0xffff) {
5316 PyErr_SetString(
5317 PyExc_OverflowError,
5318 "getservbyport: port must be 0-65535.");
5319 return NULL;
5320 }
5321 Py_BEGIN_ALLOW_THREADS
5322 sp = getservbyport(htons((short)port), proto);
5323 Py_END_ALLOW_THREADS
5324 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005325 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 return NULL;
5327 }
5328 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005329}
5330
5331PyDoc_STRVAR(getservbyport_doc,
5332"getservbyport(port[, protocolname]) -> string\n\
5333\n\
5334Return the service name from a port number and protocol name.\n\
5335The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5336otherwise any protocol will match.");
5337
Guido van Rossum3901d851996-12-19 16:35:04 +00005338/* Python interface to getprotobyname(name).
5339 This only returns the protocol number, since the other info is
5340 already known or not useful (like the list of aliases). */
5341
5342/*ARGSUSED*/
5343static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005344socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 char *name;
5347 struct protoent *sp;
5348 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5349 return NULL;
5350 Py_BEGIN_ALLOW_THREADS
5351 sp = getprotobyname(name);
5352 Py_END_ALLOW_THREADS
5353 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005354 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 return NULL;
5356 }
5357 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005358}
5359
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005360PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005361"getprotobyname(name) -> integer\n\
5362\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005363Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005364
Guido van Rossum3901d851996-12-19 16:35:04 +00005365
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005366#ifndef NO_DUP
5367/* dup() function for socket fds */
5368
5369static PyObject *
5370socket_dup(PyObject *self, PyObject *fdobj)
5371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 SOCKET_T fd, newfd;
5373 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005374#ifdef MS_WINDOWS
5375 WSAPROTOCOL_INFO info;
5376#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 fd = PyLong_AsSocket_t(fdobj);
5379 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5380 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005381
Victor Stinnerdaf45552013-08-28 00:53:59 +02005382#ifdef MS_WINDOWS
5383 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5384 return set_error();
5385
5386 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5387 FROM_PROTOCOL_INFO,
5388 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 if (newfd == INVALID_SOCKET)
5390 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005391
Victor Stinnerdaf45552013-08-28 00:53:59 +02005392 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5393 closesocket(newfd);
5394 PyErr_SetFromWindowsErr(0);
5395 return NULL;
5396 }
5397#else
5398 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5399 newfd = _Py_dup(fd);
5400 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005401 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005402#endif
5403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 newfdobj = PyLong_FromSocket_t(newfd);
5405 if (newfdobj == NULL)
5406 SOCKETCLOSE(newfd);
5407 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005408}
5409
5410PyDoc_STRVAR(dup_doc,
5411"dup(integer) -> integer\n\
5412\n\
5413Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5414sockets; on some platforms os.dup() won't work for socket file descriptors.");
5415#endif
5416
5417
Dave Cole331708b2004-08-09 04:51:41 +00005418#ifdef HAVE_SOCKETPAIR
5419/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005420 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005421 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005422
5423/*ARGSUSED*/
5424static PyObject *
5425socket_socketpair(PyObject *self, PyObject *args)
5426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 PySocketSockObject *s0 = NULL, *s1 = NULL;
5428 SOCKET_T sv[2];
5429 int family, type = SOCK_STREAM, proto = 0;
5430 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005431#ifdef SOCK_CLOEXEC
5432 int *atomic_flag_works = &sock_cloexec_works;
5433#else
5434 int *atomic_flag_works = NULL;
5435#endif
5436 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005437
5438#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005440#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5444 &family, &type, &proto))
5445 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005448 Py_BEGIN_ALLOW_THREADS
5449#ifdef SOCK_CLOEXEC
5450 if (sock_cloexec_works != 0) {
5451 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5452 if (sock_cloexec_works == -1) {
5453 if (ret >= 0) {
5454 sock_cloexec_works = 1;
5455 }
5456 else if (errno == EINVAL) {
5457 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5458 sock_cloexec_works = 0;
5459 ret = socketpair(family, type, proto, sv);
5460 }
5461 }
5462 }
5463 else
5464#endif
5465 {
5466 ret = socketpair(family, type, proto, sv);
5467 }
5468 Py_END_ALLOW_THREADS
5469
5470 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005472
5473 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5474 goto finally;
5475 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5476 goto finally;
5477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 s0 = new_sockobject(sv[0], family, type, proto);
5479 if (s0 == NULL)
5480 goto finally;
5481 s1 = new_sockobject(sv[1], family, type, proto);
5482 if (s1 == NULL)
5483 goto finally;
5484 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005485
5486finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 if (res == NULL) {
5488 if (s0 == NULL)
5489 SOCKETCLOSE(sv[0]);
5490 if (s1 == NULL)
5491 SOCKETCLOSE(sv[1]);
5492 }
5493 Py_XDECREF(s0);
5494 Py_XDECREF(s1);
5495 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005496}
5497
5498PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005499"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005500\n\
5501Create a pair of socket objects from the sockets returned by the platform\n\
5502socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005503The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005504AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005505
5506#endif /* HAVE_SOCKETPAIR */
5507
5508
Guido van Rossum006bf911996-06-12 04:04:55 +00005509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005510socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005511{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005512 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005513
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005514 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 return NULL;
5516 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005517 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005519 "ntohs: can't convert negative Python int to C "
5520 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 return NULL;
5522 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005523 if (x > 0xffff) {
5524 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5525 "ntohs: Python int too large to convert to C "
5526 "16-bit unsigned integer (The silent truncation "
5527 "is deprecated)",
5528 1)) {
5529 return NULL;
5530 }
5531 }
5532 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005533}
5534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005535PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005536"ntohs(integer) -> integer\n\
5537\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005538Convert a 16-bit unsigned integer from network to host byte order.\n\
5539Note that in case the received integer does not fit in 16-bit unsigned\n\
5540integer, but does fit in a positive C int, it is silently truncated to\n\
554116-bit unsigned integer.\n\
5542However, this silent truncation feature is deprecated, and will raise an \n\
5543exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005544
5545
Guido van Rossum006bf911996-06-12 04:04:55 +00005546static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005547socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 if (PyLong_Check(arg)) {
5552 x = PyLong_AsUnsignedLong(arg);
5553 if (x == (unsigned long) -1 && PyErr_Occurred())
5554 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005555#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 {
5557 unsigned long y;
5558 /* only want the trailing 32 bits */
5559 y = x & 0xFFFFFFFFUL;
5560 if (y ^ x)
5561 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005562 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 x = y;
5564 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 }
5567 else
5568 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005569 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005572}
5573
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005574PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005575"ntohl(integer) -> integer\n\
5576\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005577Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005578
5579
Guido van Rossum006bf911996-06-12 04:04:55 +00005580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005581socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005582{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005583 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005584
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005585 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 return NULL;
5587 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005588 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005590 "htons: can't convert negative Python int to C "
5591 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 return NULL;
5593 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005594 if (x > 0xffff) {
5595 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5596 "htons: Python int too large to convert to C "
5597 "16-bit unsigned integer (The silent truncation "
5598 "is deprecated)",
5599 1)) {
5600 return NULL;
5601 }
5602 }
5603 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005604}
5605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005606PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005607"htons(integer) -> integer\n\
5608\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005609Convert a 16-bit unsigned integer from host to network byte order.\n\
5610Note that in case the received integer does not fit in 16-bit unsigned\n\
5611integer, but does fit in a positive C int, it is silently truncated to\n\
561216-bit unsigned integer.\n\
5613However, this silent truncation feature is deprecated, and will raise an \n\
5614exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005615
5616
Guido van Rossum006bf911996-06-12 04:04:55 +00005617static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005618socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 if (PyLong_Check(arg)) {
5623 x = PyLong_AsUnsignedLong(arg);
5624 if (x == (unsigned long) -1 && PyErr_Occurred())
5625 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005626#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 {
5628 unsigned long y;
5629 /* only want the trailing 32 bits */
5630 y = x & 0xFFFFFFFFUL;
5631 if (y ^ x)
5632 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005633 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 x = y;
5635 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 }
5638 else
5639 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005640 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 Py_TYPE(arg)->tp_name);
5642 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005643}
5644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005645PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005646"htonl(integer) -> integer\n\
5647\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005648Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005649
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005650/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005652PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005653"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005654\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005655Convert 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 +00005656binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005657
5658static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005659socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005660{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005661#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005663#endif
5664
5665#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005666#if (SIZEOF_INT != 4)
5667#error "Not sure if in_addr_t exists and int is not 32-bits."
5668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 /* Have to use inet_addr() instead */
5670 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5675 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005676
Tim Peters1df9fdd2003-02-13 03:13:40 +00005677
5678#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005679
5680#ifdef USE_INET_ATON_WEAKLINK
5681 if (inet_aton != NULL) {
5682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 if (inet_aton(ip_addr, &buf))
5684 return PyBytes_FromStringAndSize((char *)(&buf),
5685 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005686
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005687 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 "illegal IP address string passed to inet_aton");
5689 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005690
Thomas Wouters477c8d52006-05-27 19:21:47 +00005691#ifdef USE_INET_ATON_WEAKLINK
5692 } else {
5693#endif
5694
5695#endif
5696
5697#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 /* special-case this address as inet_addr might return INADDR_NONE
5700 * for this */
5701 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005702 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005708 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 "illegal IP address string passed to inet_aton");
5710 return NULL;
5711 }
5712 }
5713 return PyBytes_FromStringAndSize((char *) &packed_addr,
5714 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005715
5716#ifdef USE_INET_ATON_WEAKLINK
5717 }
5718#endif
5719
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005720#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005721}
5722
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005723PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005724"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005725\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005726Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005727
5728static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005729socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005730{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005731 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005733
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005734 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 return NULL;
5736 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005737
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005738 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005739 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005741 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 return NULL;
5743 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005744
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005745 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5746 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005749}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005750
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005751#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005752
5753PyDoc_STRVAR(inet_pton_doc,
5754"inet_pton(af, ip) -> packed IP address string\n\
5755\n\
5756Convert an IP address from string format to a packed string suitable\n\
5757for use with low-level network functions.");
5758
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005759#endif
5760
5761#ifdef HAVE_INET_PTON
5762
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005763static PyObject *
5764socket_inet_pton(PyObject *self, PyObject *args)
5765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 int af;
5767 char* ip;
5768 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005769#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005770 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005771#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5775 return NULL;
5776 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005777
Martin v. Löwis04697e82004-06-02 12:35:29 +00005778#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005780 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 "can't use AF_INET6, IPv6 is disabled");
5782 return NULL;
5783 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005784#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 retval = inet_pton(af, ip, packed);
5787 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005788 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789 return NULL;
5790 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005791 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 "illegal IP address string passed to inet_pton");
5793 return NULL;
5794 } else if (af == AF_INET) {
5795 return PyBytes_FromStringAndSize(packed,
5796 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005797#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 } else if (af == AF_INET6) {
5799 return PyBytes_FromStringAndSize(packed,
5800 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005803 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 return NULL;
5805 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005806}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005807#elif defined(MS_WINDOWS)
5808
5809static PyObject *
5810socket_inet_pton(PyObject *self, PyObject *args)
5811{
5812 int af;
5813 char* ip;
5814 struct sockaddr_in6 addr;
5815 INT ret, size;
5816
5817 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5818 return NULL;
5819 }
5820
Victor Stinnere990c6e2013-11-16 00:18:58 +01005821 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005822 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5823
5824 if (ret) {
5825 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5826 return NULL;
5827 } else if(af == AF_INET) {
5828 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005829 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005830 sizeof(addr4->sin_addr));
5831 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005832 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005833 sizeof(addr.sin6_addr));
5834 } else {
5835 PyErr_SetString(PyExc_OSError, "unknown address family");
5836 return NULL;
5837 }
5838}
5839
5840#endif
5841
5842#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005843
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005844PyDoc_STRVAR(inet_ntop_doc,
5845"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5846\n\
5847Convert a packed IP address of the given family to string format.");
5848
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005849#endif
5850
5851
5852#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005853static PyObject *
5854socket_inet_ntop(PyObject *self, PyObject *args)
5855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005857 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005859#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005860 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005861#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005863#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5866 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005867
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005868 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 return NULL;
5870 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005873 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 PyErr_SetString(PyExc_ValueError,
5875 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005876 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 return NULL;
5878 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005881 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 PyErr_SetString(PyExc_ValueError,
5883 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005884 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 return NULL;
5886 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 } else {
5889 PyErr_Format(PyExc_ValueError,
5890 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005891 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 return NULL;
5893 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005894
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005895 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5896 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005898 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 return NULL;
5900 } else {
5901 return PyUnicode_FromString(retval);
5902 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005903}
5904
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005905#elif defined(MS_WINDOWS)
5906
5907static PyObject *
5908socket_inet_ntop(PyObject *self, PyObject *args)
5909{
5910 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005911 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005912 struct sockaddr_in6 addr;
5913 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005914#ifdef ENABLE_IPV6
5915 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5916#else
5917 char ip[INET_ADDRSTRLEN + 1];
5918#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005919
5920 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5921 memset((void *) &ip[0], '\0', sizeof(ip));
5922
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005923 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005924 return NULL;
5925 }
5926
5927 if (af == AF_INET) {
5928 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5929
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005930 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005931 PyErr_SetString(PyExc_ValueError,
5932 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005933 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005934 return NULL;
5935 }
5936 memset(addr4, 0, sizeof(struct sockaddr_in));
5937 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005938 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005939 addrlen = sizeof(struct sockaddr_in);
5940 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005941 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005942 PyErr_SetString(PyExc_ValueError,
5943 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005944 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005945 return NULL;
5946 }
5947
5948 memset(&addr, 0, sizeof(addr));
5949 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005950 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005951 addrlen = sizeof(addr);
5952 } else {
5953 PyErr_Format(PyExc_ValueError,
5954 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005955 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005956 return NULL;
5957 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005958 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005959
5960 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005961 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005962 ip, &retlen);
5963
5964 if (ret) {
5965 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5966 return NULL;
5967 } else {
5968 return PyUnicode_FromString(ip);
5969 }
5970}
5971
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005972#endif /* HAVE_INET_PTON */
5973
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005974/* Python interface to getaddrinfo(host, port). */
5975
5976/*ARGSUSED*/
5977static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005978socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005979{
Victor Stinner77af1722011-05-26 14:05:59 +02005980 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005981 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 struct addrinfo hints, *res;
5983 struct addrinfo *res0 = NULL;
5984 PyObject *hobj = NULL;
5985 PyObject *pobj = (PyObject *)NULL;
5986 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005987 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 int family, socktype, protocol, flags;
5989 int error;
5990 PyObject *all = (PyObject *)NULL;
5991 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005992
Georg Brandl6083a4b2013-10-14 06:51:46 +02005993 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005995 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005996 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 &protocol, &flags)) {
5998 return NULL;
5999 }
6000 if (hobj == Py_None) {
6001 hptr = NULL;
6002 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006003 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 if (!idna)
6005 return NULL;
6006 assert(PyBytes_Check(idna));
6007 hptr = PyBytes_AS_STRING(idna);
6008 } else if (PyBytes_Check(hobj)) {
6009 hptr = PyBytes_AsString(hobj);
6010 } else {
6011 PyErr_SetString(PyExc_TypeError,
6012 "getaddrinfo() argument 1 must be string or None");
6013 return NULL;
6014 }
6015 if (PyLong_CheckExact(pobj)) {
6016 long value = PyLong_AsLong(pobj);
6017 if (value == -1 && PyErr_Occurred())
6018 goto err;
6019 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6020 pptr = pbuf;
6021 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006022 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006023 if (pptr == NULL)
6024 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006026 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 } else if (pobj == Py_None) {
6028 pptr = (char *)NULL;
6029 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006030 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 goto err;
6032 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006033#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006034 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6035 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006036 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6037 * This workaround avoids a segfault in libsystem.
6038 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006039 pptr = "00";
6040 }
6041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 memset(&hints, 0, sizeof(hints));
6043 hints.ai_family = family;
6044 hints.ai_socktype = socktype;
6045 hints.ai_protocol = protocol;
6046 hints.ai_flags = flags;
6047 Py_BEGIN_ALLOW_THREADS
6048 ACQUIRE_GETADDRINFO_LOCK
6049 error = getaddrinfo(hptr, pptr, &hints, &res0);
6050 Py_END_ALLOW_THREADS
6051 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6052 if (error) {
6053 set_gaierror(error);
6054 goto err;
6055 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006056
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006057 all = PyList_New(0);
6058 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 goto err;
6060 for (res = res0; res; res = res->ai_next) {
6061 PyObject *single;
6062 PyObject *addr =
6063 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6064 if (addr == NULL)
6065 goto err;
6066 single = Py_BuildValue("iiisO", res->ai_family,
6067 res->ai_socktype, res->ai_protocol,
6068 res->ai_canonname ? res->ai_canonname : "",
6069 addr);
6070 Py_DECREF(addr);
6071 if (single == NULL)
6072 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 if (PyList_Append(all, single))
6075 goto err;
6076 Py_XDECREF(single);
6077 }
6078 Py_XDECREF(idna);
6079 if (res0)
6080 freeaddrinfo(res0);
6081 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006082 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 Py_XDECREF(all);
6084 Py_XDECREF(idna);
6085 if (res0)
6086 freeaddrinfo(res0);
6087 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006088}
6089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006090PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006091"getaddrinfo(host, port [, family, type, proto, flags])\n\
6092 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006093\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006094Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006095
6096/* Python interface to getnameinfo(sa, flags). */
6097
6098/*ARGSUSED*/
6099static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006100socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 PyObject *sa = (PyObject *)NULL;
6103 int flags;
6104 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006105 int port;
6106 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6108 struct addrinfo hints, *res = NULL;
6109 int error;
6110 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006111 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 flags = flowinfo = scope_id = 0;
6114 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6115 return NULL;
6116 if (!PyTuple_Check(sa)) {
6117 PyErr_SetString(PyExc_TypeError,
6118 "getnameinfo() argument 1 must be a tuple");
6119 return NULL;
6120 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006121 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 &hostp, &port, &flowinfo, &scope_id))
6123 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006124 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006125 PyErr_SetString(PyExc_OverflowError,
6126 "getsockaddrarg: flowinfo must be 0-1048575.");
6127 return NULL;
6128 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6130 memset(&hints, 0, sizeof(hints));
6131 hints.ai_family = AF_UNSPEC;
6132 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006133 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 Py_BEGIN_ALLOW_THREADS
6135 ACQUIRE_GETADDRINFO_LOCK
6136 error = getaddrinfo(hostp, pbuf, &hints, &res);
6137 Py_END_ALLOW_THREADS
6138 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6139 if (error) {
6140 set_gaierror(error);
6141 goto fail;
6142 }
6143 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006144 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 "sockaddr resolved to multiple addresses");
6146 goto fail;
6147 }
6148 switch (res->ai_family) {
6149 case AF_INET:
6150 {
6151 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006152 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 "IPv4 sockaddr must be 2 tuple");
6154 goto fail;
6155 }
6156 break;
6157 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006158#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 case AF_INET6:
6160 {
6161 struct sockaddr_in6 *sin6;
6162 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006163 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 sin6->sin6_scope_id = scope_id;
6165 break;
6166 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006169 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6171 if (error) {
6172 set_gaierror(error);
6173 goto fail;
6174 }
Victor Stinner72400302016-01-28 15:41:01 +01006175
6176 name = sock_decode_hostname(hbuf);
6177 if (name == NULL)
6178 goto fail;
6179 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006180
6181fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 if (res)
6183 freeaddrinfo(res);
6184 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006185}
6186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006187PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006188"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006189\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006190Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006191
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006192
6193/* Python API to getting and setting the default timeout value. */
6194
6195static PyObject *
6196socket_getdefaulttimeout(PyObject *self)
6197{
Victor Stinner71694d52015-03-28 01:18:54 +01006198 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 Py_INCREF(Py_None);
6200 return Py_None;
6201 }
Victor Stinner71694d52015-03-28 01:18:54 +01006202 else {
6203 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6204 return PyFloat_FromDouble(seconds);
6205 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006206}
6207
6208PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006209"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006210\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006211Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006212A value of None indicates that new socket objects have no timeout.\n\
6213When the socket module is first imported, the default is None.");
6214
6215static PyObject *
6216socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6217{
Victor Stinner71694d52015-03-28 01:18:54 +01006218 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006219
Victor Stinner71694d52015-03-28 01:18:54 +01006220 if (socket_parse_timeout(&timeout, arg) < 0)
6221 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 Py_INCREF(Py_None);
6226 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006227}
6228
6229PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006230"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006231\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006232Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006233A value of None indicates that new socket objects have no timeout.\n\
6234When the socket module is first imported, the default is None.");
6235
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236#ifdef HAVE_IF_NAMEINDEX
6237/* Python API for getting interface indices and names */
6238
6239static PyObject *
6240socket_if_nameindex(PyObject *self, PyObject *arg)
6241{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006242 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006243 int i;
6244 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006245
Charles-François Natali60713592011-05-20 16:55:06 +02006246 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006247 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006248 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006249 return NULL;
6250 }
6251
6252 list = PyList_New(0);
6253 if (list == NULL) {
6254 if_freenameindex(ni);
6255 return NULL;
6256 }
6257
Charles-François Natali60713592011-05-20 16:55:06 +02006258 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6259 PyObject *ni_tuple = Py_BuildValue("IO&",
6260 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006261
6262 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6263 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006264 Py_DECREF(list);
6265 if_freenameindex(ni);
6266 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006267 }
6268 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006269 }
6270
6271 if_freenameindex(ni);
6272 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006273}
6274
6275PyDoc_STRVAR(if_nameindex_doc,
6276"if_nameindex()\n\
6277\n\
6278Returns a list of network interface information (index, name) tuples.");
6279
Charles-François Natali60713592011-05-20 16:55:06 +02006280static PyObject *
6281socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006282{
Charles-François Natali60713592011-05-20 16:55:06 +02006283 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006284 unsigned long index;
6285
Charles-François Natali60713592011-05-20 16:55:06 +02006286 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6287 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006288 return NULL;
6289
Charles-François Natali60713592011-05-20 16:55:06 +02006290 index = if_nametoindex(PyBytes_AS_STRING(oname));
6291 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006292 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006293 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006294 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006295 return NULL;
6296 }
6297
6298 return PyLong_FromUnsignedLong(index);
6299}
6300
6301PyDoc_STRVAR(if_nametoindex_doc,
6302"if_nametoindex(if_name)\n\
6303\n\
6304Returns the interface index corresponding to the interface name if_name.");
6305
Charles-François Natali60713592011-05-20 16:55:06 +02006306static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006307socket_if_indextoname(PyObject *self, PyObject *arg)
6308{
Charles-François Natali60713592011-05-20 16:55:06 +02006309 unsigned long index;
6310 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006311
Charles-François Natali60713592011-05-20 16:55:06 +02006312 index = PyLong_AsUnsignedLong(arg);
6313 if (index == (unsigned long) -1)
6314 return NULL;
6315
6316 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006317 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006318 return NULL;
6319 }
6320
Charles-François Natali60713592011-05-20 16:55:06 +02006321 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006322}
6323
6324PyDoc_STRVAR(if_indextoname_doc,
6325"if_indextoname(if_index)\n\
6326\n\
6327Returns the interface name corresponding to the interface index if_index.");
6328
6329#endif /* HAVE_IF_NAMEINDEX */
6330
6331
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006332#ifdef CMSG_LEN
6333/* Python interface to CMSG_LEN(length). */
6334
6335static PyObject *
6336socket_CMSG_LEN(PyObject *self, PyObject *args)
6337{
6338 Py_ssize_t length;
6339 size_t result;
6340
6341 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6342 return NULL;
6343 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6344 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6345 return NULL;
6346 }
6347 return PyLong_FromSize_t(result);
6348}
6349
6350PyDoc_STRVAR(CMSG_LEN_doc,
6351"CMSG_LEN(length) -> control message length\n\
6352\n\
6353Return the total length, without trailing padding, of an ancillary\n\
6354data item with associated data of the given length. This value can\n\
6355often be used as the buffer size for recvmsg() to receive a single\n\
6356item of ancillary data, but RFC 3542 requires portable applications to\n\
6357use CMSG_SPACE() and thus include space for padding, even when the\n\
6358item will be the last in the buffer. Raises OverflowError if length\n\
6359is outside the permissible range of values.");
6360
6361
6362#ifdef CMSG_SPACE
6363/* Python interface to CMSG_SPACE(length). */
6364
6365static PyObject *
6366socket_CMSG_SPACE(PyObject *self, PyObject *args)
6367{
6368 Py_ssize_t length;
6369 size_t result;
6370
6371 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6372 return NULL;
6373 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6374 PyErr_SetString(PyExc_OverflowError,
6375 "CMSG_SPACE() argument out of range");
6376 return NULL;
6377 }
6378 return PyLong_FromSize_t(result);
6379}
6380
6381PyDoc_STRVAR(CMSG_SPACE_doc,
6382"CMSG_SPACE(length) -> buffer size\n\
6383\n\
6384Return the buffer size needed for recvmsg() to receive an ancillary\n\
6385data item with associated data of the given length, along with any\n\
6386trailing padding. The buffer space needed to receive multiple items\n\
6387is the sum of the CMSG_SPACE() values for their associated data\n\
6388lengths. Raises OverflowError if length is outside the permissible\n\
6389range of values.");
6390#endif /* CMSG_SPACE */
6391#endif /* CMSG_LEN */
6392
6393
Guido van Rossum30a685f1991-06-27 15:51:29 +00006394/* List of functions exported by this module. */
6395
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006396static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 {"gethostbyname", socket_gethostbyname,
6398 METH_VARARGS, gethostbyname_doc},
6399 {"gethostbyname_ex", socket_gethostbyname_ex,
6400 METH_VARARGS, ghbn_ex_doc},
6401 {"gethostbyaddr", socket_gethostbyaddr,
6402 METH_VARARGS, gethostbyaddr_doc},
6403 {"gethostname", socket_gethostname,
6404 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006405#ifdef HAVE_SETHOSTNAME
6406 {"sethostname", socket_sethostname,
6407 METH_VARARGS, sethostname_doc},
6408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 {"getservbyname", socket_getservbyname,
6410 METH_VARARGS, getservbyname_doc},
6411 {"getservbyport", socket_getservbyport,
6412 METH_VARARGS, getservbyport_doc},
6413 {"getprotobyname", socket_getprotobyname,
6414 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006415#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 {"dup", socket_dup,
6417 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006418#endif
Dave Cole331708b2004-08-09 04:51:41 +00006419#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 {"socketpair", socket_socketpair,
6421 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 {"ntohs", socket_ntohs,
6424 METH_VARARGS, ntohs_doc},
6425 {"ntohl", socket_ntohl,
6426 METH_O, ntohl_doc},
6427 {"htons", socket_htons,
6428 METH_VARARGS, htons_doc},
6429 {"htonl", socket_htonl,
6430 METH_O, htonl_doc},
6431 {"inet_aton", socket_inet_aton,
6432 METH_VARARGS, inet_aton_doc},
6433 {"inet_ntoa", socket_inet_ntoa,
6434 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006435#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 {"inet_pton", socket_inet_pton,
6437 METH_VARARGS, inet_pton_doc},
6438 {"inet_ntop", socket_inet_ntop,
6439 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006440#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006441 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6442 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 {"getnameinfo", socket_getnameinfo,
6444 METH_VARARGS, getnameinfo_doc},
6445 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6446 METH_NOARGS, getdefaulttimeout_doc},
6447 {"setdefaulttimeout", socket_setdefaulttimeout,
6448 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006449#ifdef HAVE_IF_NAMEINDEX
6450 {"if_nameindex", socket_if_nameindex,
6451 METH_NOARGS, if_nameindex_doc},
6452 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006453 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006454 {"if_indextoname", socket_if_indextoname,
6455 METH_O, if_indextoname_doc},
6456#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006457#ifdef CMSG_LEN
6458 {"CMSG_LEN", socket_CMSG_LEN,
6459 METH_VARARGS, CMSG_LEN_doc},
6460#ifdef CMSG_SPACE
6461 {"CMSG_SPACE", socket_CMSG_SPACE,
6462 METH_VARARGS, CMSG_SPACE_doc},
6463#endif
6464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006466};
6467
Guido van Rossum30a685f1991-06-27 15:51:29 +00006468
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006469#ifdef MS_WINDOWS
6470#define OS_INIT_DEFINED
6471
6472/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006473
6474static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006475os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006478}
6479
6480static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006481os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 WSADATA WSAData;
6484 int ret;
6485 ret = WSAStartup(0x0101, &WSAData);
6486 switch (ret) {
6487 case 0: /* No error */
6488 Py_AtExit(os_cleanup);
6489 return 1; /* Success */
6490 case WSASYSNOTREADY:
6491 PyErr_SetString(PyExc_ImportError,
6492 "WSAStartup failed: network not ready");
6493 break;
6494 case WSAVERNOTSUPPORTED:
6495 case WSAEINVAL:
6496 PyErr_SetString(
6497 PyExc_ImportError,
6498 "WSAStartup failed: requested version not supported");
6499 break;
6500 default:
6501 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6502 break;
6503 }
6504 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006505}
6506
Guido van Rossum8d665e61996-06-26 18:22:49 +00006507#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006508
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006509
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006510
6511#ifndef OS_INIT_DEFINED
6512static int
6513os_init(void)
6514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006516}
6517#endif
6518
6519
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006520/* C API table - always add new things to the end for binary
6521 compatibility. */
6522static
6523PySocketModule_APIObject PySocketModuleAPI =
6524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006526 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006528};
6529
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006530
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006531/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006532
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006533 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006534 "socket.py" which implements some additional functionality.
6535 The import of "_socket" may fail with an ImportError exception if
6536 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006537 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006538 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006539*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006541PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006542"Implementation module for socket operations.\n\
6543\n\
6544See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006545
Martin v. Löwis1a214512008-06-11 05:26:20 +00006546static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 PyModuleDef_HEAD_INIT,
6548 PySocket_MODULE_NAME,
6549 socket_doc,
6550 -1,
6551 socket_methods,
6552 NULL,
6553 NULL,
6554 NULL,
6555 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006556};
6557
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006558PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006559PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 if (!os_init())
6564 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006565
Victor Stinnerdaf45552013-08-28 00:53:59 +02006566#ifdef MS_WINDOWS
6567 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006568#if defined(_MSC_VER) && _MSC_VER >= 1800
6569 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6570#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006571 DWORD version = GetVersion();
6572 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6573 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6574 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006575 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6576#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006577 }
6578#endif
6579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 Py_TYPE(&sock_type) = &PyType_Type;
6581 m = PyModule_Create(&socketmodule);
6582 if (m == NULL)
6583 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006584
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006585 Py_INCREF(PyExc_OSError);
6586 PySocketModuleAPI.error = PyExc_OSError;
6587 Py_INCREF(PyExc_OSError);
6588 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006590 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 if (socket_herror == NULL)
6592 return NULL;
6593 Py_INCREF(socket_herror);
6594 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006595 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 NULL);
6597 if (socket_gaierror == NULL)
6598 return NULL;
6599 Py_INCREF(socket_gaierror);
6600 PyModule_AddObject(m, "gaierror", socket_gaierror);
6601 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006602 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 if (socket_timeout == NULL)
6604 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006605 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 Py_INCREF(socket_timeout);
6607 PyModule_AddObject(m, "timeout", socket_timeout);
6608 Py_INCREF((PyObject *)&sock_type);
6609 if (PyModule_AddObject(m, "SocketType",
6610 (PyObject *)&sock_type) != 0)
6611 return NULL;
6612 Py_INCREF((PyObject *)&sock_type);
6613 if (PyModule_AddObject(m, "socket",
6614 (PyObject *)&sock_type) != 0)
6615 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006616
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006617#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006619#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 Py_INCREF(has_ipv6);
6623 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 /* Export C API */
6626 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6627 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6628 ) != 0)
6629 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006632#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006634#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006636#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006638#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006639#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006642#endif
6643#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#endif
6646#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006649#endif
6650#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006653#endif
6654#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006657#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006658#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006661#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006662#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006665#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006666#ifdef HAVE_SOCKADDR_ALG
6667 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6668#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006669#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006672#endif
6673#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006675#endif
6676#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006679#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006680#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006683#endif
6684#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006687#endif
6688#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006691#endif
6692#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006695#endif
6696#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, AF_NETLINK);
6699 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006700#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006702#endif
6703#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006705#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6707 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006708#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006710#endif
6711#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006713#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006714#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006716#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006717#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006719#endif
6720#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006722#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006724#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006726#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006727#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006729#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006730#ifdef NETLINK_CRYPTO
6731 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6732#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006733#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006734#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006738#ifdef AF_LINK
6739 PyModule_AddIntMacro(m, AF_LINK);
6740#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006741#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#endif
6745#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006748#endif
6749#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006752#endif
6753#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006756#endif
6757#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006760#endif
6761#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006764#endif
6765#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006768#endif
6769#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006772#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006773
Hye-Shik Chang81268602004-02-02 06:05:24 +00006774#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6776 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6777 PyModule_AddIntMacro(m, BTPROTO_HCI);
6778 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006779#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006781#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006782#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006783#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006785#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6787 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006788#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6791 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006792#endif
6793
Charles-François Natali47413c12011-10-06 19:47:44 +02006794#ifdef AF_CAN
6795 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006797#endif
6798#ifdef PF_CAN
6799 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006801#endif
6802
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006803/* Reliable Datagram Sockets */
6804#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006806#endif
6807#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006809#endif
6810
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006811/* Kernel event messages */
6812#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006814#endif
6815#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006817#endif
6818
Antoine Pitroub156a462010-10-27 20:13:57 +00006819#ifdef AF_PACKET
6820 PyModule_AddIntMacro(m, AF_PACKET);
6821#endif
6822#ifdef PF_PACKET
6823 PyModule_AddIntMacro(m, PF_PACKET);
6824#endif
6825#ifdef PACKET_HOST
6826 PyModule_AddIntMacro(m, PACKET_HOST);
6827#endif
6828#ifdef PACKET_BROADCAST
6829 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6830#endif
6831#ifdef PACKET_MULTICAST
6832 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6833#endif
6834#ifdef PACKET_OTHERHOST
6835 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6836#endif
6837#ifdef PACKET_OUTGOING
6838 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6839#endif
6840#ifdef PACKET_LOOPBACK
6841 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6842#endif
6843#ifdef PACKET_FASTROUTE
6844 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006845#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006846
Christian Heimes043d6f62008-01-07 17:19:16 +00006847#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6852 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6853 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006854
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6856 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6857 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, SOL_TIPC);
6861 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6862 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6863 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6864 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006865
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6867 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6868 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6869 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6873 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006874#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006877#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6879 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6880 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6881 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6882 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6883 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006884#endif
6885
Christian Heimesdffa3942016-09-05 23:54:41 +02006886#ifdef HAVE_SOCKADDR_ALG
6887 /* Socket options */
6888 PyModule_AddIntMacro(m, ALG_SET_KEY);
6889 PyModule_AddIntMacro(m, ALG_SET_IV);
6890 PyModule_AddIntMacro(m, ALG_SET_OP);
6891 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6892 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6893 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6894
6895 /* Operations */
6896 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6897 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6898 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6899 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6900#endif
6901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_STREAM);
6904 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006905/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006906#ifdef SOCK_RAW
6907 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006909#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006911#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006913#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006914#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006916#endif
6917#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006919#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006929#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006930#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006932#endif
6933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006952#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006983#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006984#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006986#endif
6987#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#endif
6990#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006992#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006993#ifdef SO_PASSSEC
6994 PyModule_AddIntMacro(m, SO_PASSSEC);
6995#endif
6996#ifdef SO_PEERSEC
6997 PyModule_AddIntMacro(m, SO_PEERSEC);
6998#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006999#ifdef SO_BINDTODEVICE
7000 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7001#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007002#ifdef SO_PRIORITY
7003 PyModule_AddIntMacro(m, SO_PRIORITY);
7004#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007005#ifdef SO_MARK
7006 PyModule_AddIntMacro(m, SO_MARK);
7007#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007008#ifdef SO_DOMAIN
7009 PyModule_AddIntMacro(m, SO_DOMAIN);
7010#endif
7011#ifdef SO_PROTOCOL
7012 PyModule_AddIntMacro(m, SO_PROTOCOL);
7013#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 /* Maximum number of connections for "listen" */
7016#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007017 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007018#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007019 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007020#endif
7021
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007022 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007023#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007025#endif
7026#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007028#endif
7029#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007031#endif
7032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033 /* Flags for send, recv */
7034#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007063#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007064#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007066#endif
7067#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007069#endif
7070#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007072#endif
7073#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007075#endif
7076#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007078#endif
7079#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007081#endif
7082#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007084#endif
7085#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007087#endif
7088#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007090#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007091#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007093#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 /* Protocol level and numbers, usable for [gs]etsockopt */
7096#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007124#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007126#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007128#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007129#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007131#endif
7132#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7134 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007135#endif
7136#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7138 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7139 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007140
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7142 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7143 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007144#endif
7145#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7147 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7148 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7149 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007150#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007151#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7152 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7153#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007154#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007156 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7157 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7158 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7159 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7160 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7161 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7162 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7163 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7164 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7165 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7166 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7167 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7168#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007169#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007171#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007172#ifdef HAVE_SOCKADDR_ALG
7173 PyModule_AddIntMacro(m, SOL_ALG);
7174#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007175#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007177#endif
7178#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007180#endif
7181#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007183#endif
7184#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007186#endif
7187#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007189#endif
7190#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007195#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007203#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007234#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007296#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007297#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007302#endif
7303/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007306#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
7312
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007313#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007315#endif
7316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 /* Some port configuration */
7318#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007327#endif
7328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 /* Some reserved IP v.4 addresses */
7330#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007332#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007340#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007347#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef INADDR_ALLHOSTS_GROUP
7351 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7352 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007358#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007361#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007363#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007365#endif
7366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367 /* IPv4 [gs]etsockopt options */
7368#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007410#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007413#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007415#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007416#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007418#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7421#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007433#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007446#endif
7447#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007449#endif
7450#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007452#endif
7453#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007455#endif
7456#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007458#endif
7459#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#endif
7462#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007464#endif
7465#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007467#endif
7468#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#endif
7471#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007473#endif
7474#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
7477#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007479#endif
7480#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007482#endif
7483#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007485#endif
7486#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007488#endif
7489#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007491#endif
7492#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007494#endif
7495#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007497#endif
7498#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007500#endif
7501#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007503#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505 /* TCP options */
7506#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007541#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007542#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007544#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007545#ifdef TCP_CONGESTION
7546 PyModule_AddIntMacro(m, TCP_CONGESTION);
7547#endif
7548#ifdef TCP_USER_TIMEOUT
7549 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7550#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552 /* IPX options */
7553#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007555#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007556
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007557/* Reliable Datagram Sockets */
7558#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007560#endif
7561#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007563#endif
7564#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007566#endif
7567#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007569#endif
7570#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007572#endif
7573#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007575#endif
7576#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007578#endif
7579#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007581#endif
7582#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007584#endif
7585#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007587#endif
7588#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007590#endif
7591#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007593#endif
7594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007598#endif
7599#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007613#endif
7614#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#endif
7617#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007620#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007622#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007623#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007625#endif
7626#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007628#endif
7629#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007634#endif
7635#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007637#endif
7638#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007640#endif
7641#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007643#endif
7644#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007646#endif
7647#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007650#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007652#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007653#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007655#endif
7656#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007658#endif
7659#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007661#endif
7662#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007664#endif
7665#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007667#endif
7668#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007670#endif
7671#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#endif
7674#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007676#endif
7677#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007679#endif
7680#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007682#endif
7683#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007685#endif
7686#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007688#endif
7689#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007691#endif
7692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007694#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007696#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007697 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007699 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007700#endif
7701#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007702 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007703#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007705#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007706 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007707#endif
7708#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007710#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007713 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007714#endif
7715
Christian Heimesfaf2f632008-01-06 16:59:19 +00007716#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007718 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7719#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007720 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007721#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007722 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007723 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7724#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007725 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007726#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007727 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007728 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007729 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007730 PyObject *tmp;
7731 tmp = PyLong_FromUnsignedLong(codes[i]);
7732 if (tmp == NULL)
7733 return NULL;
7734 PyModule_AddObject(m, names[i], tmp);
7735 }
7736 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007737 PyModule_AddIntMacro(m, RCVALL_OFF);
7738 PyModule_AddIntMacro(m, RCVALL_ON);
7739 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007740#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007742#endif
7743#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007745#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007746#endif /* _MSTCPIP_ */
7747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007749#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007750 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007752 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007753}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007754
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007755
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007756#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007757#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007758
7759/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007760/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007761
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007762int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007763inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007765 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007766#if (SIZEOF_INT != 4)
7767#error "Not sure if in_addr_t exists and int is not 32-bits."
7768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007769 unsigned int packed_addr;
7770 packed_addr = inet_addr(src);
7771 if (packed_addr == INADDR_NONE)
7772 return 0;
7773 memcpy(dst, &packed_addr, 4);
7774 return 1;
7775 }
7776 /* Should set errno to EAFNOSUPPORT */
7777 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007778}
7779
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007780const char *
7781inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007783 if (af == AF_INET) {
7784 struct in_addr packed_addr;
7785 if (size < 16)
7786 /* Should set errno to ENOSPC. */
7787 return NULL;
7788 memcpy(&packed_addr, src, sizeof(packed_addr));
7789 return strncpy(dst, inet_ntoa(packed_addr), size);
7790 }
7791 /* Should set errno to EAFNOSUPPORT */
7792 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007793}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007794
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007795#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007796#endif