blob: 970918638abf2fc6188ea1a0778c995772d1fe1f [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
Jesus Cea736e7fc2011-03-14 17:36:54 +0100175# if defined(_AIX)
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 */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# else
182# undef HAVE_GETHOSTBYNAME_R
183# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000184#endif
185
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000186#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
187 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000189#endif
190
Ned Deilye1d4e582016-02-23 22:05:29 +1100191/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000192#ifdef HAVE_SYS_PARAM_H
193#include <sys/param.h>
194#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000195/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100196 (this includes the getaddrinfo emulation) protect access with a lock.
197
198 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
199 a mix of code including an unsafe implementation from an old BSD's
200 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
201 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100202 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100203
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
205 http://www.openbsd.org/plus54.html
206
207 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
208
209http://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 +1100210 */
211#if defined(WITH_THREAD) && ( \
212 (defined(__APPLE__) && \
213 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000214 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100215 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
216 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100217 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000218#define USE_GETADDRINFO_LOCK
219#endif
220
221#ifdef USE_GETADDRINFO_LOCK
222#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
223#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
224#else
225#define ACQUIRE_GETADDRINFO_LOCK
226#define RELEASE_GETADDRINFO_LOCK
227#endif
228
229#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000231#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000233#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234# include <types.h>
235# include <io.h>
236# include <sys/ioctl.h>
237# include <utils.h>
238# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000239#endif
240
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100241#ifdef __APPLE__
242# include <sys/ioctl.h>
243#endif
244
245
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000247/* make sure that the reentrant (gethostbyaddr_r etc)
248 functions are declared correctly if compiling with
249 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000253#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000256#undef _XOPEN_SOURCE
257#include <sys/socket.h>
258#include <sys/types.h>
259#include <netinet/in.h>
260#ifdef _SS_ALIGNSIZE
261#define HAVE_GETADDRINFO 1
262#define HAVE_GETNAMEINFO 1
263#endif
264
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000265#define HAVE_INET_PTON
266#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000267#endif
268
Thomas Wouters477c8d52006-05-27 19:21:47 +0000269/* Irix 6.5 fails to define this variable at all. This is needed
270 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000271 are just busted. Same thing for Solaris. */
272#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000273#define INET_ADDRSTRLEN 16
274#endif
275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000278#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700281#ifdef HAVE_SYS_SOCKET_H
282#include <sys/socket.h>
283#endif
284
285#ifdef HAVE_NET_IF_H
286#include <net/if.h>
287#endif
288
Christian Heimesdffa3942016-09-05 23:54:41 +0200289#ifdef HAVE_SOCKADDR_ALG
290#include <linux/if_alg.h>
291#ifndef AF_ALG
292#define AF_ALG 38
293#endif
294#ifndef SOL_ALG
295#define SOL_ALG 279
296#endif
297
298/* Linux 3.19 */
299#ifndef ALG_SET_AEAD_ASSOCLEN
300#define ALG_SET_AEAD_ASSOCLEN 4
301#endif
302#ifndef ALG_SET_AEAD_AUTHSIZE
303#define ALG_SET_AEAD_AUTHSIZE 5
304#endif
305/* Linux 4.8 */
306#ifndef ALG_SET_PUBKEY
307#define ALG_SET_PUBKEY 6
308#endif
309
310#ifndef ALG_OP_SIGN
311#define ALG_OP_SIGN 2
312#endif
313#ifndef ALG_OP_VERIFY
314#define ALG_OP_VERIFY 3
315#endif
316
317#endif /* HAVE_SOCKADDR_ALG */
318
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000319/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000320#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000321#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000322
323/* Addressing includes */
324
Guido van Rossum6f489d91996-06-28 20:15:15 +0000325#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000326
327/* Non-MS WINDOWS includes */
328# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000329# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000330
Guido van Rossum9376b741999-09-15 22:01:40 +0000331/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000332# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000333
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000334# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000335
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000336#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000337
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000338/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339# ifdef HAVE_FCNTL_H
340# include <fcntl.h>
341# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000342
Steve Dower65e4cb12014-11-22 12:54:57 -0800343#if defined(_MSC_VER) && _MSC_VER >= 1800
344/* Provides the IsWindows7SP1OrGreater() function */
345#include <VersionHelpers.h>
346#endif
347
Jeremy Hylton22308652001-02-02 03:23:09 +0000348#endif
349
Skip Montanaro7befb992004-02-10 16:50:21 +0000350#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000351
Neal Norwitz39d22e52002-11-02 19:55:21 +0000352#ifndef O_NONBLOCK
353# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000354#endif
355
Trent Micka708d6e2004-09-07 17:48:26 +0000356/* include Python's addrinfo.h unless it causes trouble */
357#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
358 /* Do not include addinfo.h on some newer IRIX versions.
359 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
360 * for example, but not by 6.5.10.
361 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000362#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000363 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
364 * EAI_* constants are defined in (the already included) ws2tcpip.h.
365 */
366#else
367# include "addrinfo.h"
368#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000369
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000370#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000371#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000372int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000373const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000374#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000375#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000376
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000377#ifdef __APPLE__
378/* On OS X, getaddrinfo returns no error indication of lookup
379 failure, so we must use the emulation instead of the libinfo
380 implementation. Unfortunately, performing an autoconf test
381 for this bug would require DNS access for the machine performing
382 the configuration, which is not acceptable. Therefore, we
383 determine the bug just by checking for __APPLE__. If this bug
384 gets ever fixed, perhaps checking for sys/version.h would be
385 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000386#ifndef HAVE_GETNAMEINFO
387/* This bug seems to be fixed in Jaguar. Ths easiest way I could
388 Find to check for Jaguar is that it has getnameinfo(), which
389 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000390#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000391#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000392
393#ifdef HAVE_INET_ATON
394#define USE_INET_ATON_WEAKLINK
395#endif
396
Jack Jansen84262fb2002-07-02 14:40:42 +0000397#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000398
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000399/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000400#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000401/* avoid clashes with the C library definition of the symbol. */
402#define getaddrinfo fake_getaddrinfo
403#define gai_strerror fake_gai_strerror
404#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000405#include "getaddrinfo.c"
406#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000407#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000408#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000409#include "getnameinfo.c"
410#endif
411
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000412#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000413#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000414#endif
415
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000416#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000417#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000418#define EAFNOSUPPORT WSAEAFNOSUPPORT
419#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000420#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000421
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000422#ifndef SOCKETCLOSE
423#define SOCKETCLOSE close
424#endif
425
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000426#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define USE_BLUETOOTH 1
428#if defined(__FreeBSD__)
429#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
430#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000431#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000432#define SOL_HCI SOL_HCI_RAW
433#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000434#define sockaddr_l2 sockaddr_l2cap
435#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000437#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
438#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000439#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000440#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000441#define sockaddr_l2 sockaddr_bt
442#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000443#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000444#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000445#define SOL_HCI BTPROTO_HCI
446#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000447#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
448#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000449#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000450#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000451#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000452#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
453#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000454#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000455#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
456#endif
457#endif
458
Charles-François Natali8b759652011-12-23 16:44:51 +0100459/* Convert "sock_addr_t *" to "struct sockaddr *". */
460#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461
Martin v. Löwise9416172003-05-03 10:12:45 +0000462/*
463 * Constants for getnameinfo()
464 */
465#if !defined(NI_MAXHOST)
466#define NI_MAXHOST 1025
467#endif
468#if !defined(NI_MAXSERV)
469#define NI_MAXSERV 32
470#endif
471
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000472#ifndef INVALID_SOCKET /* MS defines this */
473#define INVALID_SOCKET (-1)
474#endif
475
Charles-François Natali0cc86852013-09-13 19:53:08 +0200476#ifndef INADDR_NONE
477#define INADDR_NONE (-1)
478#endif
479
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000480/* XXX There's a problem here: *static* functions are not supposed to have
481 a Py prefix (or use CapitalizedWords). Later... */
482
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483/* Global variable holding the exception type for errors detected
484 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000485static PyObject *socket_herror;
486static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000487static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488
Tim Peters643a7fc2002-02-17 04:13:21 +0000489/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000490 The sock_type variable contains pointers to various functions,
491 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000492 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000493static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000494
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000495#if defined(HAVE_POLL_H)
496#include <poll.h>
497#elif defined(HAVE_SYS_POLL_H)
498#include <sys/poll.h>
499#endif
500
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000501/* Largest value to try to store in a socklen_t (used when handling
502 ancillary data). POSIX requires socklen_t to hold at least
503 (2**31)-1 and recommends against storing larger values, but
504 socklen_t was originally int in the BSD interface, so to be on the
505 safe side we use the smaller of (2**31)-1 and INT_MAX. */
506#if INT_MAX > 0x7fffffff
507#define SOCKLEN_T_LIMIT 0x7fffffff
508#else
509#define SOCKLEN_T_LIMIT INT_MAX
510#endif
511
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200512#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000513/* Instead of select(), we'll use poll() since poll() works on any fd. */
514#define IS_SELECTABLE(s) 1
515/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000516#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200517/* If there's no timeout left, we don't have to call select, so it's a safe,
518 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100519#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000520#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000521
522static PyObject*
523select_error(void)
524{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200525 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000527}
528
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000529#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000530#ifndef WSAEAGAIN
531#define WSAEAGAIN WSAEWOULDBLOCK
532#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000533#define CHECK_ERRNO(expected) \
534 (WSAGetLastError() == WSA ## expected)
535#else
536#define CHECK_ERRNO(expected) \
537 (errno == expected)
538#endif
539
Victor Stinnerdaf45552013-08-28 00:53:59 +0200540#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200541# define GET_SOCK_ERROR WSAGetLastError()
542# define SET_SOCK_ERROR(err) WSASetLastError(err)
543# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
544# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
545#else
546# define GET_SOCK_ERROR errno
547# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
548# define SOCK_TIMEOUT_ERR EWOULDBLOCK
549# define SOCK_INPROGRESS_ERR EINPROGRESS
550#endif
551
552
553#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200554/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
555static int support_wsa_no_inherit = -1;
556#endif
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* Convenience function to raise an error according to errno
559 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560
Guido van Rossum73624e91994-10-10 17:59:00 +0000561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000562set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000564#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 int err_no = WSAGetLastError();
566 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
567 recognizes the error codes used by both GetLastError() and
568 WSAGetLastError */
569 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200570 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000571#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000572
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200573 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574}
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000578set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581
582#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (v != NULL) {
588 PyErr_SetObject(socket_herror, v);
589 Py_DECREF(v);
590 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593}
594
595
596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwis272cb402002-03-01 08:31:07 +0000601#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 /* EAI_SYSTEM is not available on Windows XP. */
603 if (error == EAI_SYSTEM)
604 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000607#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (v != NULL) {
613 PyErr_SetObject(socket_gaierror, v);
614 Py_DECREF(v);
615 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618}
619
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000620/* Function to perform the setting of socket blocking mode
621 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622static int
623internal_setblocking(PySocketSockObject *s, int block)
624{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200625#ifdef MS_WINDOWS
626 u_long arg;
627#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100628#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100629 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100630 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000632#ifdef SOCK_NONBLOCK
633 if (block)
634 s->sock_type &= (~SOCK_NONBLOCK);
635 else
636 s->sock_type |= SOCK_NONBLOCK;
637#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100641#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200643 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
644 goto error;
Victor Stinner9a954832013-12-04 00:41:24 +0100645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200647 if (delay_flag == -1)
648 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100650 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 else
Victor Stinner9a954832013-12-04 00:41:24 +0100652 new_delay_flag = delay_flag | O_NONBLOCK;
653 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200654 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
655 goto error;
Victor Stinner9a954832013-12-04 00:41:24 +0100656#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200658 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200659 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
660 goto error;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200664 return 0;
665 error:
666#ifndef MS_WINDOWS
667 PyErr_SetFromErrno(PyExc_OSError);
668#else
669 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
670#endif
671 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672}
673
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000674static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200675internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
676 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100679#ifdef HAVE_POLL
680 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200681 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100682#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200684 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100685#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000686
Victor Stinnerb7df3142015-03-27 22:59:32 +0100687#ifdef WITH_THREAD
688 /* must be called with the GIL held */
689 assert(PyGILState_Check());
690#endif
691
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200693 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200696 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Prefer poll, if available, since you can poll() any fd
700 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000701#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100702 pollfd.fd = s->sock_fd;
703 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200704 if (connect) {
705 /* On Windows, the socket becomes writable on connection success,
706 but a connection failure is notified as an error. On POSIX, the
707 socket becomes writable on connection success or on connection
708 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200710 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Victor Stinner71694d52015-03-28 01:18:54 +0100712 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200713 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200714 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Victor Stinner71694d52015-03-28 01:18:54 +0100716 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200717 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100718 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000719#else
Victor Stinnerced11742015-04-09 10:27:25 +0200720 if (interval >= 0) {
721 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
722 tvp = &tv;
723 }
724 else
725 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000726
Victor Stinner71694d52015-03-28 01:18:54 +0100727 FD_ZERO(&fds);
728 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200729 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 if (connect) {
731 /* On Windows, the socket becomes writable on connection success,
732 but a connection failure is notified as an error. On POSIX, the
733 socket becomes writable on connection success or on connection
734 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200735 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200736 }
Victor Stinner71694d52015-03-28 01:18:54 +0100737
738 /* See if the socket is ready */
739 Py_BEGIN_ALLOW_THREADS;
740 if (writing)
741 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200742 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100743 else
744 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200745 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100746 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000747#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 if (n < 0)
750 return -1;
751 if (n == 0)
752 return 1;
753 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000754}
755
Victor Stinner31bf2d52015-04-01 21:57:09 +0200756/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000757
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 On error, raise an exception and return -1 if err is set, or fill err and
759 return -1 otherwise. If a signal was received and the signal handler raised
760 an exception, return -1, and set err to -1 if err is set.
761
762 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100763
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 If the socket has a timeout, wait until the socket is ready before calling
765 the function: wait until the socket is writable if writing is nonzero, wait
766 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100767
Victor Stinner81c41db2015-04-02 11:50:57 +0200768 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200769 the function, except if the signal handler raised an exception (PEP 475).
770
771 When the function is retried, recompute the timeout using a monotonic clock.
772
Victor Stinner81c41db2015-04-02 11:50:57 +0200773 sock_call_ex() must be called with the GIL held. The socket function is
774 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200775static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200776sock_call_ex(PySocketSockObject *s,
777 int writing,
778 int (*sock_func) (PySocketSockObject *s, void *data),
779 void *data,
780 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200781 int *err,
782 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200783{
Victor Stinner8912d142015-04-06 23:16:34 +0200784 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 _PyTime_t deadline = 0;
786 int deadline_initialized = 0;
787 int res;
788
Victor Stinner92f01132015-10-11 09:54:42 +0200789#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790 /* sock_call() must be called with the GIL held. */
791 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200792#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200793
794 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 /* For connect(), poll even for blocking socket. The connection
798 runs asynchronously. */
799 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200801 _PyTime_t interval;
802
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 if (deadline_initialized) {
804 /* recompute the timeout */
805 interval = deadline - _PyTime_GetMonotonicClock();
806 }
807 else {
808 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200809 deadline = _PyTime_GetMonotonicClock() + timeout;
810 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812
Victor Stinner10550cd2015-04-03 13:22:27 +0200813 if (interval >= 0)
814 res = internal_select(s, writing, interval, connect);
815 else
816 res = 1;
817 }
818 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200819 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200820 }
821
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 if (err)
824 *err = GET_SOCK_ERROR;
825
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826 if (CHECK_ERRNO(EINTR)) {
827 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 if (PyErr_CheckSignals()) {
829 if (err)
830 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833
834 /* retry select() */
835 continue;
836 }
837
838 /* select() failed */
839 s->errorhandler();
840 return -1;
841 }
842
843 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200844 if (err)
845 *err = SOCK_TIMEOUT_ERR;
846 else
847 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848 return -1;
849 }
850
851 /* the socket is ready */
852 }
853
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 /* inner loop to retry sock_func() when sock_func() is interrupted
855 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856 while (1) {
857 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859 Py_END_ALLOW_THREADS
860
861 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200862 /* sock_func() succeeded */
863 if (err)
864 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200865 return 0;
866 }
867
Victor Stinner81c41db2015-04-02 11:50:57 +0200868 if (err)
869 *err = GET_SOCK_ERROR;
870
Victor Stinner31bf2d52015-04-01 21:57:09 +0200871 if (!CHECK_ERRNO(EINTR))
872 break;
873
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 /* sock_func() was interrupted by a signal */
875 if (PyErr_CheckSignals()) {
876 if (err)
877 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200878 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200879 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200880
Victor Stinner81c41db2015-04-02 11:50:57 +0200881 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200882 }
883
884 if (s->sock_timeout > 0
885 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887
888 For example, select() could indicate a socket is ready for
889 reading, but the data then discarded by the OS because of a
890 wrong checksum.
891
892 Loop on select() to recheck for socket readyness. */
893 continue;
894 }
895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 /* sock_func() failed */
897 if (!err)
898 s->errorhandler();
899 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000900 return -1;
901 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000903
Victor Stinner81c41db2015-04-02 11:50:57 +0200904static int
905sock_call(PySocketSockObject *s,
906 int writing,
907 int (*func) (PySocketSockObject *s, void *data),
908 void *data)
909{
Victor Stinner8912d142015-04-06 23:16:34 +0200910 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200911}
912
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000913
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000914/* Initialize a new socket object. */
915
Victor Stinner88ed6402015-04-09 10:23:12 +0200916/* Default timeout for new sockets */
917static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000918
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200919static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000920init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 s->sock_fd = fd;
924 s->sock_family = family;
925 s->sock_type = type;
926 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000929#ifdef SOCK_NONBLOCK
930 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100931 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000932 else
933#endif
934 {
935 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200936 if (defaulttimeout >= 0) {
937 if (internal_setblocking(s, 0) == -1) {
938 return -1;
939 }
940 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000941 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200942 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000943}
944
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946/* Create a new socket object.
947 This just creates the object and initializes it.
948 If the creation fails, return NULL and set an exception (implicit
949 in NEWOBJ()). */
950
Guido van Rossum73624e91994-10-10 17:59:00 +0000951static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000952new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PySocketSockObject *s;
955 s = (PySocketSockObject *)
956 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200957 if (s == NULL)
958 return NULL;
959 if (init_sockobject(s, fd, family, type, proto) == -1) {
960 Py_DECREF(s);
961 return NULL;
962 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964}
965
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966
Guido van Rossum48a680c2001-03-02 06:34:14 +0000967/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000968 thread to be in gethostbyname or getaddrinfo */
969#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200970static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000971#endif
972
973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974/* Convert a string specifying a host name or one of a few symbolic
975 names to a numeric IP address. This usually calls gethostbyname()
976 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978 an error occurred; then an exception is raised. */
979
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000980static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200981setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 struct addrinfo hints, *res;
984 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
987 if (name[0] == '\0') {
988 int siz;
989 memset(&hints, 0, sizeof(hints));
990 hints.ai_family = af;
991 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
992 hints.ai_flags = AI_PASSIVE;
993 Py_BEGIN_ALLOW_THREADS
994 ACQUIRE_GETADDRINFO_LOCK
995 error = getaddrinfo(NULL, "0", &hints, &res);
996 Py_END_ALLOW_THREADS
997 /* We assume that those thread-unsafe getaddrinfo() versions
998 *are* safe regarding their return value, ie. that a
999 subsequent call to getaddrinfo() does not destroy the
1000 outcome of the first call. */
1001 RELEASE_GETADDRINFO_LOCK
1002 if (error) {
1003 set_gaierror(error);
1004 return -1;
1005 }
1006 switch (res->ai_family) {
1007 case AF_INET:
1008 siz = 4;
1009 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001010#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case AF_INET6:
1012 siz = 16;
1013 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 default:
1016 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001017 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 "unsupported address family");
1019 return -1;
1020 }
1021 if (res->ai_next) {
1022 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001023 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 "wildcard resolved to multiple address");
1025 return -1;
1026 }
1027 if (res->ai_addrlen < addr_ret_size)
1028 addr_ret_size = res->ai_addrlen;
1029 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1030 freeaddrinfo(res);
1031 return siz;
1032 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001033 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001034 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001035 if (strcmp(name, "255.255.255.255") == 0 ||
1036 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 struct sockaddr_in *sin;
1038 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001039 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 "address family mismatched");
1041 return -1;
1042 }
1043 sin = (struct sockaddr_in *)addr_ret;
1044 memset((void *) sin, '\0', sizeof(*sin));
1045 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001046#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 sin->sin_addr.s_addr = INADDR_BROADCAST;
1050 return sizeof(sin->sin_addr);
1051 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001052
1053 /* avoid a name resolution in case of numeric address */
1054#ifdef HAVE_INET_PTON
1055 /* check for an IPv4 address */
1056 if (af == AF_UNSPEC || af == AF_INET) {
1057 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1058 memset(sin, 0, sizeof(*sin));
1059 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1060 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001061#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001062 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001063#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001064 return 4;
1065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001067#ifdef ENABLE_IPV6
1068 /* check for an IPv6 address - if the address contains a scope ID, we
1069 * fallback to getaddrinfo(), which can handle translation from interface
1070 * name to interface index */
1071 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1072 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1073 memset(sin, 0, sizeof(*sin));
1074 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1075 sin->sin6_family = AF_INET6;
1076#ifdef HAVE_SOCKADDR_SA_LEN
1077 sin->sin6_len = sizeof(*sin);
1078#endif
1079 return 16;
1080 }
1081 }
1082#endif /* ENABLE_IPV6 */
1083#else /* HAVE_INET_PTON */
1084 /* check for an IPv4 address */
1085 if (af == AF_INET || af == AF_UNSPEC) {
1086 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1087 memset(sin, 0, sizeof(*sin));
1088 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1089 sin->sin_family = AF_INET;
1090#ifdef HAVE_SOCKADDR_SA_LEN
1091 sin->sin_len = sizeof(*sin);
1092#endif
1093 return 4;
1094 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001095 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001096#endif /* HAVE_INET_PTON */
1097
1098 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 memset(&hints, 0, sizeof(hints));
1100 hints.ai_family = af;
1101 Py_BEGIN_ALLOW_THREADS
1102 ACQUIRE_GETADDRINFO_LOCK
1103 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001104#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 if (error == EAI_NONAME && af == AF_UNSPEC) {
1106 /* On Tru64 V5.1, numeric-to-addr conversion fails
1107 if no address family is given. Assume IPv4 for now.*/
1108 hints.ai_family = AF_INET;
1109 error = getaddrinfo(name, NULL, &hints, &res);
1110 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 Py_END_ALLOW_THREADS
1113 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1114 if (error) {
1115 set_gaierror(error);
1116 return -1;
1117 }
1118 if (res->ai_addrlen < addr_ret_size)
1119 addr_ret_size = res->ai_addrlen;
1120 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1121 freeaddrinfo(res);
1122 switch (addr_ret->sa_family) {
1123 case AF_INET:
1124 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001125#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case AF_INET6:
1127 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 return -1;
1132 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001133}
1134
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136/* Create a string object representing an IP address.
1137 This is always a string of the form 'dd.dd.dd.dd' (with variable
1138 size numbers). */
1139
Guido van Rossum73624e91994-10-10 17:59:00 +00001140static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001141makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 char buf[NI_MAXHOST];
1144 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1147 NI_NUMERICHOST);
1148 if (error) {
1149 set_gaierror(error);
1150 return NULL;
1151 }
1152 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153}
1154
1155
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156#ifdef USE_BLUETOOTH
1157/* Convert a string representation of a Bluetooth address into a numeric
1158 address. Returns the length (6), or raises an exception and returns -1 if
1159 an error occurred. */
1160
1161static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001162setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 unsigned int b0, b1, b2, b3, b4, b5;
1165 char ch;
1166 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1169 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1170 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1171 bdaddr->b[0] = b0;
1172 bdaddr->b[1] = b1;
1173 bdaddr->b[2] = b2;
1174 bdaddr->b[3] = b3;
1175 bdaddr->b[4] = b4;
1176 bdaddr->b[5] = b5;
1177 return 6;
1178 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001179 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return -1;
1181 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001182}
1183
1184/* Create a string representation of the Bluetooth address. This is always a
1185 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1186 value (zero padded if necessary). */
1187
1188static PyObject *
1189makebdaddr(bdaddr_t *bdaddr)
1190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1194 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1195 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1196 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001197}
1198#endif
1199
1200
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201/* Create an object representing the given socket address,
1202 suitable for passing it back to bind(), connect() etc.
1203 The family field of the sockaddr structure is inspected
1204 to determine what kind of address it really is. */
1205
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001207static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001208makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (addrlen == 0) {
1211 /* No address -- may be recvfrom() from known socket */
1212 Py_INCREF(Py_None);
1213 return Py_None;
1214 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 case AF_INET:
1219 {
1220 struct sockaddr_in *a;
1221 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1222 PyObject *ret = NULL;
1223 if (addrobj) {
1224 a = (struct sockaddr_in *)addr;
1225 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1226 Py_DECREF(addrobj);
1227 }
1228 return ret;
1229 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001231#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 case AF_UNIX:
1233 {
1234 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001235#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1237 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001238 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 }
1240 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001241#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 {
1243 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001244 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 }
1246 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001247#endif /* AF_UNIX */
1248
Martin v. Löwis11017b12006-01-14 18:12:57 +00001249#if defined(AF_NETLINK)
1250 case AF_NETLINK:
1251 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1253 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001254 }
1255#endif /* AF_NETLINK */
1256
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001257#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case AF_INET6:
1259 {
1260 struct sockaddr_in6 *a;
1261 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1262 PyObject *ret = NULL;
1263 if (addrobj) {
1264 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001265 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 addrobj,
1267 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001268 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 a->sin6_scope_id);
1270 Py_DECREF(addrobj);
1271 }
1272 return ret;
1273 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001274#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001275
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 case AF_BLUETOOTH:
1278 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 case BTPROTO_L2CAP:
1281 {
1282 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1283 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1284 PyObject *ret = NULL;
1285 if (addrobj) {
1286 ret = Py_BuildValue("Oi",
1287 addrobj,
1288 _BT_L2_MEMB(a, psm));
1289 Py_DECREF(addrobj);
1290 }
1291 return ret;
1292 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case BTPROTO_RFCOMM:
1295 {
1296 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1297 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1298 PyObject *ret = NULL;
1299 if (addrobj) {
1300 ret = Py_BuildValue("Oi",
1301 addrobj,
1302 _BT_RC_MEMB(a, channel));
1303 Py_DECREF(addrobj);
1304 }
1305 return ret;
1306 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case BTPROTO_HCI:
1309 {
1310 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001311#if defined(__NetBSD__) || defined(__DragonFly__)
1312 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 PyObject *ret = NULL;
1315 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1316 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001319
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001320#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case BTPROTO_SCO:
1322 {
1323 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1324 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1325 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001326#endif
1327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 default:
1329 PyErr_SetString(PyExc_ValueError,
1330 "Unknown Bluetooth protocol");
1331 return NULL;
1332 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001333#endif
1334
Antoine Pitroub156a462010-10-27 20:13:57 +00001335#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_PACKET:
1337 {
1338 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1339 char *ifname = "";
1340 struct ifreq ifr;
1341 /* need to look up interface name give index */
1342 if (a->sll_ifindex) {
1343 ifr.ifr_ifindex = a->sll_ifindex;
1344 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1345 ifname = ifr.ifr_name;
1346 }
1347 return Py_BuildValue("shbhy#",
1348 ifname,
1349 ntohs(a->sll_protocol),
1350 a->sll_pkttype,
1351 a->sll_hatype,
1352 a->sll_addr,
1353 a->sll_halen);
1354 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001355#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001356
Christian Heimes043d6f62008-01-07 17:19:16 +00001357#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case AF_TIPC:
1359 {
1360 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1361 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1362 return Py_BuildValue("IIIII",
1363 a->addrtype,
1364 a->addr.nameseq.type,
1365 a->addr.nameseq.lower,
1366 a->addr.nameseq.upper,
1367 a->scope);
1368 } else if (a->addrtype == TIPC_ADDR_NAME) {
1369 return Py_BuildValue("IIIII",
1370 a->addrtype,
1371 a->addr.name.name.type,
1372 a->addr.name.name.instance,
1373 a->addr.name.name.instance,
1374 a->scope);
1375 } else if (a->addrtype == TIPC_ADDR_ID) {
1376 return Py_BuildValue("IIIII",
1377 a->addrtype,
1378 a->addr.id.node,
1379 a->addr.id.ref,
1380 0,
1381 a->scope);
1382 } else {
1383 PyErr_SetString(PyExc_ValueError,
1384 "Invalid address type");
1385 return NULL;
1386 }
1387 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001388#endif
1389
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001390#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001391 case AF_CAN:
1392 {
1393 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1394 char *ifname = "";
1395 struct ifreq ifr;
1396 /* need to look up interface name given index */
1397 if (a->can_ifindex) {
1398 ifr.ifr_ifindex = a->can_ifindex;
1399 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1400 ifname = ifr.ifr_name;
1401 }
1402
1403 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1404 ifname,
1405 a->can_family);
1406 }
1407#endif
1408
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001409#ifdef PF_SYSTEM
1410 case PF_SYSTEM:
1411 switch(proto) {
1412#ifdef SYSPROTO_CONTROL
1413 case SYSPROTO_CONTROL:
1414 {
1415 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1416 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1417 }
1418#endif
1419 default:
1420 PyErr_SetString(PyExc_ValueError,
1421 "Invalid address type");
1422 return 0;
1423 }
1424#endif
1425
Christian Heimesdffa3942016-09-05 23:54:41 +02001426#ifdef HAVE_SOCKADDR_ALG
1427 case AF_ALG:
1428 {
1429 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1430 return Py_BuildValue("s#s#HH",
1431 a->salg_type,
1432 strnlen((const char*)a->salg_type,
1433 sizeof(a->salg_type)),
1434 a->salg_name,
1435 strnlen((const char*)a->salg_name,
1436 sizeof(a->salg_name)),
1437 a->salg_feat,
1438 a->salg_mask);
1439 }
1440#endif
1441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 default:
1445 /* If we don't know the address family, don't raise an
1446 exception -- return it as an (int, bytes) tuple. */
1447 return Py_BuildValue("iy#",
1448 addr->sa_family,
1449 addr->sa_data,
1450 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001453}
1454
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1456 (in particular, numeric IP addresses). */
1457struct maybe_idna {
1458 PyObject *obj;
1459 char *buf;
1460};
1461
1462static void
1463idna_cleanup(struct maybe_idna *data)
1464{
1465 Py_CLEAR(data->obj);
1466}
1467
1468static int
1469idna_converter(PyObject *obj, struct maybe_idna *data)
1470{
1471 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001472 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001473 if (obj == NULL) {
1474 idna_cleanup(data);
1475 return 1;
1476 }
1477 data->obj = NULL;
1478 len = -1;
1479 if (PyBytes_Check(obj)) {
1480 data->buf = PyBytes_AsString(obj);
1481 len = PyBytes_Size(obj);
1482 }
1483 else if (PyByteArray_Check(obj)) {
1484 data->buf = PyByteArray_AsString(obj);
1485 len = PyByteArray_Size(obj);
1486 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001487 else if (PyUnicode_Check(obj)) {
1488 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1489 data->buf = PyUnicode_DATA(obj);
1490 len = PyUnicode_GET_LENGTH(obj);
1491 }
1492 else {
1493 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1494 if (!obj2) {
1495 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1496 return 0;
1497 }
1498 assert(PyBytes_Check(obj2));
1499 data->obj = obj2;
1500 data->buf = PyBytes_AS_STRING(obj2);
1501 len = PyBytes_GET_SIZE(obj2);
1502 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001503 }
1504 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001505 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1506 obj->ob_type->tp_name);
1507 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001508 }
1509 if (strlen(data->buf) != len) {
1510 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001511 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001512 return 0;
1513 }
1514 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001515}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001516
1517/* Parse a socket address argument according to the socket object's
1518 address family. Return 1 if the address was in the proper format,
1519 0 of not. The address is returned through addr_ret, its length
1520 through len_ret. */
1521
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001527
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001528#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case AF_UNIX:
1530 {
1531 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001532 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001533 int retval = 0;
1534
1535 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1536 allow embedded nulls on Linux. */
1537 if (PyUnicode_Check(args)) {
1538 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1539 return 0;
1540 }
1541 else
1542 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001543 if (!PyArg_Parse(args, "y*", &path)) {
1544 Py_DECREF(args);
1545 return retval;
1546 }
1547 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001550#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001551 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001554 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001556 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 }
1558 }
1559 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 {
1562 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001563 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001564 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001566 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001568 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 }
1570 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001571 memcpy(addr->sun_path, path.buf, path.len);
1572 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001573 retval = 1;
1574 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001575 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001576 Py_DECREF(args);
1577 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001579#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580
Martin v. Löwis11017b12006-01-14 18:12:57 +00001581#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 case AF_NETLINK:
1583 {
1584 struct sockaddr_nl* addr;
1585 int pid, groups;
1586 addr = (struct sockaddr_nl *)addr_ret;
1587 if (!PyTuple_Check(args)) {
1588 PyErr_Format(
1589 PyExc_TypeError,
1590 "getsockaddrarg: "
1591 "AF_NETLINK address must be tuple, not %.500s",
1592 Py_TYPE(args)->tp_name);
1593 return 0;
1594 }
1595 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1596 return 0;
1597 addr->nl_family = AF_NETLINK;
1598 addr->nl_pid = pid;
1599 addr->nl_groups = groups;
1600 *len_ret = sizeof(*addr);
1601 return 1;
1602 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001603#endif
1604
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001605#ifdef AF_RDS
1606 case AF_RDS:
1607 /* RDS sockets use sockaddr_in: fall-through */
1608#endif
1609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 case AF_INET:
1611 {
1612 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001613 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 int port, result;
1615 if (!PyTuple_Check(args)) {
1616 PyErr_Format(
1617 PyExc_TypeError,
1618 "getsockaddrarg: "
1619 "AF_INET address must be tuple, not %.500s",
1620 Py_TYPE(args)->tp_name);
1621 return 0;
1622 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1624 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 return 0;
1626 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001627 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001629 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (result < 0)
1631 return 0;
1632 if (port < 0 || port > 0xffff) {
1633 PyErr_SetString(
1634 PyExc_OverflowError,
1635 "getsockaddrarg: port must be 0-65535.");
1636 return 0;
1637 }
1638 addr->sin_family = AF_INET;
1639 addr->sin_port = htons((short)port);
1640 *len_ret = sizeof *addr;
1641 return 1;
1642 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001644#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 case AF_INET6:
1646 {
1647 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001648 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001649 int port, result;
1650 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 flowinfo = scope_id = 0;
1652 if (!PyTuple_Check(args)) {
1653 PyErr_Format(
1654 PyExc_TypeError,
1655 "getsockaddrarg: "
1656 "AF_INET6 address must be tuple, not %.500s",
1657 Py_TYPE(args)->tp_name);
1658 return 0;
1659 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001660 if (!PyArg_ParseTuple(args, "O&i|II",
1661 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 &scope_id)) {
1663 return 0;
1664 }
1665 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001666 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001668 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (result < 0)
1670 return 0;
1671 if (port < 0 || port > 0xffff) {
1672 PyErr_SetString(
1673 PyExc_OverflowError,
1674 "getsockaddrarg: port must be 0-65535.");
1675 return 0;
1676 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001677 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001678 PyErr_SetString(
1679 PyExc_OverflowError,
1680 "getsockaddrarg: flowinfo must be 0-1048575.");
1681 return 0;
1682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 addr->sin6_family = s->sock_family;
1684 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001685 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 addr->sin6_scope_id = scope_id;
1687 *len_ret = sizeof *addr;
1688 return 1;
1689 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001690#endif
1691
Hye-Shik Chang81268602004-02-02 06:05:24 +00001692#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 case AF_BLUETOOTH:
1694 {
1695 switch (s->sock_proto) {
1696 case BTPROTO_L2CAP:
1697 {
1698 struct sockaddr_l2 *addr;
1699 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 addr = (struct sockaddr_l2 *)addr_ret;
1702 memset(addr, 0, sizeof(struct sockaddr_l2));
1703 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1704 if (!PyArg_ParseTuple(args, "si", &straddr,
1705 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001706 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 "wrong format");
1708 return 0;
1709 }
1710 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1711 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 *len_ret = sizeof *addr;
1714 return 1;
1715 }
1716 case BTPROTO_RFCOMM:
1717 {
1718 struct sockaddr_rc *addr;
1719 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 addr = (struct sockaddr_rc *)addr_ret;
1722 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1723 if (!PyArg_ParseTuple(args, "si", &straddr,
1724 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 "wrong format");
1727 return 0;
1728 }
1729 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1730 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 *len_ret = sizeof *addr;
1733 return 1;
1734 }
1735 case BTPROTO_HCI:
1736 {
1737 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001738#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001739 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001740
Alexander Belopolskye239d232010-12-08 23:31:48 +00001741 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001742 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001743 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001744 "wrong format");
1745 return 0;
1746 }
1747 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1748 return 0;
1749#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1751 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001752 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 "wrong format");
1754 return 0;
1755 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 *len_ret = sizeof *addr;
1758 return 1;
1759 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001760#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 case BTPROTO_SCO:
1762 {
1763 struct sockaddr_sco *addr;
1764 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 addr = (struct sockaddr_sco *)addr_ret;
1767 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1768 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001769 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 "wrong format");
1771 return 0;
1772 }
1773 straddr = PyBytes_AS_STRING(args);
1774 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1775 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 *len_ret = sizeof *addr;
1778 return 1;
1779 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001782 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 0;
1784 }
1785 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001786#endif
1787
Antoine Pitroub156a462010-10-27 20:13:57 +00001788#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 case AF_PACKET:
1790 {
1791 struct sockaddr_ll* addr;
1792 struct ifreq ifr;
1793 char *interfaceName;
1794 int protoNumber;
1795 int hatype = 0;
1796 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001797 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 if (!PyTuple_Check(args)) {
1800 PyErr_Format(
1801 PyExc_TypeError,
1802 "getsockaddrarg: "
1803 "AF_PACKET address must be tuple, not %.500s",
1804 Py_TYPE(args)->tp_name);
1805 return 0;
1806 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001807 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001809 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 return 0;
1811 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1812 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1813 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1814 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 return 0;
1817 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 if (haddr.buf && haddr.len > 8) {
1819 PyErr_SetString(PyExc_ValueError,
1820 "Hardware address must be 8 bytes or less");
1821 PyBuffer_Release(&haddr);
1822 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 }
1824 if (protoNumber < 0 || protoNumber > 0xffff) {
1825 PyErr_SetString(
1826 PyExc_OverflowError,
1827 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 return 0;
1830 }
1831 addr = (struct sockaddr_ll*)addr_ret;
1832 addr->sll_family = AF_PACKET;
1833 addr->sll_protocol = htons((short)protoNumber);
1834 addr->sll_ifindex = ifr.ifr_ifindex;
1835 addr->sll_pkttype = pkttype;
1836 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001837 if (haddr.buf) {
1838 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1839 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001841 else
1842 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001844 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 return 1;
1846 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001847#endif
1848
Christian Heimes043d6f62008-01-07 17:19:16 +00001849#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 case AF_TIPC:
1851 {
1852 unsigned int atype, v1, v2, v3;
1853 unsigned int scope = TIPC_CLUSTER_SCOPE;
1854 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (!PyTuple_Check(args)) {
1857 PyErr_Format(
1858 PyExc_TypeError,
1859 "getsockaddrarg: "
1860 "AF_TIPC address must be tuple, not %.500s",
1861 Py_TYPE(args)->tp_name);
1862 return 0;
1863 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 if (!PyArg_ParseTuple(args,
1866 "IIII|I;Invalid TIPC address format",
1867 &atype, &v1, &v2, &v3, &scope))
1868 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 addr = (struct sockaddr_tipc *) addr_ret;
1871 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 addr->family = AF_TIPC;
1874 addr->scope = scope;
1875 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (atype == TIPC_ADDR_NAMESEQ) {
1878 addr->addr.nameseq.type = v1;
1879 addr->addr.nameseq.lower = v2;
1880 addr->addr.nameseq.upper = v3;
1881 } else if (atype == TIPC_ADDR_NAME) {
1882 addr->addr.name.name.type = v1;
1883 addr->addr.name.name.instance = v2;
1884 } else if (atype == TIPC_ADDR_ID) {
1885 addr->addr.id.node = v1;
1886 addr->addr.id.ref = v2;
1887 } else {
1888 /* Shouldn't happen */
1889 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1890 return 0;
1891 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return 1;
1896 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001897#endif
1898
Vinay Sajiped6783f2014-03-21 11:44:32 +00001899#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001900 case AF_CAN:
1901 switch (s->sock_proto) {
1902 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001903 /* fall-through */
1904 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001905 {
1906 struct sockaddr_can *addr;
1907 PyObject *interfaceName;
1908 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001909 Py_ssize_t len;
1910
Benjamin Peterson18b71912013-05-16 15:29:44 -05001911 addr = (struct sockaddr_can *)addr_ret;
1912
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1914 &interfaceName))
1915 return 0;
1916
1917 len = PyBytes_GET_SIZE(interfaceName);
1918
1919 if (len == 0) {
1920 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001921 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001922 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1923 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1925 s->errorhandler();
1926 Py_DECREF(interfaceName);
1927 return 0;
1928 }
1929 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001930 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001931 "AF_CAN interface name too long");
1932 Py_DECREF(interfaceName);
1933 return 0;
1934 }
1935
1936 addr->can_family = AF_CAN;
1937 addr->can_ifindex = ifr.ifr_ifindex;
1938
1939 *len_ret = sizeof(*addr);
1940 Py_DECREF(interfaceName);
1941 return 1;
1942 }
1943 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001944 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001945 "getsockaddrarg: unsupported CAN protocol");
1946 return 0;
1947 }
1948#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001949
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001950#ifdef PF_SYSTEM
1951 case PF_SYSTEM:
1952 switch (s->sock_proto) {
1953#ifdef SYSPROTO_CONTROL
1954 case SYSPROTO_CONTROL:
1955 {
1956 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001957
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001958 addr = (struct sockaddr_ctl *)addr_ret;
1959 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001960 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001961
1962 if (PyUnicode_Check(args)) {
1963 struct ctl_info info;
1964 PyObject *ctl_name;
1965
1966 if (!PyArg_Parse(args, "O&",
1967 PyUnicode_FSConverter, &ctl_name)) {
1968 return 0;
1969 }
1970
Victor Stinnerf50e1872015-03-20 11:32:24 +01001971 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001972 PyErr_SetString(PyExc_ValueError,
1973 "provided string is too long");
1974 Py_DECREF(ctl_name);
1975 return 0;
1976 }
1977 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1978 sizeof(info.ctl_name));
1979 Py_DECREF(ctl_name);
1980
1981 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1982 PyErr_SetString(PyExc_OSError,
1983 "cannot find kernel control with provided name");
1984 return 0;
1985 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001986
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001987 addr->sc_id = info.ctl_id;
1988 addr->sc_unit = 0;
1989 } else if (!PyArg_ParseTuple(args, "II",
1990 &(addr->sc_id), &(addr->sc_unit))) {
1991 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1992 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001993
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001994 return 0;
1995 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001996
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001997 *len_ret = sizeof(*addr);
1998 return 1;
1999 }
2000#endif
2001 default:
2002 PyErr_SetString(PyExc_OSError,
2003 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2004 return 0;
2005 }
2006#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002007#ifdef HAVE_SOCKADDR_ALG
2008 case AF_ALG:
2009 {
2010 struct sockaddr_alg *sa;
2011 char *type;
2012 char *name;
2013 sa = (struct sockaddr_alg *)addr_ret;
2014
2015 memset(sa, 0, sizeof(*sa));
2016 sa->salg_family = AF_ALG;
2017
2018 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2019 &type, &name, &sa->salg_feat, &sa->salg_mask))
2020 return 0;
2021 /* sockaddr_alg has fixed-sized char arrays for type and name */
2022 if (strlen(type) > sizeof(sa->salg_type)) {
2023 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2024 return 0;
2025 }
2026 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2027 if (strlen(name) > sizeof(sa->salg_name)) {
2028 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2029 return 0;
2030 }
2031 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2032
2033 *len_ret = sizeof(*sa);
2034 return 1;
2035 }
2036#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002041 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002045}
2046
Guido van Rossum30a685f1991-06-27 15:51:29 +00002047
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002049 Return 1 if the family is known, 0 otherwise. The length is returned
2050 through len_ret. */
2051
2052static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002053getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002056
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002057#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 case AF_UNIX:
2059 {
2060 *len_ret = sizeof (struct sockaddr_un);
2061 return 1;
2062 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002063#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002064
Martin v. Löwis11017b12006-01-14 18:12:57 +00002065#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002066 case AF_NETLINK:
2067 {
2068 *len_ret = sizeof (struct sockaddr_nl);
2069 return 1;
2070 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002071#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002072
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002073#ifdef AF_RDS
2074 case AF_RDS:
2075 /* RDS sockets use sockaddr_in: fall-through */
2076#endif
2077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 case AF_INET:
2079 {
2080 *len_ret = sizeof (struct sockaddr_in);
2081 return 1;
2082 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002083
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002084#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 case AF_INET6:
2086 {
2087 *len_ret = sizeof (struct sockaddr_in6);
2088 return 1;
2089 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002090#endif
2091
Hye-Shik Chang81268602004-02-02 06:05:24 +00002092#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 case AF_BLUETOOTH:
2094 {
2095 switch(s->sock_proto)
2096 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 case BTPROTO_L2CAP:
2099 *len_ret = sizeof (struct sockaddr_l2);
2100 return 1;
2101 case BTPROTO_RFCOMM:
2102 *len_ret = sizeof (struct sockaddr_rc);
2103 return 1;
2104 case BTPROTO_HCI:
2105 *len_ret = sizeof (struct sockaddr_hci);
2106 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002107#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 case BTPROTO_SCO:
2109 *len_ret = sizeof (struct sockaddr_sco);
2110 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002113 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 "unknown BT protocol");
2115 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 }
2118 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002119#endif
2120
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002121#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 case AF_PACKET:
2123 {
2124 *len_ret = sizeof (struct sockaddr_ll);
2125 return 1;
2126 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002127#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002128
Christian Heimes043d6f62008-01-07 17:19:16 +00002129#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 case AF_TIPC:
2131 {
2132 *len_ret = sizeof (struct sockaddr_tipc);
2133 return 1;
2134 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002135#endif
2136
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002137#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002138 case AF_CAN:
2139 {
2140 *len_ret = sizeof (struct sockaddr_can);
2141 return 1;
2142 }
2143#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002144
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002145#ifdef PF_SYSTEM
2146 case PF_SYSTEM:
2147 switch(s->sock_proto) {
2148#ifdef SYSPROTO_CONTROL
2149 case SYSPROTO_CONTROL:
2150 *len_ret = sizeof (struct sockaddr_ctl);
2151 return 1;
2152#endif
2153 default:
2154 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2155 "unknown PF_SYSTEM protocol");
2156 return 0;
2157 }
2158#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002159#ifdef HAVE_SOCKADDR_ALG
2160 case AF_ALG:
2161 {
2162 *len_ret = sizeof (struct sockaddr_alg);
2163 return 1;
2164 }
2165#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002170 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002174}
2175
2176
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002177/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2178 Currently, these methods are only compiled if the RFC 2292/3542
2179 CMSG_LEN() macro is available. Older systems seem to have used
2180 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2181 it may be possible to define CMSG_LEN() that way if it's not
2182 provided. Some architectures might need extra padding after the
2183 cmsghdr, however, and CMSG_LEN() would have to take account of
2184 this. */
2185#ifdef CMSG_LEN
2186/* If length is in range, set *result to CMSG_LEN(length) and return
2187 true; otherwise, return false. */
2188static int
2189get_CMSG_LEN(size_t length, size_t *result)
2190{
2191 size_t tmp;
2192
2193 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2194 return 0;
2195 tmp = CMSG_LEN(length);
2196 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2197 return 0;
2198 *result = tmp;
2199 return 1;
2200}
2201
2202#ifdef CMSG_SPACE
2203/* If length is in range, set *result to CMSG_SPACE(length) and return
2204 true; otherwise, return false. */
2205static int
2206get_CMSG_SPACE(size_t length, size_t *result)
2207{
2208 size_t tmp;
2209
2210 /* Use CMSG_SPACE(1) here in order to take account of the padding
2211 necessary before *and* after the data. */
2212 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2213 return 0;
2214 tmp = CMSG_SPACE(length);
2215 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2216 return 0;
2217 *result = tmp;
2218 return 1;
2219}
2220#endif
2221
2222/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2223 pointer in msg->msg_control with at least "space" bytes after it,
2224 and its cmsg_len member inside the buffer. */
2225static int
2226cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2227{
2228 size_t cmsg_offset;
2229 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2230 sizeof(cmsgh->cmsg_len));
2231
Charles-François Natali466517d2011-08-28 18:23:43 +02002232 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002233 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002234 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002235 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2236 annoying under OS X as it's unsigned there and so it triggers a
2237 tautological comparison warning under Clang when compared against 0.
2238 Since the check is valid on other platforms, silence the warning under
2239 Clang. */
2240 #ifdef __clang__
2241 #pragma clang diagnostic push
2242 #pragma clang diagnostic ignored "-Wtautological-compare"
2243 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002244 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002245 #pragma GCC diagnostic push
2246 #pragma GCC diagnostic ignored "-Wtype-limits"
2247 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002248 if (msg->msg_controllen < 0)
2249 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002250 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002251 #pragma GCC diagnostic pop
2252 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002253 #ifdef __clang__
2254 #pragma clang diagnostic pop
2255 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002256 if (space < cmsg_len_end)
2257 space = cmsg_len_end;
2258 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2259 return (cmsg_offset <= (size_t)-1 - space &&
2260 cmsg_offset + space <= msg->msg_controllen);
2261}
2262
2263/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2264 *space to number of bytes following it in the buffer and return
2265 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2266 msg->msg_controllen are valid. */
2267static int
2268get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2269{
2270 size_t data_offset;
2271 char *data_ptr;
2272
2273 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2274 return 0;
2275 data_offset = data_ptr - (char *)msg->msg_control;
2276 if (data_offset > msg->msg_controllen)
2277 return 0;
2278 *space = msg->msg_controllen - data_offset;
2279 return 1;
2280}
2281
2282/* If cmsgh is invalid or not contained in the buffer pointed to by
2283 msg->msg_control, return -1. If cmsgh is valid and its associated
2284 data is entirely contained in the buffer, set *data_len to the
2285 length of the associated data and return 0. If only part of the
2286 associated data is contained in the buffer but cmsgh is otherwise
2287 valid, set *data_len to the length contained in the buffer and
2288 return 1. */
2289static int
2290get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2291{
2292 size_t space, cmsg_data_len;
2293
2294 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2295 cmsgh->cmsg_len < CMSG_LEN(0))
2296 return -1;
2297 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2298 if (!get_cmsg_data_space(msg, cmsgh, &space))
2299 return -1;
2300 if (space >= cmsg_data_len) {
2301 *data_len = cmsg_data_len;
2302 return 0;
2303 }
2304 *data_len = space;
2305 return 1;
2306}
2307#endif /* CMSG_LEN */
2308
2309
Victor Stinner31bf2d52015-04-01 21:57:09 +02002310struct sock_accept {
2311 socklen_t *addrlen;
2312 sock_addr_t *addrbuf;
2313 SOCKET_T result;
2314};
2315
2316#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2317/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2318static int accept4_works = -1;
2319#endif
2320
2321static int
2322sock_accept_impl(PySocketSockObject *s, void *data)
2323{
2324 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002325 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2326 socklen_t *paddrlen = ctx->addrlen;
2327#ifdef HAVE_SOCKADDR_ALG
2328 /* AF_ALG does not support accept() with addr and raises
2329 * ECONNABORTED instead. */
2330 if (s->sock_family == AF_ALG) {
2331 addr = NULL;
2332 paddrlen = NULL;
2333 *ctx->addrlen = 0;
2334 }
2335#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002336
2337#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2338 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002339 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002340 SOCK_CLOEXEC);
2341 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2342 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2343 accept4_works = (errno != ENOSYS);
2344 }
2345 }
2346 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002347 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002348#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002349 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002350#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002351
2352#ifdef MS_WINDOWS
2353 return (ctx->result != INVALID_SOCKET);
2354#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002355 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002356#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002357}
2358
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002359/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002360
Guido van Rossum73624e91994-10-10 17:59:00 +00002361static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002362sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002365 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 socklen_t addrlen;
2367 PyObject *sock = NULL;
2368 PyObject *addr = NULL;
2369 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002370 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (!getsockaddrlen(s, &addrlen))
2373 return NULL;
2374 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 if (!IS_SELECTABLE(s))
2377 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002378
Victor Stinner31bf2d52015-04-01 21:57:09 +02002379 ctx.addrlen = &addrlen;
2380 ctx.addrbuf = &addrbuf;
2381 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002383 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002384
Victor Stinnerdaf45552013-08-28 00:53:59 +02002385#ifdef MS_WINDOWS
2386 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2387 PyErr_SetFromWindowsErr(0);
2388 SOCKETCLOSE(newfd);
2389 goto finally;
2390 }
2391#else
2392
2393#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2394 if (!accept4_works)
2395#endif
2396 {
2397 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2398 SOCKETCLOSE(newfd);
2399 goto finally;
2400 }
2401 }
2402#endif
2403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 sock = PyLong_FromSocket_t(newfd);
2405 if (sock == NULL) {
2406 SOCKETCLOSE(newfd);
2407 goto finally;
2408 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2411 addrlen, s->sock_proto);
2412 if (addr == NULL)
2413 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002416
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 Py_XDECREF(sock);
2419 Py_XDECREF(addr);
2420 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002421}
2422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002423PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002424"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002426Wait for an incoming connection. Return a new socket file descriptor\n\
2427representing the connection, and the address of the client.\n\
2428For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002429
Guido van Rossum11ba0942002-06-13 15:07:44 +00002430/* s.setblocking(flag) method. Argument:
2431 False -- non-blocking mode; same as settimeout(0)
2432 True -- blocking mode; same as settimeout(None)
2433*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002434
Guido van Rossum73624e91994-10-10 17:59:00 +00002435static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002436sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002437{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002438 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 block = PyLong_AsLong(arg);
2441 if (block == -1 && PyErr_Occurred())
2442 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002443
Victor Stinner9001d802015-04-06 23:06:01 +02002444 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002445 if (internal_setblocking(s, block) == -1) {
2446 return NULL;
2447 }
2448 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002449}
Guido van Rossume4485b01994-09-07 14:32:49 +00002450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002451PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002452"setblocking(flag)\n\
2453\n\
2454Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002455setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002456setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002457
Victor Stinner71694d52015-03-28 01:18:54 +01002458static int
2459socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2460{
2461#ifdef MS_WINDOWS
2462 struct timeval tv;
2463#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002464#ifndef HAVE_POLL
2465 _PyTime_t ms;
2466#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002467 int overflow = 0;
2468
2469 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002470 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002471 return 0;
2472 }
2473
Victor Stinner869e1772015-03-30 03:49:14 +02002474 if (_PyTime_FromSecondsObject(timeout,
2475 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002476 return -1;
2477
2478 if (*timeout < 0) {
2479 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2480 return -1;
2481 }
2482
2483#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002484 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002485#endif
2486#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002487 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2488 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002489#endif
2490 if (overflow) {
2491 PyErr_SetString(PyExc_OverflowError,
2492 "timeout doesn't fit into C timeval");
2493 return -1;
2494 }
2495
2496 return 0;
2497}
2498
Guido van Rossum11ba0942002-06-13 15:07:44 +00002499/* s.settimeout(timeout) method. Argument:
2500 None -- no timeout, blocking mode; same as setblocking(True)
2501 0.0 -- non-blocking mode; same as setblocking(False)
2502 > 0 -- timeout mode; operations time out after timeout seconds
2503 < 0 -- illegal; raises an exception
2504*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002506sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002507{
Victor Stinner71694d52015-03-28 01:18:54 +01002508 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Victor Stinner71694d52015-03-28 01:18:54 +01002510 if (socket_parse_timeout(&timeout, arg) < 0)
2511 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002514 if (internal_setblocking(s, timeout < 0) == -1) {
2515 return NULL;
2516 }
2517 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518}
2519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002521"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002522\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002523Set a timeout on socket operations. 'timeout' can be a float,\n\
2524giving in seconds, or None. Setting a timeout of None disables\n\
2525the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002526Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002527
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002528/* s.gettimeout() method.
2529 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002530static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002531sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002532{
Victor Stinner71694d52015-03-28 01:18:54 +01002533 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 Py_INCREF(Py_None);
2535 return Py_None;
2536 }
Victor Stinner71694d52015-03-28 01:18:54 +01002537 else {
2538 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2539 return PyFloat_FromDouble(seconds);
2540 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002541}
2542
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002544"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002545\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002546Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002547operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002549
Guido van Rossumaee08791992-09-08 09:05:33 +00002550/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002551 With an integer third argument, sets an integer optval with optlen=4.
2552 With None as third argument and an integer fourth argument, set
2553 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002554 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002555 use optional built-in module 'struct' to encode the string.
2556*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002557
Guido van Rossum73624e91994-10-10 17:59:00 +00002558static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002559sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 int level;
2562 int optname;
2563 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002564 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002566 unsigned int optlen;
2567 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002568
Christian Heimesdffa3942016-09-05 23:54:41 +02002569 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 if (PyArg_ParseTuple(args, "iii:setsockopt",
2571 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002572 res = setsockopt(s->sock_fd, level, optname,
2573 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002574 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002576
2577 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002578 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002579 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2580 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2581 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002582 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002583 NULL, (socklen_t)optlen);
2584 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002586
2587 PyErr_Clear();
2588 /* setsockopt(level, opt, buffer) */
2589 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2590 &level, &optname, &optval))
2591 return NULL;
2592
2593#ifdef MS_WINDOWS
2594 if (optval.len > INT_MAX) {
2595 PyBuffer_Release(&optval);
2596 PyErr_Format(PyExc_OverflowError,
2597 "socket option is larger than %i bytes",
2598 INT_MAX);
2599 return NULL;
2600 }
2601 res = setsockopt(s->sock_fd, level, optname,
2602 optval.buf, (int)optval.len);
2603#else
2604 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2605#endif
2606 PyBuffer_Release(&optval);
2607
2608done:
Victor Stinnercc739322016-03-23 21:35:29 +01002609 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002611 }
2612
2613 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002614}
2615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002616PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002617"setsockopt(level, option, value: int)\n\
2618setsockopt(level, option, value: buffer)\n\
2619setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002620\n\
2621Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002622The value argument can either be an integer, a string buffer, or \n\
2623None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002624
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002625
Guido van Rossumaee08791992-09-08 09:05:33 +00002626/* s.getsockopt() method.
2627 With two arguments, retrieves an integer option.
2628 With a third integer argument, retrieves a string buffer of that size;
2629 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002630
Guido van Rossum73624e91994-10-10 17:59:00 +00002631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002632sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 int level;
2635 int optname;
2636 int res;
2637 PyObject *buf;
2638 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2641 &level, &optname, &buflen))
2642 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (buflen == 0) {
2645 int flag = 0;
2646 socklen_t flagsize = sizeof flag;
2647 res = getsockopt(s->sock_fd, level, optname,
2648 (void *)&flag, &flagsize);
2649 if (res < 0)
2650 return s->errorhandler();
2651 return PyLong_FromLong(flag);
2652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002654 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 "getsockopt buflen out of range");
2656 return NULL;
2657 }
2658 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2659 if (buf == NULL)
2660 return NULL;
2661 res = getsockopt(s->sock_fd, level, optname,
2662 (void *)PyBytes_AS_STRING(buf), &buflen);
2663 if (res < 0) {
2664 Py_DECREF(buf);
2665 return s->errorhandler();
2666 }
2667 _PyBytes_Resize(&buf, buflen);
2668 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002669}
2670
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002671PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002672"getsockopt(level, option[, buffersize]) -> value\n\
2673\n\
2674Get a socket option. See the Unix manual for level and option.\n\
2675If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002677
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002678
Fred Drake728819a2000-07-01 03:40:12 +00002679/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002680
Guido van Rossum73624e91994-10-10 17:59:00 +00002681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 sock_addr_t addrbuf;
2685 int addrlen;
2686 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2689 return NULL;
2690 Py_BEGIN_ALLOW_THREADS
2691 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2692 Py_END_ALLOW_THREADS
2693 if (res < 0)
2694 return s->errorhandler();
2695 Py_INCREF(Py_None);
2696 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002697}
2698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700"bind(address)\n\
2701\n\
2702Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002703pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002704sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002705
Guido van Rossum30a685f1991-06-27 15:51:29 +00002706
2707/* s.close() method.
2708 Set the file descriptor to -1 so operations tried subsequently
2709 will surely fail. */
2710
Guido van Rossum73624e91994-10-10 17:59:00 +00002711static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002712sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002715 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002716
Victor Stinner19a8e842016-03-21 16:36:48 +01002717 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002718 if (fd != INVALID_SOCKET) {
2719 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002720
2721 /* We do not want to retry upon EINTR: see
2722 http://lwn.net/Articles/576478/ and
2723 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2724 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002726 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002728 if (res < 0) {
2729 return s->errorhandler();
2730 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 }
2732 Py_INCREF(Py_None);
2733 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002734}
2735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002736PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002737"close()\n\
2738\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002739Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002740
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002741static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002742sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002743{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002744 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002745 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002746 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002747}
2748
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002749PyDoc_STRVAR(detach_doc,
2750"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002751\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002752Close the socket object without closing the underlying file descriptor.\n\
2753The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002754can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002755
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002756static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002757sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002758{
Victor Stinner81c41db2015-04-02 11:50:57 +02002759 int err;
2760 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002761
Victor Stinner81c41db2015-04-02 11:50:57 +02002762 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2763 /* getsockopt() failed */
2764 return 0;
2765 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002766
Victor Stinner81c41db2015-04-02 11:50:57 +02002767 if (err == EISCONN)
2768 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002769 if (err != 0) {
2770 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2771 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002772 return 0;
2773 }
2774 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002775}
2776
2777static int
2778internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2779 int raise)
2780{
2781 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002782
2783 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002785 Py_END_ALLOW_THREADS
2786
Victor Stinner70a46f62015-03-31 22:03:59 +02002787 if (!res) {
2788 /* connect() succeeded, the socket is connected */
2789 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002791
Victor Stinner81c41db2015-04-02 11:50:57 +02002792 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002793
Victor Stinner81c41db2015-04-02 11:50:57 +02002794 /* save error, PyErr_CheckSignals() can replace it */
2795 err = GET_SOCK_ERROR;
2796 if (CHECK_ERRNO(EINTR)) {
2797 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002798 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002799
2800 /* Issue #23618: when connect() fails with EINTR, the connection is
2801 running asynchronously.
2802
2803 If the socket is blocking or has a timeout, wait until the
2804 connection completes, fails or timed out using select(), and then
2805 get the connection status using getsockopt(SO_ERROR).
2806
2807 If the socket is non-blocking, raise InterruptedError. The caller is
2808 responsible to wait until the connection completes, fails or timed
2809 out (it's the case in asyncio for example). */
2810 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2811 }
2812 else {
2813 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2814 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002815 }
2816
Victor Stinner81c41db2015-04-02 11:50:57 +02002817 if (!wait_connect) {
2818 if (raise) {
2819 /* restore error, maybe replaced by PyErr_CheckSignals() */
2820 SET_SOCK_ERROR(err);
2821 s->errorhandler();
2822 return -1;
2823 }
2824 else
2825 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002826 }
2827
Victor Stinner81c41db2015-04-02 11:50:57 +02002828 if (raise) {
2829 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002830 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2831 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002832 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002833 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002834 else {
2835 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002836 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2837 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002838 return err;
2839 }
2840 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002841}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002842
Fred Drake728819a2000-07-01 03:40:12 +00002843/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002844
Guido van Rossum73624e91994-10-10 17:59:00 +00002845static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 sock_addr_t addrbuf;
2849 int addrlen;
2850 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2853 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002854
Victor Stinner81c41db2015-04-02 11:50:57 +02002855 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002856 if (res < 0)
2857 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002858
Victor Stinneree699e92015-03-31 21:28:42 +02002859 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002860}
2861
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002862PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002863"connect(address)\n\
2864\n\
2865Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002866is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002867
Guido van Rossum30a685f1991-06-27 15:51:29 +00002868
Fred Drake728819a2000-07-01 03:40:12 +00002869/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002870
2871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002872sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 sock_addr_t addrbuf;
2875 int addrlen;
2876 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2879 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002880
Victor Stinner81c41db2015-04-02 11:50:57 +02002881 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002882 if (res < 0)
2883 return NULL;
2884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002886}
2887
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002888PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002889"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002890\n\
2891This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002892instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002893
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002894
Guido van Rossumed233a51992-06-23 09:07:03 +00002895/* s.fileno() method */
2896
Guido van Rossum73624e91994-10-10 17:59:00 +00002897static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002898sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002901}
2902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002903PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002904"fileno() -> integer\n\
2905\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002907
Guido van Rossumed233a51992-06-23 09:07:03 +00002908
Guido van Rossumc89705d1992-11-26 08:54:07 +00002909/* s.getsockname() method */
2910
Guido van Rossum73624e91994-10-10 17:59:00 +00002911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002912sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 sock_addr_t addrbuf;
2915 int res;
2916 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 if (!getsockaddrlen(s, &addrlen))
2919 return NULL;
2920 memset(&addrbuf, 0, addrlen);
2921 Py_BEGIN_ALLOW_THREADS
2922 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2923 Py_END_ALLOW_THREADS
2924 if (res < 0)
2925 return s->errorhandler();
2926 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2927 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002928}
2929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002931"getsockname() -> address info\n\
2932\n\
2933Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002935
Guido van Rossumc89705d1992-11-26 08:54:07 +00002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002938/* s.getpeername() method */
2939
Guido van Rossum73624e91994-10-10 17:59:00 +00002940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002941sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 sock_addr_t addrbuf;
2944 int res;
2945 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 if (!getsockaddrlen(s, &addrlen))
2948 return NULL;
2949 memset(&addrbuf, 0, addrlen);
2950 Py_BEGIN_ALLOW_THREADS
2951 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2952 Py_END_ALLOW_THREADS
2953 if (res < 0)
2954 return s->errorhandler();
2955 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2956 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002957}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002959PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002960"getpeername() -> address info\n\
2961\n\
2962Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002963info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002964
Guido van Rossumb6775db1994-08-01 11:34:53 +00002965#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002966
2967
Guido van Rossum30a685f1991-06-27 15:51:29 +00002968/* s.listen(n) method */
2969
Guido van Rossum73624e91994-10-10 17:59:00 +00002970static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002971sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002972{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002973 /* We try to choose a default backlog high enough to avoid connection drops
2974 * for common workloads, yet not too high to limit resource usage. */
2975 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002977
Charles-François Natali644b8f52014-05-22 19:45:39 +01002978 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002982 /* To avoid problems on systems that don't allow a negative backlog
2983 * (which doesn't make sense anyway) we force a minimum value of 0. */
2984 if (backlog < 0)
2985 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 res = listen(s->sock_fd, backlog);
2987 Py_END_ALLOW_THREADS
2988 if (res < 0)
2989 return s->errorhandler();
2990 Py_INCREF(Py_None);
2991 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002992}
2993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002994PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002995"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002996\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002997Enable a server to accept connections. If backlog is specified, it must be\n\
2998at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002999unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003000connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003001
Victor Stinner31bf2d52015-04-01 21:57:09 +02003002struct sock_recv {
3003 char *cbuf;
3004 Py_ssize_t len;
3005 int flags;
3006 Py_ssize_t result;
3007};
3008
3009static int
3010sock_recv_impl(PySocketSockObject *s, void *data)
3011{
3012 struct sock_recv *ctx = data;
3013
3014#ifdef MS_WINDOWS
3015 if (ctx->len > INT_MAX)
3016 ctx->len = INT_MAX;
3017 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3018#else
3019 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3020#endif
3021 return (ctx->result >= 0);
3022}
3023
Guido van Rossum82a5c661998-07-07 20:45:43 +00003024
Thomas Wouters477c8d52006-05-27 19:21:47 +00003025/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003026 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003027 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003028 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003029 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003030 * also possible that we return a number of bytes smaller than the request
3031 * bytes.
3032 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003033
Antoine Pitrou19467d22010-08-17 19:33:30 +00003034static Py_ssize_t
3035sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003036{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003037 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 if (!IS_SELECTABLE(s)) {
3040 select_error();
3041 return -1;
3042 }
3043 if (len == 0) {
3044 /* If 0 bytes were requested, do nothing. */
3045 return 0;
3046 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003047
Victor Stinner31bf2d52015-04-01 21:57:09 +02003048 ctx.cbuf = cbuf;
3049 ctx.len = len;
3050 ctx.flags = flags;
3051 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003053
3054 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003055}
3056
Guido van Rossum48a680c2001-03-02 06:34:14 +00003057
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003058/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003059
Guido van Rossum73624e91994-10-10 17:59:00 +00003060static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003061sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003062{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003063 Py_ssize_t recvlen, outlen;
3064 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003066
Antoine Pitrou19467d22010-08-17 19:33:30 +00003067 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (recvlen < 0) {
3071 PyErr_SetString(PyExc_ValueError,
3072 "negative buffersize in recv");
3073 return NULL;
3074 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 /* Allocate a new string. */
3077 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3078 if (buf == NULL)
3079 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 /* Call the guts */
3082 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3083 if (outlen < 0) {
3084 /* An error occurred, release the string and return an
3085 error. */
3086 Py_DECREF(buf);
3087 return NULL;
3088 }
3089 if (outlen != recvlen) {
3090 /* We did not read as many bytes as we anticipated, resize the
3091 string if possible and be successful. */
3092 _PyBytes_Resize(&buf, outlen);
3093 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003096}
3097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003098PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003099"recv(buffersize[, flags]) -> data\n\
3100\n\
3101Receive up to buffersize bytes from the socket. For the optional flags\n\
3102argument, see the Unix manual. When no data is available, block until\n\
3103at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003104the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003105
Guido van Rossum30a685f1991-06-27 15:51:29 +00003106
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003107/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003108
Thomas Wouters477c8d52006-05-27 19:21:47 +00003109static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003110sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003113
Antoine Pitrou19467d22010-08-17 19:33:30 +00003114 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 Py_buffer pbuf;
3116 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003117 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003120 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 &pbuf, &recvlen, &flags))
3122 return NULL;
3123 buf = pbuf.buf;
3124 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 if (recvlen < 0) {
3127 PyBuffer_Release(&pbuf);
3128 PyErr_SetString(PyExc_ValueError,
3129 "negative buffersize in recv_into");
3130 return NULL;
3131 }
3132 if (recvlen == 0) {
3133 /* If nbytes was not specified, use the buffer's length */
3134 recvlen = buflen;
3135 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 /* Check if the buffer is large enough */
3138 if (buflen < recvlen) {
3139 PyBuffer_Release(&pbuf);
3140 PyErr_SetString(PyExc_ValueError,
3141 "buffer too small for requested bytes");
3142 return NULL;
3143 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 /* Call the guts */
3146 readlen = sock_recv_guts(s, buf, recvlen, flags);
3147 if (readlen < 0) {
3148 /* Return an error. */
3149 PyBuffer_Release(&pbuf);
3150 return NULL;
3151 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 PyBuffer_Release(&pbuf);
3154 /* Return the number of bytes read. Note that we do not do anything
3155 special here in the case that readlen < recvlen. */
3156 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003157}
3158
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003159PyDoc_STRVAR(recv_into_doc,
3160"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003161\n\
3162A version of recv() that stores its data into a buffer rather than creating \n\
3163a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3164is not specified (or 0), receive up to the size available in the given buffer.\n\
3165\n\
3166See recv() for documentation about the flags.");
3167
Victor Stinner31bf2d52015-04-01 21:57:09 +02003168struct sock_recvfrom {
3169 char* cbuf;
3170 Py_ssize_t len;
3171 int flags;
3172 socklen_t *addrlen;
3173 sock_addr_t *addrbuf;
3174 Py_ssize_t result;
3175};
3176
3177static int
3178sock_recvfrom_impl(PySocketSockObject *s, void *data)
3179{
3180 struct sock_recvfrom *ctx = data;
3181
3182 memset(ctx->addrbuf, 0, *ctx->addrlen);
3183
3184#ifdef MS_WINDOWS
3185 if (ctx->len > INT_MAX)
3186 ctx->len = INT_MAX;
3187 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3188 SAS2SA(ctx->addrbuf), ctx->addrlen);
3189#else
3190 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3191 SAS2SA(ctx->addrbuf), ctx->addrlen);
3192#endif
3193 return (ctx->result >= 0);
3194}
3195
Thomas Wouters477c8d52006-05-27 19:21:47 +00003196
3197/*
Christian Heimes99170a52007-12-19 02:07:34 +00003198 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3199 * into a char buffer. If you have any inc/def ref to do to the objects that
3200 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003201 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003202 * that it is also possible that we return a number of bytes smaller than the
3203 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003204 *
3205 * 'addr' is a return value for the address object. Note that you must decref
3206 * it yourself.
3207 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003208static Py_ssize_t
3209sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003214 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 if (!getsockaddrlen(s, &addrlen))
3219 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 if (!IS_SELECTABLE(s)) {
3222 select_error();
3223 return -1;
3224 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003225
Victor Stinner31bf2d52015-04-01 21:57:09 +02003226 ctx.cbuf = cbuf;
3227 ctx.len = len;
3228 ctx.flags = flags;
3229 ctx.addrbuf = &addrbuf;
3230 ctx.addrlen = &addrlen;
3231 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003233
Victor Stinner31bf2d52015-04-01 21:57:09 +02003234 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3235 s->sock_proto);
3236 if (*addr == NULL)
3237 return -1;
3238
3239 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003240}
3241
3242/* s.recvfrom(nbytes [,flags]) method */
3243
3244static PyObject *
3245sock_recvfrom(PySocketSockObject *s, PyObject *args)
3246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 PyObject *buf = NULL;
3248 PyObject *addr = NULL;
3249 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003250 int flags = 0;
3251 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003252
Antoine Pitrou19467d22010-08-17 19:33:30 +00003253 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 if (recvlen < 0) {
3257 PyErr_SetString(PyExc_ValueError,
3258 "negative buffersize in recvfrom");
3259 return NULL;
3260 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3263 if (buf == NULL)
3264 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3267 recvlen, flags, &addr);
3268 if (outlen < 0) {
3269 goto finally;
3270 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 if (outlen != recvlen) {
3273 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003274 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003276 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 goto finally;
3278 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003281
3282finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 Py_XDECREF(buf);
3284 Py_XDECREF(addr);
3285 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003286}
3287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003288PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003289"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3290\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003291Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003292
Thomas Wouters477c8d52006-05-27 19:21:47 +00003293
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003294/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003295
3296static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003297sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003300
Antoine Pitrou19467d22010-08-17 19:33:30 +00003301 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 Py_buffer pbuf;
3303 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003304 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003307
Antoine Pitrou19467d22010-08-17 19:33:30 +00003308 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 kwlist, &pbuf,
3310 &recvlen, &flags))
3311 return NULL;
3312 buf = pbuf.buf;
3313 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 if (recvlen < 0) {
3316 PyBuffer_Release(&pbuf);
3317 PyErr_SetString(PyExc_ValueError,
3318 "negative buffersize in recvfrom_into");
3319 return NULL;
3320 }
3321 if (recvlen == 0) {
3322 /* If nbytes was not specified, use the buffer's length */
3323 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003324 } else if (recvlen > buflen) {
3325 PyBuffer_Release(&pbuf);
3326 PyErr_SetString(PyExc_ValueError,
3327 "nbytes is greater than the length of the buffer");
3328 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3332 if (readlen < 0) {
3333 PyBuffer_Release(&pbuf);
3334 /* Return an error */
3335 Py_XDECREF(addr);
3336 return NULL;
3337 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 PyBuffer_Release(&pbuf);
3340 /* Return the number of bytes read and the address. Note that we do
3341 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003342 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003343}
3344
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003345PyDoc_STRVAR(recvfrom_into_doc,
3346"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003348Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003349
Victor Stinner35bee932015-04-02 12:28:07 +02003350/* The sendmsg() and recvmsg[_into]() methods require a working
3351 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3352#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003353struct sock_recvmsg {
3354 struct msghdr *msg;
3355 int flags;
3356 ssize_t result;
3357};
3358
3359static int
3360sock_recvmsg_impl(PySocketSockObject *s, void *data)
3361{
3362 struct sock_recvmsg *ctx = data;
3363
3364 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3365 return (ctx->result >= 0);
3366}
3367
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003368/*
3369 * Call recvmsg() with the supplied iovec structures, flags, and
3370 * ancillary data buffer size (controllen). Returns the tuple return
3371 * value for recvmsg() or recvmsg_into(), with the first item provided
3372 * by the supplied makeval() function. makeval() will be called with
3373 * the length read and makeval_data as arguments, and must return a
3374 * new reference (which will be decrefed if there is a subsequent
3375 * error). On error, closes any file descriptors received via
3376 * SCM_RIGHTS.
3377 */
3378static PyObject *
3379sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3380 int flags, Py_ssize_t controllen,
3381 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3382{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003383 sock_addr_t addrbuf;
3384 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003385 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003386 PyObject *cmsg_list = NULL, *retval = NULL;
3387 void *controlbuf = NULL;
3388 struct cmsghdr *cmsgh;
3389 size_t cmsgdatalen = 0;
3390 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003391 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003392
3393 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3394 ignored" when the socket is connected (Linux fills them in
3395 anyway for AF_UNIX sockets at least). Normally msg_namelen
3396 seems to be set to 0 if there's no address, but try to
3397 initialize msg_name to something that won't be mistaken for a
3398 real address if that doesn't happen. */
3399 if (!getsockaddrlen(s, &addrbuflen))
3400 return NULL;
3401 memset(&addrbuf, 0, addrbuflen);
3402 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3403
3404 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3405 PyErr_SetString(PyExc_ValueError,
3406 "invalid ancillary data buffer length");
3407 return NULL;
3408 }
3409 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3410 return PyErr_NoMemory();
3411
3412 /* Make the system call. */
3413 if (!IS_SELECTABLE(s)) {
3414 select_error();
3415 goto finally;
3416 }
3417
Victor Stinner31bf2d52015-04-01 21:57:09 +02003418 msg.msg_name = SAS2SA(&addrbuf);
3419 msg.msg_namelen = addrbuflen;
3420 msg.msg_iov = iov;
3421 msg.msg_iovlen = iovlen;
3422 msg.msg_control = controlbuf;
3423 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003424
Victor Stinner31bf2d52015-04-01 21:57:09 +02003425 ctx.msg = &msg;
3426 ctx.flags = flags;
3427 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003429
3430 /* Make list of (level, type, data) tuples from control messages. */
3431 if ((cmsg_list = PyList_New(0)) == NULL)
3432 goto err_closefds;
3433 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3434 implementations didn't do so. */
3435 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3436 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3437 PyObject *bytes, *tuple;
3438 int tmp;
3439
3440 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3441 if (cmsg_status != 0) {
3442 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3443 "received malformed or improperly-truncated "
3444 "ancillary data", 1) == -1)
3445 goto err_closefds;
3446 }
3447 if (cmsg_status < 0)
3448 break;
3449 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003450 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 goto err_closefds;
3452 }
3453
3454 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3455 cmsgdatalen);
3456 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3457 (int)cmsgh->cmsg_type, bytes);
3458 if (tuple == NULL)
3459 goto err_closefds;
3460 tmp = PyList_Append(cmsg_list, tuple);
3461 Py_DECREF(tuple);
3462 if (tmp != 0)
3463 goto err_closefds;
3464
3465 if (cmsg_status != 0)
3466 break;
3467 }
3468
3469 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003470 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003471 cmsg_list,
3472 (int)msg.msg_flags,
3473 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3474 ((msg.msg_namelen > addrbuflen) ?
3475 addrbuflen : msg.msg_namelen),
3476 s->sock_proto));
3477 if (retval == NULL)
3478 goto err_closefds;
3479
3480finally:
3481 Py_XDECREF(cmsg_list);
3482 PyMem_Free(controlbuf);
3483 return retval;
3484
3485err_closefds:
3486#ifdef SCM_RIGHTS
3487 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3488 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3489 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3490 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3491 if (cmsg_status < 0)
3492 break;
3493 if (cmsgh->cmsg_level == SOL_SOCKET &&
3494 cmsgh->cmsg_type == SCM_RIGHTS) {
3495 size_t numfds;
3496 int *fdp;
3497
3498 numfds = cmsgdatalen / sizeof(int);
3499 fdp = (int *)CMSG_DATA(cmsgh);
3500 while (numfds-- > 0)
3501 close(*fdp++);
3502 }
3503 if (cmsg_status != 0)
3504 break;
3505 }
3506#endif /* SCM_RIGHTS */
3507 goto finally;
3508}
3509
3510
3511static PyObject *
3512makeval_recvmsg(ssize_t received, void *data)
3513{
3514 PyObject **buf = data;
3515
3516 if (received < PyBytes_GET_SIZE(*buf))
3517 _PyBytes_Resize(buf, received);
3518 Py_XINCREF(*buf);
3519 return *buf;
3520}
3521
3522/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3523
3524static PyObject *
3525sock_recvmsg(PySocketSockObject *s, PyObject *args)
3526{
3527 Py_ssize_t bufsize, ancbufsize = 0;
3528 int flags = 0;
3529 struct iovec iov;
3530 PyObject *buf = NULL, *retval = NULL;
3531
3532 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3533 return NULL;
3534
3535 if (bufsize < 0) {
3536 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3537 return NULL;
3538 }
3539 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3540 return NULL;
3541 iov.iov_base = PyBytes_AS_STRING(buf);
3542 iov.iov_len = bufsize;
3543
3544 /* Note that we're passing a pointer to *our pointer* to the bytes
3545 object here (&buf); makeval_recvmsg() may incref the object, or
3546 deallocate it and set our pointer to NULL. */
3547 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3548 &makeval_recvmsg, &buf);
3549 Py_XDECREF(buf);
3550 return retval;
3551}
3552
3553PyDoc_STRVAR(recvmsg_doc,
3554"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3555\n\
3556Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3557socket. The ancbufsize argument sets the size in bytes of the\n\
3558internal buffer used to receive the ancillary data; it defaults to 0,\n\
3559meaning that no ancillary data will be received. Appropriate buffer\n\
3560sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3561CMSG_LEN(), and items which do not fit into the buffer might be\n\
3562truncated or discarded. The flags argument defaults to 0 and has the\n\
3563same meaning as for recv().\n\
3564\n\
3565The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3566The data item is a bytes object holding the non-ancillary data\n\
3567received. The ancdata item is a list of zero or more tuples\n\
3568(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3569(control messages) received: cmsg_level and cmsg_type are integers\n\
3570specifying the protocol level and protocol-specific type respectively,\n\
3571and cmsg_data is a bytes object holding the associated data. The\n\
3572msg_flags item is the bitwise OR of various flags indicating\n\
3573conditions on the received message; see your system documentation for\n\
3574details. If the receiving socket is unconnected, address is the\n\
3575address of the sending socket, if available; otherwise, its value is\n\
3576unspecified.\n\
3577\n\
3578If recvmsg() raises an exception after the system call returns, it\n\
3579will first attempt to close any file descriptors received via the\n\
3580SCM_RIGHTS mechanism.");
3581
3582
3583static PyObject *
3584makeval_recvmsg_into(ssize_t received, void *data)
3585{
3586 return PyLong_FromSsize_t(received);
3587}
3588
3589/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3590
3591static PyObject *
3592sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3593{
3594 Py_ssize_t ancbufsize = 0;
3595 int flags = 0;
3596 struct iovec *iovs = NULL;
3597 Py_ssize_t i, nitems, nbufs = 0;
3598 Py_buffer *bufs = NULL;
3599 PyObject *buffers_arg, *fast, *retval = NULL;
3600
3601 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3602 &buffers_arg, &ancbufsize, &flags))
3603 return NULL;
3604
3605 if ((fast = PySequence_Fast(buffers_arg,
3606 "recvmsg_into() argument 1 must be an "
3607 "iterable")) == NULL)
3608 return NULL;
3609 nitems = PySequence_Fast_GET_SIZE(fast);
3610 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003611 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003612 goto finally;
3613 }
3614
3615 /* Fill in an iovec for each item, and save the Py_buffer
3616 structs to release afterwards. */
3617 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3618 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3619 PyErr_NoMemory();
3620 goto finally;
3621 }
3622 for (; nbufs < nitems; nbufs++) {
3623 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3624 "w*;recvmsg_into() argument 1 must be an iterable "
3625 "of single-segment read-write buffers",
3626 &bufs[nbufs]))
3627 goto finally;
3628 iovs[nbufs].iov_base = bufs[nbufs].buf;
3629 iovs[nbufs].iov_len = bufs[nbufs].len;
3630 }
3631
3632 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3633 &makeval_recvmsg_into, NULL);
3634finally:
3635 for (i = 0; i < nbufs; i++)
3636 PyBuffer_Release(&bufs[i]);
3637 PyMem_Free(bufs);
3638 PyMem_Free(iovs);
3639 Py_DECREF(fast);
3640 return retval;
3641}
3642
3643PyDoc_STRVAR(recvmsg_into_doc,
3644"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3645\n\
3646Receive normal data and ancillary data from the socket, scattering the\n\
3647non-ancillary data into a series of buffers. The buffers argument\n\
3648must be an iterable of objects that export writable buffers\n\
3649(e.g. bytearray objects); these will be filled with successive chunks\n\
3650of the non-ancillary data until it has all been written or there are\n\
3651no more buffers. The ancbufsize argument sets the size in bytes of\n\
3652the internal buffer used to receive the ancillary data; it defaults to\n\
36530, meaning that no ancillary data will be received. Appropriate\n\
3654buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3655or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3656truncated or discarded. The flags argument defaults to 0 and has the\n\
3657same meaning as for recv().\n\
3658\n\
3659The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3660The nbytes item is the total number of bytes of non-ancillary data\n\
3661written into the buffers. The ancdata item is a list of zero or more\n\
3662tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3663data (control messages) received: cmsg_level and cmsg_type are\n\
3664integers specifying the protocol level and protocol-specific type\n\
3665respectively, and cmsg_data is a bytes object holding the associated\n\
3666data. The msg_flags item is the bitwise OR of various flags\n\
3667indicating conditions on the received message; see your system\n\
3668documentation for details. If the receiving socket is unconnected,\n\
3669address is the address of the sending socket, if available; otherwise,\n\
3670its value is unspecified.\n\
3671\n\
3672If recvmsg_into() raises an exception after the system call returns,\n\
3673it will first attempt to close any file descriptors received via the\n\
3674SCM_RIGHTS mechanism.");
3675#endif /* CMSG_LEN */
3676
3677
Victor Stinner31bf2d52015-04-01 21:57:09 +02003678struct sock_send {
3679 char *buf;
3680 Py_ssize_t len;
3681 int flags;
3682 Py_ssize_t result;
3683};
3684
3685static int
3686sock_send_impl(PySocketSockObject *s, void *data)
3687{
3688 struct sock_send *ctx = data;
3689
3690#ifdef MS_WINDOWS
3691 if (ctx->len > INT_MAX)
3692 ctx->len = INT_MAX;
3693 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3694#else
3695 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3696#endif
3697 return (ctx->result >= 0);
3698}
3699
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003700/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003701
Guido van Rossum73624e91994-10-10 17:59:00 +00003702static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003703sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003704{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003705 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003707 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3710 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 if (!IS_SELECTABLE(s)) {
3713 PyBuffer_Release(&pbuf);
3714 return select_error();
3715 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003716 ctx.buf = pbuf.buf;
3717 ctx.len = pbuf.len;
3718 ctx.flags = flags;
3719 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003720 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 return NULL;
3722 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003723 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003724
3725 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003726}
3727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003728PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003729"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003730\n\
3731Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003732argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003733sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003734
3735
3736/* s.sendall(data [,flags]) method */
3737
3738static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003739sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003742 Py_ssize_t len, n;
3743 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003745 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003746 int has_timeout = (s->sock_timeout > 0);
3747 _PyTime_t interval = s->sock_timeout;
3748 _PyTime_t deadline = 0;
3749 int deadline_initialized = 0;
3750 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3753 return NULL;
3754 buf = pbuf.buf;
3755 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 if (!IS_SELECTABLE(s)) {
3758 PyBuffer_Release(&pbuf);
3759 return select_error();
3760 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003763 if (has_timeout) {
3764 if (deadline_initialized) {
3765 /* recompute the timeout */
3766 interval = deadline - _PyTime_GetMonotonicClock();
3767 }
3768 else {
3769 deadline_initialized = 1;
3770 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3771 }
3772
3773 if (interval <= 0) {
3774 PyErr_SetString(socket_timeout, "timed out");
3775 goto done;
3776 }
3777 }
3778
Victor Stinner02f32ab2015-04-01 22:53:26 +02003779 ctx.buf = buf;
3780 ctx.len = len;
3781 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003782 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3783 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003784 n = ctx.result;
3785 assert(n >= 0);
3786
3787 buf += n;
3788 len -= n;
3789
3790 /* We must run our signal handlers before looping again.
3791 send() can return a successful partial write when it is
3792 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003793 if (PyErr_CheckSignals())
3794 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003795 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003797
Victor Stinner8912d142015-04-06 23:16:34 +02003798 Py_INCREF(Py_None);
3799 res = Py_None;
3800
3801done:
3802 PyBuffer_Release(&pbuf);
3803 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003804}
3805
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003806PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003807"sendall(data[, flags])\n\
3808\n\
3809Send a data string to the socket. For the optional flags\n\
3810argument, see the Unix manual. This calls send() repeatedly\n\
3811until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003812to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003813
Guido van Rossum30a685f1991-06-27 15:51:29 +00003814
Victor Stinner31bf2d52015-04-01 21:57:09 +02003815struct sock_sendto {
3816 char *buf;
3817 Py_ssize_t len;
3818 int flags;
3819 int addrlen;
3820 sock_addr_t *addrbuf;
3821 Py_ssize_t result;
3822};
3823
3824static int
3825sock_sendto_impl(PySocketSockObject *s, void *data)
3826{
3827 struct sock_sendto *ctx = data;
3828
3829#ifdef MS_WINDOWS
3830 if (ctx->len > INT_MAX)
3831 ctx->len = INT_MAX;
3832 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3833 SAS2SA(ctx->addrbuf), ctx->addrlen);
3834#else
3835 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3836 SAS2SA(ctx->addrbuf), ctx->addrlen);
3837#endif
3838 return (ctx->result >= 0);
3839}
3840
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003841/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003842
Guido van Rossum73624e91994-10-10 17:59:00 +00003843static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003844sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 Py_buffer pbuf;
3847 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003848 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003850 int addrlen, flags;
3851 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003854 arglen = PyTuple_Size(args);
3855 switch (arglen) {
3856 case 2:
3857 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3858 break;
3859 case 3:
3860 PyArg_ParseTuple(args, "y*iO:sendto",
3861 &pbuf, &flags, &addro);
3862 break;
3863 default:
3864 PyErr_Format(PyExc_TypeError,
3865 "sendto() takes 2 or 3 arguments (%d given)",
3866 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003867 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003869 if (PyErr_Occurred())
3870 return NULL;
3871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 if (!IS_SELECTABLE(s)) {
3873 PyBuffer_Release(&pbuf);
3874 return select_error();
3875 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3878 PyBuffer_Release(&pbuf);
3879 return NULL;
3880 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003881
Victor Stinner31bf2d52015-04-01 21:57:09 +02003882 ctx.buf = pbuf.buf;
3883 ctx.len = pbuf.len;
3884 ctx.flags = flags;
3885 ctx.addrlen = addrlen;
3886 ctx.addrbuf = &addrbuf;
3887 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003888 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 return NULL;
3890 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003891 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003892
3893 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003894}
3895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003896PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003897"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003898\n\
3899Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003900For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003901
Guido van Rossum30a685f1991-06-27 15:51:29 +00003902
Victor Stinner35bee932015-04-02 12:28:07 +02003903/* The sendmsg() and recvmsg[_into]() methods require a working
3904 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3905#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003906struct sock_sendmsg {
3907 struct msghdr *msg;
3908 int flags;
3909 ssize_t result;
3910};
3911
3912static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003913sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3914 struct msghdr *msg,
3915 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3916 Py_ssize_t ndataparts, ndatabufs = 0;
3917 int result = -1;
3918 struct iovec *iovs = NULL;
3919 PyObject *data_fast = NULL;
3920 Py_buffer *databufs = NULL;
3921
3922 /* Fill in an iovec for each message part, and save the Py_buffer
3923 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003924 data_fast = PySequence_Fast(data_arg,
3925 "sendmsg() argument 1 must be an "
3926 "iterable");
3927 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003928 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003929 }
3930
Christian Heimesdffa3942016-09-05 23:54:41 +02003931 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3932 if (ndataparts > INT_MAX) {
3933 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3934 goto finally;
3935 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003936
Christian Heimesdffa3942016-09-05 23:54:41 +02003937 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003938 if (ndataparts > 0) {
3939 iovs = PyMem_New(struct iovec, ndataparts);
3940 if (iovs == NULL) {
3941 PyErr_NoMemory();
3942 goto finally;
3943 }
3944 msg->msg_iov = iovs;
3945
3946 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003947 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003948 PyErr_NoMemory();
3949 goto finally;
3950 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003951 }
3952 for (; ndatabufs < ndataparts; ndatabufs++) {
3953 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3954 "y*;sendmsg() argument 1 must be an iterable of "
3955 "bytes-like objects",
3956 &databufs[ndatabufs]))
3957 goto finally;
3958 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3959 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3960 }
3961 result = 0;
3962 finally:
3963 *databufsout = databufs;
3964 *ndatabufsout = ndatabufs;
3965 Py_XDECREF(data_fast);
3966 return result;
3967}
3968
3969static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003970sock_sendmsg_impl(PySocketSockObject *s, void *data)
3971{
3972 struct sock_sendmsg *ctx = data;
3973
3974 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3975 return (ctx->result >= 0);
3976}
3977
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003978/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3979
3980static PyObject *
3981sock_sendmsg(PySocketSockObject *s, PyObject *args)
3982{
Christian Heimesdffa3942016-09-05 23:54:41 +02003983 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003984 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003986 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003987 struct cmsginfo {
3988 int level;
3989 int type;
3990 Py_buffer data;
3991 } *cmsgs = NULL;
3992 void *controlbuf = NULL;
3993 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003994 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003995 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003996 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003997 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003998
3999 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004000 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004001 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004002 }
4003
4004 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004005
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004006 /* Parse destination address. */
4007 if (addr_arg != NULL && addr_arg != Py_None) {
4008 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4009 goto finally;
4010 msg.msg_name = &addrbuf;
4011 msg.msg_namelen = addrlen;
4012 }
4013
4014 /* Fill in an iovec for each message part, and save the Py_buffer
4015 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004016 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004017 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004018 }
4019
4020 if (cmsg_arg == NULL)
4021 ncmsgs = 0;
4022 else {
4023 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4024 "sendmsg() argument 2 must be an "
4025 "iterable")) == NULL)
4026 goto finally;
4027 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4028 }
4029
4030#ifndef CMSG_SPACE
4031 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004032 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004033 "sending multiple control messages is not supported "
4034 "on this system");
4035 goto finally;
4036 }
4037#endif
4038 /* Save level, type and Py_buffer for each control message,
4039 and calculate total size. */
4040 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4041 PyErr_NoMemory();
4042 goto finally;
4043 }
4044 controllen = controllen_last = 0;
4045 while (ncmsgbufs < ncmsgs) {
4046 size_t bufsize, space;
4047
4048 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4049 "(iiy*):[sendmsg() ancillary data items]",
4050 &cmsgs[ncmsgbufs].level,
4051 &cmsgs[ncmsgbufs].type,
4052 &cmsgs[ncmsgbufs].data))
4053 goto finally;
4054 bufsize = cmsgs[ncmsgbufs++].data.len;
4055
4056#ifdef CMSG_SPACE
4057 if (!get_CMSG_SPACE(bufsize, &space)) {
4058#else
4059 if (!get_CMSG_LEN(bufsize, &space)) {
4060#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004061 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004062 goto finally;
4063 }
4064 controllen += space;
4065 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004066 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004067 goto finally;
4068 }
4069 controllen_last = controllen;
4070 }
4071
4072 /* Construct ancillary data block from control message info. */
4073 if (ncmsgbufs > 0) {
4074 struct cmsghdr *cmsgh = NULL;
4075
Victor Stinner52d61e42016-09-12 11:41:58 +02004076 controlbuf = PyMem_Malloc(controllen);
4077 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078 PyErr_NoMemory();
4079 goto finally;
4080 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004081 msg.msg_control = controlbuf;
4082
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004083 msg.msg_controllen = controllen;
4084
4085 /* Need to zero out the buffer as a workaround for glibc's
4086 CMSG_NXTHDR() implementation. After getting the pointer to
4087 the next header, it checks its (uninitialized) cmsg_len
4088 member to see if the "message" fits in the buffer, and
4089 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004090 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004091 memset(controlbuf, 0, controllen);
4092
4093 for (i = 0; i < ncmsgbufs; i++) {
4094 size_t msg_len, data_len = cmsgs[i].data.len;
4095 int enough_space = 0;
4096
4097 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4098 if (cmsgh == NULL) {
4099 PyErr_Format(PyExc_RuntimeError,
4100 "unexpected NULL result from %s()",
4101 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4102 goto finally;
4103 }
4104 if (!get_CMSG_LEN(data_len, &msg_len)) {
4105 PyErr_SetString(PyExc_RuntimeError,
4106 "item size out of range for CMSG_LEN()");
4107 goto finally;
4108 }
4109 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4110 size_t space;
4111
4112 cmsgh->cmsg_len = msg_len;
4113 if (get_cmsg_data_space(&msg, cmsgh, &space))
4114 enough_space = (space >= data_len);
4115 }
4116 if (!enough_space) {
4117 PyErr_SetString(PyExc_RuntimeError,
4118 "ancillary data does not fit in calculated "
4119 "space");
4120 goto finally;
4121 }
4122 cmsgh->cmsg_level = cmsgs[i].level;
4123 cmsgh->cmsg_type = cmsgs[i].type;
4124 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4125 }
4126 }
4127
4128 /* Make the system call. */
4129 if (!IS_SELECTABLE(s)) {
4130 select_error();
4131 goto finally;
4132 }
4133
Victor Stinner31bf2d52015-04-01 21:57:09 +02004134 ctx.msg = &msg;
4135 ctx.flags = flags;
4136 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004137 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004138
4139 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004140
4141finally:
4142 PyMem_Free(controlbuf);
4143 for (i = 0; i < ncmsgbufs; i++)
4144 PyBuffer_Release(&cmsgs[i].data);
4145 PyMem_Free(cmsgs);
4146 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004147 PyMem_Free(msg.msg_iov);
4148 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004149 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004150 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004151 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004152 return retval;
4153}
4154
4155PyDoc_STRVAR(sendmsg_doc,
4156"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4157\n\
4158Send normal and ancillary data to the socket, gathering the\n\
4159non-ancillary data from a series of buffers and concatenating it into\n\
4160a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004161data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004162The ancdata argument specifies the ancillary data (control messages)\n\
4163as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4164cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4165protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004166is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004167argument defaults to 0 and has the same meaning as for send(). If\n\
4168address is supplied and not None, it sets a destination address for\n\
4169the message. The return value is the number of bytes of non-ancillary\n\
4170data sent.");
4171#endif /* CMSG_LEN */
4172
Christian Heimesdffa3942016-09-05 23:54:41 +02004173#ifdef HAVE_SOCKADDR_ALG
4174static PyObject*
4175sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4176{
4177 PyObject *retval = NULL;
4178
4179 Py_ssize_t i, ndatabufs = 0;
4180 Py_buffer *databufs = NULL;
4181 PyObject *data_arg = NULL;
4182
4183 Py_buffer iv = {NULL, NULL};
4184
4185 PyObject *opobj = NULL;
4186 int op = -1;
4187
4188 PyObject *assoclenobj = NULL;
4189 int assoclen = -1;
4190
4191 unsigned int *uiptr;
4192 int flags = 0;
4193
4194 struct msghdr msg;
4195 struct cmsghdr *header = NULL;
4196 struct af_alg_iv *alg_iv = NULL;
4197 struct sock_sendmsg ctx;
4198 Py_ssize_t controllen;
4199 void *controlbuf = NULL;
4200 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4201
4202 if (self->sock_family != AF_ALG) {
4203 PyErr_SetString(PyExc_OSError,
4204 "algset is only supported for AF_ALG");
4205 return NULL;
4206 }
4207
4208 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4209 "|O$O!y*O!i:sendmsg_afalg", keywords,
4210 &data_arg,
4211 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004212 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004213 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004214 }
4215
4216 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004217
4218 /* op is a required, keyword-only argument >= 0 */
4219 if (opobj != NULL) {
4220 op = _PyLong_AsInt(opobj);
4221 }
4222 if (op < 0) {
4223 /* override exception from _PyLong_AsInt() */
4224 PyErr_SetString(PyExc_TypeError,
4225 "Invalid or missing argument 'op'");
4226 goto finally;
4227 }
4228 /* assoclen is optional but must be >= 0 */
4229 if (assoclenobj != NULL) {
4230 assoclen = _PyLong_AsInt(assoclenobj);
4231 if (assoclen == -1 && PyErr_Occurred()) {
4232 goto finally;
4233 }
4234 if (assoclen < 0) {
4235 PyErr_SetString(PyExc_TypeError,
4236 "assoclen must be positive");
4237 goto finally;
4238 }
4239 }
4240
4241 controllen = CMSG_SPACE(4);
4242 if (iv.buf != NULL) {
4243 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4244 }
4245 if (assoclen >= 0) {
4246 controllen += CMSG_SPACE(4);
4247 }
4248
4249 controlbuf = PyMem_Malloc(controllen);
4250 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004251 PyErr_NoMemory();
4252 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004253 }
4254 memset(controlbuf, 0, controllen);
4255
Christian Heimesdffa3942016-09-05 23:54:41 +02004256 msg.msg_controllen = controllen;
4257 msg.msg_control = controlbuf;
4258
4259 /* Fill in an iovec for each message part, and save the Py_buffer
4260 structs to release afterwards. */
4261 if (data_arg != NULL) {
4262 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4263 goto finally;
4264 }
4265 }
4266
4267 /* set operation to encrypt or decrypt */
4268 header = CMSG_FIRSTHDR(&msg);
4269 if (header == NULL) {
4270 PyErr_SetString(PyExc_RuntimeError,
4271 "unexpected NULL result from CMSG_FIRSTHDR");
4272 goto finally;
4273 }
4274 header->cmsg_level = SOL_ALG;
4275 header->cmsg_type = ALG_SET_OP;
4276 header->cmsg_len = CMSG_LEN(4);
4277 uiptr = (void*)CMSG_DATA(header);
4278 *uiptr = (unsigned int)op;
4279
4280 /* set initialization vector */
4281 if (iv.buf != NULL) {
4282 header = CMSG_NXTHDR(&msg, header);
4283 if (header == NULL) {
4284 PyErr_SetString(PyExc_RuntimeError,
4285 "unexpected NULL result from CMSG_NXTHDR(iv)");
4286 goto finally;
4287 }
4288 header->cmsg_level = SOL_ALG;
4289 header->cmsg_type = ALG_SET_IV;
4290 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4291 alg_iv = (void*)CMSG_DATA(header);
4292 alg_iv->ivlen = iv.len;
4293 memcpy(alg_iv->iv, iv.buf, iv.len);
4294 }
4295
4296 /* set length of associated data for AEAD */
4297 if (assoclen >= 0) {
4298 header = CMSG_NXTHDR(&msg, header);
4299 if (header == NULL) {
4300 PyErr_SetString(PyExc_RuntimeError,
4301 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4302 goto finally;
4303 }
4304 header->cmsg_level = SOL_ALG;
4305 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4306 header->cmsg_len = CMSG_LEN(4);
4307 uiptr = (void*)CMSG_DATA(header);
4308 *uiptr = (unsigned int)assoclen;
4309 }
4310
4311 ctx.msg = &msg;
4312 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004313 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004314 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004315 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004316
4317 retval = PyLong_FromSsize_t(ctx.result);
4318
4319 finally:
4320 PyMem_Free(controlbuf);
4321 if (iv.buf != NULL) {
4322 PyBuffer_Release(&iv);
4323 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004324 PyMem_Free(msg.msg_iov);
4325 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004326 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004327 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004328 PyMem_Free(databufs);
4329 return retval;
4330}
4331
4332PyDoc_STRVAR(sendmsg_afalg_doc,
4333"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4334\n\
4335Set operation mode, IV and length of associated data for an AF_ALG\n\
4336operation socket.");
4337#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004338
Guido van Rossum30a685f1991-06-27 15:51:29 +00004339/* s.shutdown(how) method */
4340
Guido van Rossum73624e91994-10-10 17:59:00 +00004341static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004342sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 int how;
4345 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004346
Serhiy Storchaka78980432013-01-15 01:12:17 +02004347 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 if (how == -1 && PyErr_Occurred())
4349 return NULL;
4350 Py_BEGIN_ALLOW_THREADS
4351 res = shutdown(s->sock_fd, how);
4352 Py_END_ALLOW_THREADS
4353 if (res < 0)
4354 return s->errorhandler();
4355 Py_INCREF(Py_None);
4356 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004357}
4358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004359PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004360"shutdown(flag)\n\
4361\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004362Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4363of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004364
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004365#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004366static PyObject*
4367sock_ioctl(PySocketSockObject *s, PyObject *arg)
4368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 unsigned long cmd = SIO_RCVALL;
4370 PyObject *argO;
4371 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4374 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 switch (cmd) {
4377 case SIO_RCVALL: {
4378 unsigned int option = RCVALL_ON;
4379 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4380 return NULL;
4381 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4382 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4383 return set_error();
4384 }
4385 return PyLong_FromUnsignedLong(recv); }
4386 case SIO_KEEPALIVE_VALS: {
4387 struct tcp_keepalive ka;
4388 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4389 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4390 return NULL;
4391 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4392 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4393 return set_error();
4394 }
4395 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004396#if defined(SIO_LOOPBACK_FAST_PATH)
4397 case SIO_LOOPBACK_FAST_PATH: {
4398 unsigned int option;
4399 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4400 return NULL;
4401 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4402 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4403 return set_error();
4404 }
4405 return PyLong_FromUnsignedLong(recv); }
4406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 default:
4408 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4409 return NULL;
4410 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004411}
4412PyDoc_STRVAR(sock_ioctl_doc,
4413"ioctl(cmd, option) -> long\n\
4414\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004415Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4416SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004417SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4418SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004419#endif
4420
4421#if defined(MS_WINDOWS)
4422static PyObject*
4423sock_share(PySocketSockObject *s, PyObject *arg)
4424{
4425 WSAPROTOCOL_INFO info;
4426 DWORD processId;
4427 int result;
4428
4429 if (!PyArg_ParseTuple(arg, "I", &processId))
4430 return NULL;
4431
4432 Py_BEGIN_ALLOW_THREADS
4433 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4434 Py_END_ALLOW_THREADS
4435 if (result == SOCKET_ERROR)
4436 return set_error();
4437 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4438}
4439PyDoc_STRVAR(sock_share_doc,
4440"share(process_id) -> bytes\n\
4441\n\
4442Share the socket with another process. The target process id\n\
4443must be provided and the resulting bytes object passed to the target\n\
4444process. There the shared socket can be instantiated by calling\n\
4445socket.fromshare().");
4446
Christian Heimesfaf2f632008-01-06 16:59:19 +00004447
4448#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004449
4450/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004451
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004452static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4454 accept_doc},
4455 {"bind", (PyCFunction)sock_bind, METH_O,
4456 bind_doc},
4457 {"close", (PyCFunction)sock_close, METH_NOARGS,
4458 close_doc},
4459 {"connect", (PyCFunction)sock_connect, METH_O,
4460 connect_doc},
4461 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4462 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004463 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4464 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4466 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004467#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 {"getpeername", (PyCFunction)sock_getpeername,
4469 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 {"getsockname", (PyCFunction)sock_getsockname,
4472 METH_NOARGS, getsockname_doc},
4473 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4474 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004475#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4477 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004478#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004479#if defined(MS_WINDOWS)
4480 {"share", (PyCFunction)sock_share, METH_VARARGS,
4481 sock_share_doc},
4482#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004483 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 listen_doc},
4485 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4486 recv_doc},
4487 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4488 recv_into_doc},
4489 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4490 recvfrom_doc},
4491 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4492 recvfrom_into_doc},
4493 {"send", (PyCFunction)sock_send, METH_VARARGS,
4494 send_doc},
4495 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4496 sendall_doc},
4497 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4498 sendto_doc},
4499 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4500 setblocking_doc},
4501 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4502 settimeout_doc},
4503 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4504 gettimeout_doc},
4505 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4506 setsockopt_doc},
4507 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4508 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004509#ifdef CMSG_LEN
4510 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4511 recvmsg_doc},
4512 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4513 recvmsg_into_doc,},
4514 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4515 sendmsg_doc},
4516#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004517#ifdef HAVE_SOCKADDR_ALG
4518 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4519 sendmsg_afalg_doc},
4520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004522};
4523
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004524/* SockObject members */
4525static PyMemberDef sock_memberlist[] = {
4526 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4527 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4528 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004529 {0},
4530};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004531
Victor Stinner71694d52015-03-28 01:18:54 +01004532static PyGetSetDef sock_getsetlist[] = {
4533 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4534 {NULL} /* sentinel */
4535};
4536
Guido van Rossum73624e91994-10-10 17:59:00 +00004537/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004538 First close the file description. */
4539
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004540static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004541sock_finalize(PySocketSockObject *s)
4542{
4543 SOCKET_T fd;
4544 PyObject *error_type, *error_value, *error_traceback;
4545
4546 /* Save the current exception, if any. */
4547 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4548
Victor Stinnerd3afb622016-07-22 17:47:09 +02004549 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004550 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4551 /* Spurious errors can appear at shutdown */
4552 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4553 PyErr_WriteUnraisable((PyObject *)s);
4554 }
4555 }
4556
4557 /* Only close the socket *after* logging the ResourceWarning warning
4558 to allow the logger to call socket methods like
4559 socket.getsockname(). If the socket is closed before, socket
4560 methods fails with the EBADF error. */
4561 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004562 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004563
4564 /* We do not want to retry upon EINTR: see sock_close() */
4565 Py_BEGIN_ALLOW_THREADS
4566 (void) SOCKETCLOSE(fd);
4567 Py_END_ALLOW_THREADS
4568 }
4569
4570 /* Restore the saved exception. */
4571 PyErr_Restore(error_type, error_value, error_traceback);
4572}
4573
4574static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004575sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004576{
Victor Stinner19a8e842016-03-21 16:36:48 +01004577 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4578 return;
4579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004581}
4582
Guido van Rossum30a685f1991-06-27 15:51:29 +00004583
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004584static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004585sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004586{
Victor Stinnere254e532014-07-26 14:36:55 +02004587 long sock_fd;
4588 /* On Windows, this test is needed because SOCKET_T is unsigned */
4589 if (s->sock_fd == INVALID_SOCKET) {
4590 sock_fd = -1;
4591 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004592#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004593 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 /* this can occur on Win64, and actually there is a special
4595 ugly printf formatter for decimal pointer length integer
4596 printing, only bother if necessary*/
4597 PyErr_SetString(PyExc_OverflowError,
4598 "no printf formatter to display "
4599 "the socket descriptor in decimal");
4600 return NULL;
4601 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004602#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004603 else
4604 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 return PyUnicode_FromFormat(
4606 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004607 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004608 s->sock_type,
4609 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004610}
4611
4612
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004613/* Create a new, uninitialized socket object. */
4614
4615static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004616sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 new = type->tp_alloc(type, 0);
4621 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004622 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004623 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 ((PySocketSockObject *)new)->errorhandler = &set_error;
4625 }
4626 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004627}
4628
4629
4630/* Initialize a new socket object. */
4631
Victor Stinnerdaf45552013-08-28 00:53:59 +02004632#ifdef SOCK_CLOEXEC
4633/* socket() and socketpair() fail with EINVAL on Linux kernel older
4634 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4635static int sock_cloexec_works = -1;
4636#endif
4637
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004638/*ARGSUSED*/
4639static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004640sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 PySocketSockObject *s = (PySocketSockObject *)self;
4643 PyObject *fdobj = NULL;
4644 SOCKET_T fd = INVALID_SOCKET;
4645 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4646 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004647#ifndef MS_WINDOWS
4648#ifdef SOCK_CLOEXEC
4649 int *atomic_flag_works = &sock_cloexec_works;
4650#else
4651 int *atomic_flag_works = NULL;
4652#endif
4653#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4656 "|iiiO:socket", keywords,
4657 &family, &type, &proto, &fdobj))
4658 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004661#ifdef MS_WINDOWS
4662 /* recreate a socket that was duplicated */
4663 if (PyBytes_Check(fdobj)) {
4664 WSAPROTOCOL_INFO info;
4665 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4666 PyErr_Format(PyExc_ValueError,
4667 "socket descriptor string has wrong size, "
4668 "should be %zu bytes.", sizeof(info));
4669 return -1;
4670 }
4671 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4672 Py_BEGIN_ALLOW_THREADS
4673 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4674 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4675 Py_END_ALLOW_THREADS
4676 if (fd == INVALID_SOCKET) {
4677 set_error();
4678 return -1;
4679 }
4680 family = info.iAddressFamily;
4681 type = info.iSocketType;
4682 proto = info.iProtocol;
4683 }
4684 else
4685#endif
4686 {
4687 fd = PyLong_AsSocket_t(fdobj);
4688 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4689 return -1;
4690 if (fd == INVALID_SOCKET) {
4691 PyErr_SetString(PyExc_ValueError,
4692 "can't use invalid socket value");
4693 return -1;
4694 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 }
4696 }
4697 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004698#ifdef MS_WINDOWS
4699 /* Windows implementation */
4700#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4701#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4702#endif
4703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004705 if (support_wsa_no_inherit) {
4706 fd = WSASocket(family, type, proto,
4707 NULL, 0,
4708 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4709 if (fd == INVALID_SOCKET) {
4710 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4711 support_wsa_no_inherit = 0;
4712 fd = socket(family, type, proto);
4713 }
4714 }
4715 else {
4716 fd = socket(family, type, proto);
4717 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 if (fd == INVALID_SOCKET) {
4721 set_error();
4722 return -1;
4723 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004724
4725 if (!support_wsa_no_inherit) {
4726 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4727 closesocket(fd);
4728 PyErr_SetFromWindowsErr(0);
4729 return -1;
4730 }
4731 }
4732#else
4733 /* UNIX */
4734 Py_BEGIN_ALLOW_THREADS
4735#ifdef SOCK_CLOEXEC
4736 if (sock_cloexec_works != 0) {
4737 fd = socket(family, type | SOCK_CLOEXEC, proto);
4738 if (sock_cloexec_works == -1) {
4739 if (fd >= 0) {
4740 sock_cloexec_works = 1;
4741 }
4742 else if (errno == EINVAL) {
4743 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4744 sock_cloexec_works = 0;
4745 fd = socket(family, type, proto);
4746 }
4747 }
4748 }
4749 else
4750#endif
4751 {
4752 fd = socket(family, type, proto);
4753 }
4754 Py_END_ALLOW_THREADS
4755
4756 if (fd == INVALID_SOCKET) {
4757 set_error();
4758 return -1;
4759 }
4760
4761 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4762 SOCKETCLOSE(fd);
4763 return -1;
4764 }
4765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004767 if (init_sockobject(s, fd, family, type, proto) == -1) {
4768 SOCKETCLOSE(fd);
4769 return -1;
4770 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004773
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004774}
4775
4776
Guido van Rossumb6775db1994-08-01 11:34:53 +00004777/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004778
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004779static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4781 "_socket.socket", /* tp_name */
4782 sizeof(PySocketSockObject), /* tp_basicsize */
4783 0, /* tp_itemsize */
4784 (destructor)sock_dealloc, /* tp_dealloc */
4785 0, /* tp_print */
4786 0, /* tp_getattr */
4787 0, /* tp_setattr */
4788 0, /* tp_reserved */
4789 (reprfunc)sock_repr, /* tp_repr */
4790 0, /* tp_as_number */
4791 0, /* tp_as_sequence */
4792 0, /* tp_as_mapping */
4793 0, /* tp_hash */
4794 0, /* tp_call */
4795 0, /* tp_str */
4796 PyObject_GenericGetAttr, /* tp_getattro */
4797 0, /* tp_setattro */
4798 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004799 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4800 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 sock_doc, /* tp_doc */
4802 0, /* tp_traverse */
4803 0, /* tp_clear */
4804 0, /* tp_richcompare */
4805 0, /* tp_weaklistoffset */
4806 0, /* tp_iter */
4807 0, /* tp_iternext */
4808 sock_methods, /* tp_methods */
4809 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004810 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 0, /* tp_base */
4812 0, /* tp_dict */
4813 0, /* tp_descr_get */
4814 0, /* tp_descr_set */
4815 0, /* tp_dictoffset */
4816 sock_initobj, /* tp_init */
4817 PyType_GenericAlloc, /* tp_alloc */
4818 sock_new, /* tp_new */
4819 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004820 0, /* tp_is_gc */
4821 0, /* tp_bases */
4822 0, /* tp_mro */
4823 0, /* tp_cache */
4824 0, /* tp_subclasses */
4825 0, /* tp_weaklist */
4826 0, /* tp_del */
4827 0, /* tp_version_tag */
4828 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004829};
4830
Guido van Rossum30a685f1991-06-27 15:51:29 +00004831
Guido van Rossum81194471991-07-27 21:42:02 +00004832/* Python interface to gethostname(). */
4833
4834/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004835static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004836socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004837{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004838#ifdef MS_WINDOWS
4839 /* Don't use winsock's gethostname, as this returns the ANSI
4840 version of the hostname, whereas we need a Unicode string.
4841 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004842 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004843 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004844 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004845 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004846
4847 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004848 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004849
4850 if (GetLastError() != ERROR_MORE_DATA)
4851 return PyErr_SetFromWindowsErr(0);
4852
4853 if (size == 0)
4854 return PyUnicode_New(0, 0);
4855
4856 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4857 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004858 name = PyMem_New(wchar_t, size);
4859 if (!name) {
4860 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004861 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004862 }
Victor Stinner74168972011-11-17 01:11:36 +01004863 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4864 name,
4865 &size))
4866 {
4867 PyMem_Free(name);
4868 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004869 }
Victor Stinner74168972011-11-17 01:11:36 +01004870
4871 result = PyUnicode_FromWideChar(name, size);
4872 PyMem_Free(name);
4873 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004874#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 char buf[1024];
4876 int res;
4877 Py_BEGIN_ALLOW_THREADS
4878 res = gethostname(buf, (int) sizeof buf - 1);
4879 Py_END_ALLOW_THREADS
4880 if (res < 0)
4881 return set_error();
4882 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004883 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004884#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004885}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004887PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004888"gethostname() -> string\n\
4889\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004890Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004891
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004892#ifdef HAVE_SETHOSTNAME
4893PyDoc_STRVAR(sethostname_doc,
4894"sethostname(name)\n\n\
4895Sets the hostname to name.");
4896
4897static PyObject *
4898socket_sethostname(PyObject *self, PyObject *args)
4899{
4900 PyObject *hnobj;
4901 Py_buffer buf;
4902 int res, flag = 0;
4903
Christian Heimesd2774c72013-06-19 02:06:29 +02004904#ifdef _AIX
4905/* issue #18259, not declared in any useful header file */
4906extern int sethostname(const char *, size_t);
4907#endif
4908
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004909 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4910 PyErr_Clear();
4911 if (!PyArg_ParseTuple(args, "O&:sethostname",
4912 PyUnicode_FSConverter, &hnobj))
4913 return NULL;
4914 flag = 1;
4915 }
4916 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4917 if (!res) {
4918 res = sethostname(buf.buf, buf.len);
4919 PyBuffer_Release(&buf);
4920 }
4921 if (flag)
4922 Py_DECREF(hnobj);
4923 if (res)
4924 return set_error();
4925 Py_RETURN_NONE;
4926}
4927#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004928
Guido van Rossum30a685f1991-06-27 15:51:29 +00004929/* Python interface to gethostbyname(name). */
4930
4931/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004933socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 char *name;
4936 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004937 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004938
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004939 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 return NULL;
4941 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004942 goto finally;
4943 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4944finally:
4945 PyMem_Free(name);
4946 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004947}
4948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004949PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004950"gethostbyname(host) -> address\n\
4951\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004952Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004953
4954
Victor Stinner72400302016-01-28 15:41:01 +01004955static PyObject*
4956sock_decode_hostname(const char *name)
4957{
4958#ifdef MS_WINDOWS
4959 /* Issue #26227: gethostbyaddr() returns a string encoded
4960 * to the ANSI code page */
4961 return PyUnicode_DecodeFSDefault(name);
4962#else
4963 /* Decode from UTF-8 */
4964 return PyUnicode_FromString(name);
4965#endif
4966}
4967
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004968/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4969
4970static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004971gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 char **pch;
4974 PyObject *rtn_tuple = (PyObject *)NULL;
4975 PyObject *name_list = (PyObject *)NULL;
4976 PyObject *addr_list = (PyObject *)NULL;
4977 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004978 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 if (h == NULL) {
4981 /* Let's get real error message to return */
4982 set_herror(h_errno);
4983 return NULL;
4984 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 if (h->h_addrtype != af) {
4987 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004988 errno = EAFNOSUPPORT;
4989 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 return NULL;
4991 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 case AF_INET:
4996 if (alen < sizeof(struct sockaddr_in))
4997 return NULL;
4998 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004999
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005000#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 case AF_INET6:
5002 if (alen < sizeof(struct sockaddr_in6))
5003 return NULL;
5004 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005005#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 if ((name_list = PyList_New(0)) == NULL)
5010 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 if ((addr_list = PyList_New(0)) == NULL)
5013 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 /* SF #1511317: h_aliases can be NULL */
5016 if (h->h_aliases) {
5017 for (pch = h->h_aliases; *pch != NULL; pch++) {
5018 int status;
5019 tmp = PyUnicode_FromString(*pch);
5020 if (tmp == NULL)
5021 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 status = PyList_Append(name_list, tmp);
5024 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 if (status)
5027 goto err;
5028 }
5029 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5032 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 case AF_INET:
5037 {
5038 struct sockaddr_in sin;
5039 memset(&sin, 0, sizeof(sin));
5040 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005041#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5045 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 if (pch == h->h_addr_list && alen >= sizeof(sin))
5048 memcpy((char *) addr, &sin, sizeof(sin));
5049 break;
5050 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005051
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005052#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 case AF_INET6:
5054 {
5055 struct sockaddr_in6 sin6;
5056 memset(&sin6, 0, sizeof(sin6));
5057 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005058#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005061 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5062 tmp = makeipaddr((struct sockaddr *)&sin6,
5063 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5066 memcpy((char *) addr, &sin6, sizeof(sin6));
5067 break;
5068 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005069#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005072 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 "unsupported address family");
5074 return NULL;
5075 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 if (tmp == NULL)
5078 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 status = PyList_Append(addr_list, tmp);
5081 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 if (status)
5084 goto err;
5085 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005086
Victor Stinner72400302016-01-28 15:41:01 +01005087 name = sock_decode_hostname(h->h_name);
5088 if (name == NULL)
5089 goto err;
5090 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005091
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005092 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 Py_XDECREF(name_list);
5094 Py_XDECREF(addr_list);
5095 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005096}
5097
5098
5099/* Python interface to gethostbyname_ex(name). */
5100
5101/*ARGSUSED*/
5102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005103socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 char *name;
5106 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005107 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005109 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005110#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005112#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 char buf[16384];
5116 int buf_len = (sizeof buf) - 1;
5117 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005118#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005119#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005121#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005122#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005123
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005124 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005126 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005127 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005129#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005130#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005131 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005133#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005135#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 memset((void *) &data, '\0', sizeof(data));
5137 result = gethostbyname_r(name, &hp_allocated, &data);
5138 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005139#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005140#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005141#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005145#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 Py_END_ALLOW_THREADS
5147 /* Some C libraries would require addr.__ss_family instead of
5148 addr.ss_family.
5149 Therefore, we cast the sockaddr_storage into sockaddr to
5150 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005151 sa = SAS2SA(&addr);
5152 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005154#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005156#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005157finally:
5158 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005160}
5161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005162PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005163"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5164\n\
5165Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005166for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005167
5168
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005169/* Python interface to gethostbyaddr(IP). */
5170
5171/*ARGSUSED*/
5172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005173socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005174{
Charles-François Natali8b759652011-12-23 16:44:51 +01005175 sock_addr_t addr;
5176 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 char *ip_num;
5178 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005179 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005180#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005182#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005184#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 /* glibcs up to 2.10 assume that the buf argument to
5186 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5187 does not ensure. The attribute below instructs the compiler
5188 to maintain this alignment. */
5189 char buf[16384] Py_ALIGNED(8);
5190 int buf_len = (sizeof buf) - 1;
5191 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005192#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005193#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005195#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005196#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 char *ap;
5198 int al;
5199 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005200
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005201 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 return NULL;
5203 af = AF_UNSPEC;
5204 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005205 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 af = sa->sa_family;
5207 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005208 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 switch (af) {
5210 case AF_INET:
5211 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5212 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5213 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005214#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 case AF_INET6:
5216 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5217 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5218 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005221 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005222 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 }
5224 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005225#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005226#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005227 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 &hp_allocated, buf, buf_len,
5229 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005230#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 h = gethostbyaddr_r(ap, al, af,
5232 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005233#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 memset((void *) &data, '\0', sizeof(data));
5235 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5236 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005237#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005238#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005239#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005243#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005245 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005246#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005248#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005249finally:
5250 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005252}
5253
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005254PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005255"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5256\n\
5257Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005258for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005259
Guido van Rossum30a685f1991-06-27 15:51:29 +00005260
5261/* Python interface to getservbyname(name).
5262 This only returns the port number, since the other info is already
5263 known or not useful (like the list of aliases). */
5264
5265/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005267socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 char *name, *proto=NULL;
5270 struct servent *sp;
5271 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5272 return NULL;
5273 Py_BEGIN_ALLOW_THREADS
5274 sp = getservbyname(name, proto);
5275 Py_END_ALLOW_THREADS
5276 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005277 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 return NULL;
5279 }
5280 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005281}
5282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005283PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005284"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005285\n\
5286Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005287The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5288otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005289
Guido van Rossum30a685f1991-06-27 15:51:29 +00005290
Barry Warsaw11b91a02004-06-28 00:50:43 +00005291/* Python interface to getservbyport(port).
5292 This only returns the service name, since the other info is already
5293 known or not useful (like the list of aliases). */
5294
5295/*ARGSUSED*/
5296static PyObject *
5297socket_getservbyport(PyObject *self, PyObject *args)
5298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 int port;
5300 char *proto=NULL;
5301 struct servent *sp;
5302 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5303 return NULL;
5304 if (port < 0 || port > 0xffff) {
5305 PyErr_SetString(
5306 PyExc_OverflowError,
5307 "getservbyport: port must be 0-65535.");
5308 return NULL;
5309 }
5310 Py_BEGIN_ALLOW_THREADS
5311 sp = getservbyport(htons((short)port), proto);
5312 Py_END_ALLOW_THREADS
5313 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005314 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 return NULL;
5316 }
5317 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005318}
5319
5320PyDoc_STRVAR(getservbyport_doc,
5321"getservbyport(port[, protocolname]) -> string\n\
5322\n\
5323Return the service name from a port number and protocol name.\n\
5324The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5325otherwise any protocol will match.");
5326
Guido van Rossum3901d851996-12-19 16:35:04 +00005327/* Python interface to getprotobyname(name).
5328 This only returns the protocol number, since the other info is
5329 already known or not useful (like the list of aliases). */
5330
5331/*ARGSUSED*/
5332static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005333socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 char *name;
5336 struct protoent *sp;
5337 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5338 return NULL;
5339 Py_BEGIN_ALLOW_THREADS
5340 sp = getprotobyname(name);
5341 Py_END_ALLOW_THREADS
5342 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005343 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 return NULL;
5345 }
5346 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005347}
5348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005349PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005350"getprotobyname(name) -> integer\n\
5351\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005352Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005353
Guido van Rossum3901d851996-12-19 16:35:04 +00005354
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005355#ifndef NO_DUP
5356/* dup() function for socket fds */
5357
5358static PyObject *
5359socket_dup(PyObject *self, PyObject *fdobj)
5360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 SOCKET_T fd, newfd;
5362 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005363#ifdef MS_WINDOWS
5364 WSAPROTOCOL_INFO info;
5365#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 fd = PyLong_AsSocket_t(fdobj);
5368 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5369 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005370
Victor Stinnerdaf45552013-08-28 00:53:59 +02005371#ifdef MS_WINDOWS
5372 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5373 return set_error();
5374
5375 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5376 FROM_PROTOCOL_INFO,
5377 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 if (newfd == INVALID_SOCKET)
5379 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005380
Victor Stinnerdaf45552013-08-28 00:53:59 +02005381 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5382 closesocket(newfd);
5383 PyErr_SetFromWindowsErr(0);
5384 return NULL;
5385 }
5386#else
5387 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5388 newfd = _Py_dup(fd);
5389 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005390 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005391#endif
5392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 newfdobj = PyLong_FromSocket_t(newfd);
5394 if (newfdobj == NULL)
5395 SOCKETCLOSE(newfd);
5396 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005397}
5398
5399PyDoc_STRVAR(dup_doc,
5400"dup(integer) -> integer\n\
5401\n\
5402Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5403sockets; on some platforms os.dup() won't work for socket file descriptors.");
5404#endif
5405
5406
Dave Cole331708b2004-08-09 04:51:41 +00005407#ifdef HAVE_SOCKETPAIR
5408/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005409 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005410 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005411
5412/*ARGSUSED*/
5413static PyObject *
5414socket_socketpair(PyObject *self, PyObject *args)
5415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 PySocketSockObject *s0 = NULL, *s1 = NULL;
5417 SOCKET_T sv[2];
5418 int family, type = SOCK_STREAM, proto = 0;
5419 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005420#ifdef SOCK_CLOEXEC
5421 int *atomic_flag_works = &sock_cloexec_works;
5422#else
5423 int *atomic_flag_works = NULL;
5424#endif
5425 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005426
5427#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005429#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5433 &family, &type, &proto))
5434 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005437 Py_BEGIN_ALLOW_THREADS
5438#ifdef SOCK_CLOEXEC
5439 if (sock_cloexec_works != 0) {
5440 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5441 if (sock_cloexec_works == -1) {
5442 if (ret >= 0) {
5443 sock_cloexec_works = 1;
5444 }
5445 else if (errno == EINVAL) {
5446 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5447 sock_cloexec_works = 0;
5448 ret = socketpair(family, type, proto, sv);
5449 }
5450 }
5451 }
5452 else
5453#endif
5454 {
5455 ret = socketpair(family, type, proto, sv);
5456 }
5457 Py_END_ALLOW_THREADS
5458
5459 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005461
5462 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5463 goto finally;
5464 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5465 goto finally;
5466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 s0 = new_sockobject(sv[0], family, type, proto);
5468 if (s0 == NULL)
5469 goto finally;
5470 s1 = new_sockobject(sv[1], family, type, proto);
5471 if (s1 == NULL)
5472 goto finally;
5473 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005474
5475finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 if (res == NULL) {
5477 if (s0 == NULL)
5478 SOCKETCLOSE(sv[0]);
5479 if (s1 == NULL)
5480 SOCKETCLOSE(sv[1]);
5481 }
5482 Py_XDECREF(s0);
5483 Py_XDECREF(s1);
5484 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005485}
5486
5487PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005488"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005489\n\
5490Create a pair of socket objects from the sockets returned by the platform\n\
5491socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005492The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005493AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005494
5495#endif /* HAVE_SOCKETPAIR */
5496
5497
Guido van Rossum006bf911996-06-12 04:04:55 +00005498static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005499socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005500{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005501 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005502
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005503 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 return NULL;
5505 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005506 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005508 "ntohs: can't convert negative Python int to C "
5509 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 return NULL;
5511 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005512 if (x > 0xffff) {
5513 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5514 "ntohs: Python int too large to convert to C "
5515 "16-bit unsigned integer (The silent truncation "
5516 "is deprecated)",
5517 1)) {
5518 return NULL;
5519 }
5520 }
5521 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005522}
5523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005524PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005525"ntohs(integer) -> integer\n\
5526\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005527Convert a 16-bit unsigned integer from network to host byte order.\n\
5528Note that in case the received integer does not fit in 16-bit unsigned\n\
5529integer, but does fit in a positive C int, it is silently truncated to\n\
553016-bit unsigned integer.\n\
5531However, this silent truncation feature is deprecated, and will raise an \n\
5532exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005533
5534
Guido van Rossum006bf911996-06-12 04:04:55 +00005535static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005536socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 if (PyLong_Check(arg)) {
5541 x = PyLong_AsUnsignedLong(arg);
5542 if (x == (unsigned long) -1 && PyErr_Occurred())
5543 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005544#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 {
5546 unsigned long y;
5547 /* only want the trailing 32 bits */
5548 y = x & 0xFFFFFFFFUL;
5549 if (y ^ x)
5550 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005551 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 x = y;
5553 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 }
5556 else
5557 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005558 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005561}
5562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005563PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005564"ntohl(integer) -> integer\n\
5565\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005566Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005567
5568
Guido van Rossum006bf911996-06-12 04:04:55 +00005569static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005570socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005571{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005572 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005573
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005574 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 return NULL;
5576 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005577 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005579 "htons: can't convert negative Python int to C "
5580 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 return NULL;
5582 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005583 if (x > 0xffff) {
5584 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5585 "htons: Python int too large to convert to C "
5586 "16-bit unsigned integer (The silent truncation "
5587 "is deprecated)",
5588 1)) {
5589 return NULL;
5590 }
5591 }
5592 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005593}
5594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005595PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005596"htons(integer) -> integer\n\
5597\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005598Convert a 16-bit unsigned integer from host to network byte order.\n\
5599Note that in case the received integer does not fit in 16-bit unsigned\n\
5600integer, but does fit in a positive C int, it is silently truncated to\n\
560116-bit unsigned integer.\n\
5602However, this silent truncation feature is deprecated, and will raise an \n\
5603exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005604
5605
Guido van Rossum006bf911996-06-12 04:04:55 +00005606static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005607socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 if (PyLong_Check(arg)) {
5612 x = PyLong_AsUnsignedLong(arg);
5613 if (x == (unsigned long) -1 && PyErr_Occurred())
5614 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005615#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 {
5617 unsigned long y;
5618 /* only want the trailing 32 bits */
5619 y = x & 0xFFFFFFFFUL;
5620 if (y ^ x)
5621 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005622 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 x = y;
5624 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 }
5627 else
5628 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005629 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 Py_TYPE(arg)->tp_name);
5631 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005632}
5633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005634PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005635"htonl(integer) -> integer\n\
5636\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005637Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005638
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005639/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005640
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005641PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005642"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005643\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005644Convert 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 +00005645binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005646
5647static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005648socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005649{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005650#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005652#endif
5653
5654#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005655#if (SIZEOF_INT != 4)
5656#error "Not sure if in_addr_t exists and int is not 32-bits."
5657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 /* Have to use inet_addr() instead */
5659 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5664 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005665
Tim Peters1df9fdd2003-02-13 03:13:40 +00005666
5667#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005668
5669#ifdef USE_INET_ATON_WEAKLINK
5670 if (inet_aton != NULL) {
5671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672 if (inet_aton(ip_addr, &buf))
5673 return PyBytes_FromStringAndSize((char *)(&buf),
5674 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005675
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005676 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 "illegal IP address string passed to inet_aton");
5678 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005679
Thomas Wouters477c8d52006-05-27 19:21:47 +00005680#ifdef USE_INET_ATON_WEAKLINK
5681 } else {
5682#endif
5683
5684#endif
5685
5686#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 /* special-case this address as inet_addr might return INADDR_NONE
5689 * for this */
5690 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005691 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005697 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 "illegal IP address string passed to inet_aton");
5699 return NULL;
5700 }
5701 }
5702 return PyBytes_FromStringAndSize((char *) &packed_addr,
5703 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005704
5705#ifdef USE_INET_ATON_WEAKLINK
5706 }
5707#endif
5708
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005709#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005710}
5711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005712PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005713"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005714\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005715Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005716
5717static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005718socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005719{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005720 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005722
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005723 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 return NULL;
5725 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005726
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005727 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005728 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005730 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 return NULL;
5732 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005733
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005734 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5735 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005738}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005739
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005740#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005741
5742PyDoc_STRVAR(inet_pton_doc,
5743"inet_pton(af, ip) -> packed IP address string\n\
5744\n\
5745Convert an IP address from string format to a packed string suitable\n\
5746for use with low-level network functions.");
5747
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005748#endif
5749
5750#ifdef HAVE_INET_PTON
5751
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005752static PyObject *
5753socket_inet_pton(PyObject *self, PyObject *args)
5754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 int af;
5756 char* ip;
5757 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005758#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005759 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005760#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5764 return NULL;
5765 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005766
Martin v. Löwis04697e82004-06-02 12:35:29 +00005767#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005769 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 "can't use AF_INET6, IPv6 is disabled");
5771 return NULL;
5772 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005773#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 retval = inet_pton(af, ip, packed);
5776 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005777 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 return NULL;
5779 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005780 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 "illegal IP address string passed to inet_pton");
5782 return NULL;
5783 } else if (af == AF_INET) {
5784 return PyBytes_FromStringAndSize(packed,
5785 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005786#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 } else if (af == AF_INET6) {
5788 return PyBytes_FromStringAndSize(packed,
5789 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005792 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 return NULL;
5794 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005795}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005796#elif defined(MS_WINDOWS)
5797
5798static PyObject *
5799socket_inet_pton(PyObject *self, PyObject *args)
5800{
5801 int af;
5802 char* ip;
5803 struct sockaddr_in6 addr;
5804 INT ret, size;
5805
5806 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5807 return NULL;
5808 }
5809
Victor Stinnere990c6e2013-11-16 00:18:58 +01005810 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005811 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5812
5813 if (ret) {
5814 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5815 return NULL;
5816 } else if(af == AF_INET) {
5817 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005818 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005819 sizeof(addr4->sin_addr));
5820 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005821 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005822 sizeof(addr.sin6_addr));
5823 } else {
5824 PyErr_SetString(PyExc_OSError, "unknown address family");
5825 return NULL;
5826 }
5827}
5828
5829#endif
5830
5831#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005832
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005833PyDoc_STRVAR(inet_ntop_doc,
5834"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5835\n\
5836Convert a packed IP address of the given family to string format.");
5837
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005838#endif
5839
5840
5841#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005842static PyObject *
5843socket_inet_ntop(PyObject *self, PyObject *args)
5844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005846 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005848#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005849 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005850#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005852#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5855 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005856
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005857 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 return NULL;
5859 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005862 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 PyErr_SetString(PyExc_ValueError,
5864 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005865 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 return NULL;
5867 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005868#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005870 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 PyErr_SetString(PyExc_ValueError,
5872 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005873 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 return NULL;
5875 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 } else {
5878 PyErr_Format(PyExc_ValueError,
5879 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005880 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 return NULL;
5882 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005883
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005884 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5885 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005887 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 return NULL;
5889 } else {
5890 return PyUnicode_FromString(retval);
5891 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005892}
5893
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005894#elif defined(MS_WINDOWS)
5895
5896static PyObject *
5897socket_inet_ntop(PyObject *self, PyObject *args)
5898{
5899 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005900 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005901 struct sockaddr_in6 addr;
5902 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005903#ifdef ENABLE_IPV6
5904 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5905#else
5906 char ip[INET_ADDRSTRLEN + 1];
5907#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005908
5909 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5910 memset((void *) &ip[0], '\0', sizeof(ip));
5911
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005912 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005913 return NULL;
5914 }
5915
5916 if (af == AF_INET) {
5917 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5918
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005919 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005920 PyErr_SetString(PyExc_ValueError,
5921 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005922 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005923 return NULL;
5924 }
5925 memset(addr4, 0, sizeof(struct sockaddr_in));
5926 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005927 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005928 addrlen = sizeof(struct sockaddr_in);
5929 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005930 if (packed_ip.len != sizeof(struct in6_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
5937 memset(&addr, 0, sizeof(addr));
5938 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005939 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005940 addrlen = sizeof(addr);
5941 } else {
5942 PyErr_Format(PyExc_ValueError,
5943 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005944 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005945 return NULL;
5946 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005947 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005948
5949 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005950 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005951 ip, &retlen);
5952
5953 if (ret) {
5954 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5955 return NULL;
5956 } else {
5957 return PyUnicode_FromString(ip);
5958 }
5959}
5960
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005961#endif /* HAVE_INET_PTON */
5962
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005963/* Python interface to getaddrinfo(host, port). */
5964
5965/*ARGSUSED*/
5966static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005967socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005968{
Victor Stinner77af1722011-05-26 14:05:59 +02005969 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005970 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 struct addrinfo hints, *res;
5972 struct addrinfo *res0 = NULL;
5973 PyObject *hobj = NULL;
5974 PyObject *pobj = (PyObject *)NULL;
5975 char pbuf[30];
5976 char *hptr, *pptr;
5977 int family, socktype, protocol, flags;
5978 int error;
5979 PyObject *all = (PyObject *)NULL;
5980 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005981
Georg Brandl6083a4b2013-10-14 06:51:46 +02005982 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005984 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005985 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 &protocol, &flags)) {
5987 return NULL;
5988 }
5989 if (hobj == Py_None) {
5990 hptr = NULL;
5991 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005992 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 if (!idna)
5994 return NULL;
5995 assert(PyBytes_Check(idna));
5996 hptr = PyBytes_AS_STRING(idna);
5997 } else if (PyBytes_Check(hobj)) {
5998 hptr = PyBytes_AsString(hobj);
5999 } else {
6000 PyErr_SetString(PyExc_TypeError,
6001 "getaddrinfo() argument 1 must be string or None");
6002 return NULL;
6003 }
6004 if (PyLong_CheckExact(pobj)) {
6005 long value = PyLong_AsLong(pobj);
6006 if (value == -1 && PyErr_Occurred())
6007 goto err;
6008 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6009 pptr = pbuf;
6010 } else if (PyUnicode_Check(pobj)) {
6011 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006012 if (pptr == NULL)
6013 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006015 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 } else if (pobj == Py_None) {
6017 pptr = (char *)NULL;
6018 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006019 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 goto err;
6021 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006022#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006023 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6024 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006025 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6026 * This workaround avoids a segfault in libsystem.
6027 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006028 pptr = "00";
6029 }
6030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 memset(&hints, 0, sizeof(hints));
6032 hints.ai_family = family;
6033 hints.ai_socktype = socktype;
6034 hints.ai_protocol = protocol;
6035 hints.ai_flags = flags;
6036 Py_BEGIN_ALLOW_THREADS
6037 ACQUIRE_GETADDRINFO_LOCK
6038 error = getaddrinfo(hptr, pptr, &hints, &res0);
6039 Py_END_ALLOW_THREADS
6040 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6041 if (error) {
6042 set_gaierror(error);
6043 goto err;
6044 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006045
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006046 all = PyList_New(0);
6047 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 goto err;
6049 for (res = res0; res; res = res->ai_next) {
6050 PyObject *single;
6051 PyObject *addr =
6052 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6053 if (addr == NULL)
6054 goto err;
6055 single = Py_BuildValue("iiisO", res->ai_family,
6056 res->ai_socktype, res->ai_protocol,
6057 res->ai_canonname ? res->ai_canonname : "",
6058 addr);
6059 Py_DECREF(addr);
6060 if (single == NULL)
6061 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 if (PyList_Append(all, single))
6064 goto err;
6065 Py_XDECREF(single);
6066 }
6067 Py_XDECREF(idna);
6068 if (res0)
6069 freeaddrinfo(res0);
6070 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006071 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 Py_XDECREF(all);
6073 Py_XDECREF(idna);
6074 if (res0)
6075 freeaddrinfo(res0);
6076 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006077}
6078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006079PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006080"getaddrinfo(host, port [, family, type, proto, flags])\n\
6081 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006082\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006083Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006084
6085/* Python interface to getnameinfo(sa, flags). */
6086
6087/*ARGSUSED*/
6088static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006089socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 PyObject *sa = (PyObject *)NULL;
6092 int flags;
6093 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006094 int port;
6095 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6097 struct addrinfo hints, *res = NULL;
6098 int error;
6099 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006100 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 flags = flowinfo = scope_id = 0;
6103 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6104 return NULL;
6105 if (!PyTuple_Check(sa)) {
6106 PyErr_SetString(PyExc_TypeError,
6107 "getnameinfo() argument 1 must be a tuple");
6108 return NULL;
6109 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006110 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 &hostp, &port, &flowinfo, &scope_id))
6112 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006113 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006114 PyErr_SetString(PyExc_OverflowError,
6115 "getsockaddrarg: flowinfo must be 0-1048575.");
6116 return NULL;
6117 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6119 memset(&hints, 0, sizeof(hints));
6120 hints.ai_family = AF_UNSPEC;
6121 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006122 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 Py_BEGIN_ALLOW_THREADS
6124 ACQUIRE_GETADDRINFO_LOCK
6125 error = getaddrinfo(hostp, pbuf, &hints, &res);
6126 Py_END_ALLOW_THREADS
6127 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6128 if (error) {
6129 set_gaierror(error);
6130 goto fail;
6131 }
6132 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006133 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 "sockaddr resolved to multiple addresses");
6135 goto fail;
6136 }
6137 switch (res->ai_family) {
6138 case AF_INET:
6139 {
6140 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006141 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 "IPv4 sockaddr must be 2 tuple");
6143 goto fail;
6144 }
6145 break;
6146 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006147#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 case AF_INET6:
6149 {
6150 struct sockaddr_in6 *sin6;
6151 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006152 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 sin6->sin6_scope_id = scope_id;
6154 break;
6155 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006158 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6160 if (error) {
6161 set_gaierror(error);
6162 goto fail;
6163 }
Victor Stinner72400302016-01-28 15:41:01 +01006164
6165 name = sock_decode_hostname(hbuf);
6166 if (name == NULL)
6167 goto fail;
6168 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169
6170fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 if (res)
6172 freeaddrinfo(res);
6173 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006174}
6175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006176PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006177"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006178\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006179Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006180
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006181
6182/* Python API to getting and setting the default timeout value. */
6183
6184static PyObject *
6185socket_getdefaulttimeout(PyObject *self)
6186{
Victor Stinner71694d52015-03-28 01:18:54 +01006187 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188 Py_INCREF(Py_None);
6189 return Py_None;
6190 }
Victor Stinner71694d52015-03-28 01:18:54 +01006191 else {
6192 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6193 return PyFloat_FromDouble(seconds);
6194 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006195}
6196
6197PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006198"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006199\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006200Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006201A value of None indicates that new socket objects have no timeout.\n\
6202When the socket module is first imported, the default is None.");
6203
6204static PyObject *
6205socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6206{
Victor Stinner71694d52015-03-28 01:18:54 +01006207 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006208
Victor Stinner71694d52015-03-28 01:18:54 +01006209 if (socket_parse_timeout(&timeout, arg) < 0)
6210 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 Py_INCREF(Py_None);
6215 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006216}
6217
6218PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006219"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006220\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006221Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006222A value of None indicates that new socket objects have no timeout.\n\
6223When the socket module is first imported, the default is None.");
6224
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006225#ifdef HAVE_IF_NAMEINDEX
6226/* Python API for getting interface indices and names */
6227
6228static PyObject *
6229socket_if_nameindex(PyObject *self, PyObject *arg)
6230{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006231 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006232 int i;
6233 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006234
Charles-François Natali60713592011-05-20 16:55:06 +02006235 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006237 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006238 return NULL;
6239 }
6240
6241 list = PyList_New(0);
6242 if (list == NULL) {
6243 if_freenameindex(ni);
6244 return NULL;
6245 }
6246
Charles-François Natali60713592011-05-20 16:55:06 +02006247 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6248 PyObject *ni_tuple = Py_BuildValue("IO&",
6249 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006250
6251 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6252 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006253 Py_DECREF(list);
6254 if_freenameindex(ni);
6255 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006256 }
6257 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006258 }
6259
6260 if_freenameindex(ni);
6261 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006262}
6263
6264PyDoc_STRVAR(if_nameindex_doc,
6265"if_nameindex()\n\
6266\n\
6267Returns a list of network interface information (index, name) tuples.");
6268
Charles-François Natali60713592011-05-20 16:55:06 +02006269static PyObject *
6270socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006271{
Charles-François Natali60713592011-05-20 16:55:06 +02006272 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006273 unsigned long index;
6274
Charles-François Natali60713592011-05-20 16:55:06 +02006275 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6276 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006277 return NULL;
6278
Charles-François Natali60713592011-05-20 16:55:06 +02006279 index = if_nametoindex(PyBytes_AS_STRING(oname));
6280 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006281 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006282 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006283 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006284 return NULL;
6285 }
6286
6287 return PyLong_FromUnsignedLong(index);
6288}
6289
6290PyDoc_STRVAR(if_nametoindex_doc,
6291"if_nametoindex(if_name)\n\
6292\n\
6293Returns the interface index corresponding to the interface name if_name.");
6294
Charles-François Natali60713592011-05-20 16:55:06 +02006295static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006296socket_if_indextoname(PyObject *self, PyObject *arg)
6297{
Charles-François Natali60713592011-05-20 16:55:06 +02006298 unsigned long index;
6299 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006300
Charles-François Natali60713592011-05-20 16:55:06 +02006301 index = PyLong_AsUnsignedLong(arg);
6302 if (index == (unsigned long) -1)
6303 return NULL;
6304
6305 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006306 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006307 return NULL;
6308 }
6309
Charles-François Natali60713592011-05-20 16:55:06 +02006310 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006311}
6312
6313PyDoc_STRVAR(if_indextoname_doc,
6314"if_indextoname(if_index)\n\
6315\n\
6316Returns the interface name corresponding to the interface index if_index.");
6317
6318#endif /* HAVE_IF_NAMEINDEX */
6319
6320
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006321#ifdef CMSG_LEN
6322/* Python interface to CMSG_LEN(length). */
6323
6324static PyObject *
6325socket_CMSG_LEN(PyObject *self, PyObject *args)
6326{
6327 Py_ssize_t length;
6328 size_t result;
6329
6330 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6331 return NULL;
6332 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6333 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6334 return NULL;
6335 }
6336 return PyLong_FromSize_t(result);
6337}
6338
6339PyDoc_STRVAR(CMSG_LEN_doc,
6340"CMSG_LEN(length) -> control message length\n\
6341\n\
6342Return the total length, without trailing padding, of an ancillary\n\
6343data item with associated data of the given length. This value can\n\
6344often be used as the buffer size for recvmsg() to receive a single\n\
6345item of ancillary data, but RFC 3542 requires portable applications to\n\
6346use CMSG_SPACE() and thus include space for padding, even when the\n\
6347item will be the last in the buffer. Raises OverflowError if length\n\
6348is outside the permissible range of values.");
6349
6350
6351#ifdef CMSG_SPACE
6352/* Python interface to CMSG_SPACE(length). */
6353
6354static PyObject *
6355socket_CMSG_SPACE(PyObject *self, PyObject *args)
6356{
6357 Py_ssize_t length;
6358 size_t result;
6359
6360 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6361 return NULL;
6362 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6363 PyErr_SetString(PyExc_OverflowError,
6364 "CMSG_SPACE() argument out of range");
6365 return NULL;
6366 }
6367 return PyLong_FromSize_t(result);
6368}
6369
6370PyDoc_STRVAR(CMSG_SPACE_doc,
6371"CMSG_SPACE(length) -> buffer size\n\
6372\n\
6373Return the buffer size needed for recvmsg() to receive an ancillary\n\
6374data item with associated data of the given length, along with any\n\
6375trailing padding. The buffer space needed to receive multiple items\n\
6376is the sum of the CMSG_SPACE() values for their associated data\n\
6377lengths. Raises OverflowError if length is outside the permissible\n\
6378range of values.");
6379#endif /* CMSG_SPACE */
6380#endif /* CMSG_LEN */
6381
6382
Guido van Rossum30a685f1991-06-27 15:51:29 +00006383/* List of functions exported by this module. */
6384
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006385static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 {"gethostbyname", socket_gethostbyname,
6387 METH_VARARGS, gethostbyname_doc},
6388 {"gethostbyname_ex", socket_gethostbyname_ex,
6389 METH_VARARGS, ghbn_ex_doc},
6390 {"gethostbyaddr", socket_gethostbyaddr,
6391 METH_VARARGS, gethostbyaddr_doc},
6392 {"gethostname", socket_gethostname,
6393 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006394#ifdef HAVE_SETHOSTNAME
6395 {"sethostname", socket_sethostname,
6396 METH_VARARGS, sethostname_doc},
6397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 {"getservbyname", socket_getservbyname,
6399 METH_VARARGS, getservbyname_doc},
6400 {"getservbyport", socket_getservbyport,
6401 METH_VARARGS, getservbyport_doc},
6402 {"getprotobyname", socket_getprotobyname,
6403 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006404#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 {"dup", socket_dup,
6406 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006407#endif
Dave Cole331708b2004-08-09 04:51:41 +00006408#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 {"socketpair", socket_socketpair,
6410 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 {"ntohs", socket_ntohs,
6413 METH_VARARGS, ntohs_doc},
6414 {"ntohl", socket_ntohl,
6415 METH_O, ntohl_doc},
6416 {"htons", socket_htons,
6417 METH_VARARGS, htons_doc},
6418 {"htonl", socket_htonl,
6419 METH_O, htonl_doc},
6420 {"inet_aton", socket_inet_aton,
6421 METH_VARARGS, inet_aton_doc},
6422 {"inet_ntoa", socket_inet_ntoa,
6423 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006424#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 {"inet_pton", socket_inet_pton,
6426 METH_VARARGS, inet_pton_doc},
6427 {"inet_ntop", socket_inet_ntop,
6428 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006429#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006430 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6431 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 {"getnameinfo", socket_getnameinfo,
6433 METH_VARARGS, getnameinfo_doc},
6434 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6435 METH_NOARGS, getdefaulttimeout_doc},
6436 {"setdefaulttimeout", socket_setdefaulttimeout,
6437 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006438#ifdef HAVE_IF_NAMEINDEX
6439 {"if_nameindex", socket_if_nameindex,
6440 METH_NOARGS, if_nameindex_doc},
6441 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006442 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006443 {"if_indextoname", socket_if_indextoname,
6444 METH_O, if_indextoname_doc},
6445#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006446#ifdef CMSG_LEN
6447 {"CMSG_LEN", socket_CMSG_LEN,
6448 METH_VARARGS, CMSG_LEN_doc},
6449#ifdef CMSG_SPACE
6450 {"CMSG_SPACE", socket_CMSG_SPACE,
6451 METH_VARARGS, CMSG_SPACE_doc},
6452#endif
6453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006455};
6456
Guido van Rossum30a685f1991-06-27 15:51:29 +00006457
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006458#ifdef MS_WINDOWS
6459#define OS_INIT_DEFINED
6460
6461/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006462
6463static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006464os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006467}
6468
6469static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006470os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 WSADATA WSAData;
6473 int ret;
6474 ret = WSAStartup(0x0101, &WSAData);
6475 switch (ret) {
6476 case 0: /* No error */
6477 Py_AtExit(os_cleanup);
6478 return 1; /* Success */
6479 case WSASYSNOTREADY:
6480 PyErr_SetString(PyExc_ImportError,
6481 "WSAStartup failed: network not ready");
6482 break;
6483 case WSAVERNOTSUPPORTED:
6484 case WSAEINVAL:
6485 PyErr_SetString(
6486 PyExc_ImportError,
6487 "WSAStartup failed: requested version not supported");
6488 break;
6489 default:
6490 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6491 break;
6492 }
6493 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006494}
6495
Guido van Rossum8d665e61996-06-26 18:22:49 +00006496#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006497
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006498
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006499
6500#ifndef OS_INIT_DEFINED
6501static int
6502os_init(void)
6503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006505}
6506#endif
6507
6508
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006509/* C API table - always add new things to the end for binary
6510 compatibility. */
6511static
6512PySocketModule_APIObject PySocketModuleAPI =
6513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006515 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006517};
6518
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006519
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006520/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006521
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006522 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006523 "socket.py" which implements some additional functionality.
6524 The import of "_socket" may fail with an ImportError exception if
6525 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006526 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006527 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006528*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006529
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006530PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006531"Implementation module for socket operations.\n\
6532\n\
6533See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006534
Martin v. Löwis1a214512008-06-11 05:26:20 +00006535static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 PyModuleDef_HEAD_INIT,
6537 PySocket_MODULE_NAME,
6538 socket_doc,
6539 -1,
6540 socket_methods,
6541 NULL,
6542 NULL,
6543 NULL,
6544 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006545};
6546
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006547PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006548PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 if (!os_init())
6553 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006554
Victor Stinnerdaf45552013-08-28 00:53:59 +02006555#ifdef MS_WINDOWS
6556 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006557#if defined(_MSC_VER) && _MSC_VER >= 1800
6558 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6559#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006560 DWORD version = GetVersion();
6561 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6562 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6563 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006564 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6565#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006566 }
6567#endif
6568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 Py_TYPE(&sock_type) = &PyType_Type;
6570 m = PyModule_Create(&socketmodule);
6571 if (m == NULL)
6572 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006573
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006574 Py_INCREF(PyExc_OSError);
6575 PySocketModuleAPI.error = PyExc_OSError;
6576 Py_INCREF(PyExc_OSError);
6577 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006579 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 if (socket_herror == NULL)
6581 return NULL;
6582 Py_INCREF(socket_herror);
6583 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006584 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 NULL);
6586 if (socket_gaierror == NULL)
6587 return NULL;
6588 Py_INCREF(socket_gaierror);
6589 PyModule_AddObject(m, "gaierror", socket_gaierror);
6590 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006591 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 if (socket_timeout == NULL)
6593 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006594 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 Py_INCREF(socket_timeout);
6596 PyModule_AddObject(m, "timeout", socket_timeout);
6597 Py_INCREF((PyObject *)&sock_type);
6598 if (PyModule_AddObject(m, "SocketType",
6599 (PyObject *)&sock_type) != 0)
6600 return NULL;
6601 Py_INCREF((PyObject *)&sock_type);
6602 if (PyModule_AddObject(m, "socket",
6603 (PyObject *)&sock_type) != 0)
6604 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006605
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006606#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006608#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 Py_INCREF(has_ipv6);
6612 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 /* Export C API */
6615 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6616 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6617 ) != 0)
6618 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006621#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006623#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006625#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006627#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006628#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#endif
6632#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006634#endif
6635#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006638#endif
6639#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006642#endif
6643#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006646#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006647#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006650#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006651#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006654#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006655#ifdef HAVE_SOCKADDR_ALG
6656 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6657#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006658#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006661#endif
6662#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006664#endif
6665#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006668#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006669#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006672#endif
6673#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006676#endif
6677#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006680#endif
6681#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006684#endif
6685#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, AF_NETLINK);
6688 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006689#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006691#endif
6692#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006694#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6696 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006697#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006699#endif
6700#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006702#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006703#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006705#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006706#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006708#endif
6709#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006711#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006713#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006715#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006716#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006718#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006719#ifdef NETLINK_CRYPTO
6720 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6721#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006722#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006723#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006726#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006727#ifdef AF_LINK
6728 PyModule_AddIntMacro(m, AF_LINK);
6729#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006730#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006733#endif
6734#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#endif
6738#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006741#endif
6742#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006744 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006745#endif
6746#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006749#endif
6750#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006753#endif
6754#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006757#endif
6758#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006761#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006762
Hye-Shik Chang81268602004-02-02 06:05:24 +00006763#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6765 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6766 PyModule_AddIntMacro(m, BTPROTO_HCI);
6767 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006768#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006770#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006771#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006772#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006774#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6776 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006777#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6780 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006781#endif
6782
Charles-François Natali47413c12011-10-06 19:47:44 +02006783#ifdef AF_CAN
6784 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006786#endif
6787#ifdef PF_CAN
6788 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006790#endif
6791
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006792/* Reliable Datagram Sockets */
6793#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006795#endif
6796#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006798#endif
6799
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006800/* Kernel event messages */
6801#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006803#endif
6804#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006806#endif
6807
Antoine Pitroub156a462010-10-27 20:13:57 +00006808#ifdef AF_PACKET
6809 PyModule_AddIntMacro(m, AF_PACKET);
6810#endif
6811#ifdef PF_PACKET
6812 PyModule_AddIntMacro(m, PF_PACKET);
6813#endif
6814#ifdef PACKET_HOST
6815 PyModule_AddIntMacro(m, PACKET_HOST);
6816#endif
6817#ifdef PACKET_BROADCAST
6818 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6819#endif
6820#ifdef PACKET_MULTICAST
6821 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6822#endif
6823#ifdef PACKET_OTHERHOST
6824 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6825#endif
6826#ifdef PACKET_OUTGOING
6827 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6828#endif
6829#ifdef PACKET_LOOPBACK
6830 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6831#endif
6832#ifdef PACKET_FASTROUTE
6833 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006834#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006835
Christian Heimes043d6f62008-01-07 17:19:16 +00006836#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006839 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6841 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6842 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006843
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6845 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6846 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, SOL_TIPC);
6850 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6851 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6852 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6853 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006854
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6856 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6857 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6858 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6862 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006863#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006866#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6868 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6869 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6870 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6871 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6872 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006873#endif
6874
Christian Heimesdffa3942016-09-05 23:54:41 +02006875#ifdef HAVE_SOCKADDR_ALG
6876 /* Socket options */
6877 PyModule_AddIntMacro(m, ALG_SET_KEY);
6878 PyModule_AddIntMacro(m, ALG_SET_IV);
6879 PyModule_AddIntMacro(m, ALG_SET_OP);
6880 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6881 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6882 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6883
6884 /* Operations */
6885 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6886 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6887 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6888 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6889#endif
6890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, SOCK_STREAM);
6893 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006894/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006895#ifdef SOCK_RAW
6896 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006898#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006900#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006902#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006903#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006905#endif
6906#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006908#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006918#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006919#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006921#endif
6922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006940#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006941#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006972#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006973#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006975#endif
6976#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006978#endif
6979#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006981#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006982#ifdef SO_PASSSEC
6983 PyModule_AddIntMacro(m, SO_PASSSEC);
6984#endif
6985#ifdef SO_PEERSEC
6986 PyModule_AddIntMacro(m, SO_PEERSEC);
6987#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006988#ifdef SO_BINDTODEVICE
6989 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6990#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006991#ifdef SO_PRIORITY
6992 PyModule_AddIntMacro(m, SO_PRIORITY);
6993#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006994#ifdef SO_MARK
6995 PyModule_AddIntMacro(m, SO_MARK);
6996#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006997#ifdef SO_DOMAIN
6998 PyModule_AddIntMacro(m, SO_DOMAIN);
6999#endif
7000#ifdef SO_PROTOCOL
7001 PyModule_AddIntMacro(m, SO_PROTOCOL);
7002#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007004 /* Maximum number of connections for "listen" */
7005#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007007#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007009#endif
7010
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007011 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007012#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007014#endif
7015#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007017#endif
7018#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007020#endif
7021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007022 /* Flags for send, recv */
7023#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007026#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007052#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007053#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007055#endif
7056#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007058#endif
7059#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007061#endif
7062#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007064#endif
7065#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007067#endif
7068#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007070#endif
7071#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007073#endif
7074#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007076#endif
7077#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007079#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007080#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007082#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007084 /* Protocol level and numbers, usable for [gs]etsockopt */
7085#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007087#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007090#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007093#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007094 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007096#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007099#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007100 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007106 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007110#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007115#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007117#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007118#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007120#endif
7121#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7123 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007124#endif
7125#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7127 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7128 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007129
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7131 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7132 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007133#endif
7134#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7136 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7137 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7138 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007139#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007140#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7141 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7142#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007143#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007145 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7146 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7147 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7148 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7149 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7150 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7151 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7152 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7153 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7154 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7155 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7156 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7157#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007158#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007160#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007161#ifdef HAVE_SOCKADDR_ALG
7162 PyModule_AddIntMacro(m, SOL_ALG);
7163#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007164#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007166#endif
7167#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007169#endif
7170#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007172#endif
7173#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007175#endif
7176#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007178#endif
7179#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007182#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007184#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007192#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007212#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007276#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007277#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007285#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007286#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007291#endif
7292/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007295#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007298#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007300#endif
7301
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007302#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007304#endif
7305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306 /* Some port configuration */
7307#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007309#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#endif
7317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318 /* Some reserved IP v.4 addresses */
7319#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007321#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007326#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef INADDR_ALLHOSTS_GROUP
7340 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7341 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007343 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007347#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007352#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007354#endif
7355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007356 /* IPv4 [gs]etsockopt options */
7357#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007369#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007372#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007381#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007396#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007404#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007405#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007407#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7410#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007413#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007422#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007429#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007433#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#endif
7436#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007438#endif
7439#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007441#endif
7442#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#endif
7445#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007447#endif
7448#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007450#endif
7451#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007453#endif
7454#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007456#endif
7457#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007459#endif
7460#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007462#endif
7463#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007465#endif
7466#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007468#endif
7469#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007471#endif
7472#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007474#endif
7475#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007477#endif
7478#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007480#endif
7481#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007483#endif
7484#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007486#endif
7487#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007489#endif
7490#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007492#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494 /* TCP options */
7495#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007501#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007530#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007531#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007533#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535 /* IPX options */
7536#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007538#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007539
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007540/* Reliable Datagram Sockets */
7541#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007543#endif
7544#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007546#endif
7547#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007549#endif
7550#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007552#endif
7553#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007555#endif
7556#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007558#endif
7559#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007561#endif
7562#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007564#endif
7565#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007567#endif
7568#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007570#endif
7571#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007573#endif
7574#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007576#endif
7577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007579#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007581#endif
7582#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007584#endif
7585#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#endif
7588#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007603#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007606#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007611#endif
7612#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007614#endif
7615#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#endif
7618#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007620#endif
7621#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007623#endif
7624#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007626#endif
7627#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007629#endif
7630#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007632#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007633#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007635#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007636#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007638#endif
7639#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007641#endif
7642#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007644#endif
7645#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007647#endif
7648#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007650#endif
7651#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007653#endif
7654#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007656#endif
7657#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007659#endif
7660#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007662#endif
7663#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007665#endif
7666#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007668#endif
7669#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007671#endif
7672#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007674#endif
7675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007676 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007677#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007679#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007680 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007682 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007683#endif
7684#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007686#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007687 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007688#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007689 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007690#endif
7691#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007693#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007694 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007695#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007697#endif
7698
Christian Heimesfaf2f632008-01-06 16:59:19 +00007699#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007701 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7702#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007703 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007704#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007705 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007706 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7707#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007708 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007709#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007710 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007712 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007713 PyObject *tmp;
7714 tmp = PyLong_FromUnsignedLong(codes[i]);
7715 if (tmp == NULL)
7716 return NULL;
7717 PyModule_AddObject(m, names[i], tmp);
7718 }
7719 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007720 PyModule_AddIntMacro(m, RCVALL_OFF);
7721 PyModule_AddIntMacro(m, RCVALL_ON);
7722 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007723#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007725#endif
7726#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007728#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007729#endif /* _MSTCPIP_ */
7730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007731 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007732#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007736}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007737
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007738
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007739#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007740#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007741
7742/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007743/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007744
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007745int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007746inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007747{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007749#if (SIZEOF_INT != 4)
7750#error "Not sure if in_addr_t exists and int is not 32-bits."
7751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007752 unsigned int packed_addr;
7753 packed_addr = inet_addr(src);
7754 if (packed_addr == INADDR_NONE)
7755 return 0;
7756 memcpy(dst, &packed_addr, 4);
7757 return 1;
7758 }
7759 /* Should set errno to EAFNOSUPPORT */
7760 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007761}
7762
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007763const char *
7764inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766 if (af == AF_INET) {
7767 struct in_addr packed_addr;
7768 if (size < 16)
7769 /* Should set errno to ENOSPC. */
7770 return NULL;
7771 memcpy(&packed_addr, src, sizeof(packed_addr));
7772 return strncpy(dst, inet_ntoa(packed_addr), size);
7773 }
7774 /* Should set errno to EAFNOSUPPORT */
7775 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007776}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007777
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007778#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007779#endif