blob: 1f529228b7bfa35856969642d3121b0378dec31b [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;
643 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100644#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
646 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100647 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 else
Victor Stinner9a954832013-12-04 00:41:24 +0100649 new_delay_flag = delay_flag | O_NONBLOCK;
650 if (new_delay_flag != delay_flag)
651 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
652#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200654 arg = !block;
655 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* Since these don't return anything */
660 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661}
662
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000663static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200664internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
665 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100668#ifdef HAVE_POLL
669 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200670 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100671#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200672 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200673 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100674#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000675
Victor Stinnerb7df3142015-03-27 22:59:32 +0100676#ifdef WITH_THREAD
677 /* must be called with the GIL held */
678 assert(PyGILState_Check());
679#endif
680
Victor Stinner416f2e62015-03-31 13:56:29 +0200681 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200682 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200685 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* Prefer poll, if available, since you can poll() any fd
689 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100691 pollfd.fd = s->sock_fd;
692 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200693 if (connect) {
694 /* On Windows, the socket becomes writable on connection success,
695 but a connection failure is notified as an error. On POSIX, the
696 socket becomes writable on connection success or on connection
697 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200698 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200699 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000700
Victor Stinner71694d52015-03-28 01:18:54 +0100701 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200702 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200703 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000704
Victor Stinner71694d52015-03-28 01:18:54 +0100705 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200706 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100707 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000708#else
Victor Stinnerced11742015-04-09 10:27:25 +0200709 if (interval >= 0) {
710 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
711 tvp = &tv;
712 }
713 else
714 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Victor Stinner71694d52015-03-28 01:18:54 +0100716 FD_ZERO(&fds);
717 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200718 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200719 if (connect) {
720 /* On Windows, the socket becomes writable on connection success,
721 but a connection failure is notified as an error. On POSIX, the
722 socket becomes writable on connection success or on connection
723 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200724 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200725 }
Victor Stinner71694d52015-03-28 01:18:54 +0100726
727 /* See if the socket is ready */
728 Py_BEGIN_ALLOW_THREADS;
729 if (writing)
730 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200731 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100732 else
733 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200734 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100735 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000736#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 if (n < 0)
739 return -1;
740 if (n == 0)
741 return 1;
742 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000743}
744
Victor Stinner31bf2d52015-04-01 21:57:09 +0200745/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000746
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 On error, raise an exception and return -1 if err is set, or fill err and
748 return -1 otherwise. If a signal was received and the signal handler raised
749 an exception, return -1, and set err to -1 if err is set.
750
751 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100752
Victor Stinner31bf2d52015-04-01 21:57:09 +0200753 If the socket has a timeout, wait until the socket is ready before calling
754 the function: wait until the socket is writable if writing is nonzero, wait
755 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100756
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200758 the function, except if the signal handler raised an exception (PEP 475).
759
760 When the function is retried, recompute the timeout using a monotonic clock.
761
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 sock_call_ex() must be called with the GIL held. The socket function is
763 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200765sock_call_ex(PySocketSockObject *s,
766 int writing,
767 int (*sock_func) (PySocketSockObject *s, void *data),
768 void *data,
769 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200770 int *err,
771 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200772{
Victor Stinner8912d142015-04-06 23:16:34 +0200773 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200774 _PyTime_t deadline = 0;
775 int deadline_initialized = 0;
776 int res;
777
Victor Stinner92f01132015-10-11 09:54:42 +0200778#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200779 /* sock_call() must be called with the GIL held. */
780 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200781#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200782
783 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200784 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200786 /* For connect(), poll even for blocking socket. The connection
787 runs asynchronously. */
788 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200789 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200790 _PyTime_t interval;
791
Victor Stinner81c41db2015-04-02 11:50:57 +0200792 if (deadline_initialized) {
793 /* recompute the timeout */
794 interval = deadline - _PyTime_GetMonotonicClock();
795 }
796 else {
797 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200798 deadline = _PyTime_GetMonotonicClock() + timeout;
799 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200801
Victor Stinner10550cd2015-04-03 13:22:27 +0200802 if (interval >= 0)
803 res = internal_select(s, writing, interval, connect);
804 else
805 res = 1;
806 }
807 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200808 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200809 }
810
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 if (err)
813 *err = GET_SOCK_ERROR;
814
Victor Stinner31bf2d52015-04-01 21:57:09 +0200815 if (CHECK_ERRNO(EINTR)) {
816 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 if (PyErr_CheckSignals()) {
818 if (err)
819 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822
823 /* retry select() */
824 continue;
825 }
826
827 /* select() failed */
828 s->errorhandler();
829 return -1;
830 }
831
832 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 if (err)
834 *err = SOCK_TIMEOUT_ERR;
835 else
836 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 return -1;
838 }
839
840 /* the socket is ready */
841 }
842
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 /* inner loop to retry sock_func() when sock_func() is interrupted
844 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200845 while (1) {
846 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200847 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848 Py_END_ALLOW_THREADS
849
850 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200851 /* sock_func() succeeded */
852 if (err)
853 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854 return 0;
855 }
856
Victor Stinner81c41db2015-04-02 11:50:57 +0200857 if (err)
858 *err = GET_SOCK_ERROR;
859
Victor Stinner31bf2d52015-04-01 21:57:09 +0200860 if (!CHECK_ERRNO(EINTR))
861 break;
862
Victor Stinner81c41db2015-04-02 11:50:57 +0200863 /* sock_func() was interrupted by a signal */
864 if (PyErr_CheckSignals()) {
865 if (err)
866 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200867 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200868 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200869
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200871 }
872
873 if (s->sock_timeout > 0
874 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200875 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876
877 For example, select() could indicate a socket is ready for
878 reading, but the data then discarded by the OS because of a
879 wrong checksum.
880
881 Loop on select() to recheck for socket readyness. */
882 continue;
883 }
884
Victor Stinner81c41db2015-04-02 11:50:57 +0200885 /* sock_func() failed */
886 if (!err)
887 s->errorhandler();
888 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000889 return -1;
890 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000892
Victor Stinner81c41db2015-04-02 11:50:57 +0200893static int
894sock_call(PySocketSockObject *s,
895 int writing,
896 int (*func) (PySocketSockObject *s, void *data),
897 void *data)
898{
Victor Stinner8912d142015-04-06 23:16:34 +0200899 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200900}
901
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000902
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000903/* Initialize a new socket object. */
904
Victor Stinner88ed6402015-04-09 10:23:12 +0200905/* Default timeout for new sockets */
906static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000907
Martin v. Löwis1a214512008-06-11 05:26:20 +0000908static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000909init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 s->sock_fd = fd;
913 s->sock_family = family;
914 s->sock_type = type;
915 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000918#ifdef SOCK_NONBLOCK
919 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100920 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000921 else
922#endif
923 {
924 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100925 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000926 internal_setblocking(s, 0);
927 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000928
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000929}
930
931
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932/* Create a new socket object.
933 This just creates the object and initializes it.
934 If the creation fails, return NULL and set an exception (implicit
935 in NEWOBJ()). */
936
Guido van Rossum73624e91994-10-10 17:59:00 +0000937static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000938new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 PySocketSockObject *s;
941 s = (PySocketSockObject *)
942 PyType_GenericNew(&sock_type, NULL, NULL);
943 if (s != NULL)
944 init_sockobject(s, fd, family, type, proto);
945 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946}
947
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948
Guido van Rossum48a680c2001-03-02 06:34:14 +0000949/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000950 thread to be in gethostbyname or getaddrinfo */
951#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200952static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000953#endif
954
955
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956/* Convert a string specifying a host name or one of a few symbolic
957 names to a numeric IP address. This usually calls gethostbyname()
958 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000959 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000960 an error occurred; then an exception is raised. */
961
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200963setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 struct addrinfo hints, *res;
966 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
969 if (name[0] == '\0') {
970 int siz;
971 memset(&hints, 0, sizeof(hints));
972 hints.ai_family = af;
973 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
974 hints.ai_flags = AI_PASSIVE;
975 Py_BEGIN_ALLOW_THREADS
976 ACQUIRE_GETADDRINFO_LOCK
977 error = getaddrinfo(NULL, "0", &hints, &res);
978 Py_END_ALLOW_THREADS
979 /* We assume that those thread-unsafe getaddrinfo() versions
980 *are* safe regarding their return value, ie. that a
981 subsequent call to getaddrinfo() does not destroy the
982 outcome of the first call. */
983 RELEASE_GETADDRINFO_LOCK
984 if (error) {
985 set_gaierror(error);
986 return -1;
987 }
988 switch (res->ai_family) {
989 case AF_INET:
990 siz = 4;
991 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000992#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 case AF_INET6:
994 siz = 16;
995 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 default:
998 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200999 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 "unsupported address family");
1001 return -1;
1002 }
1003 if (res->ai_next) {
1004 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001005 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 "wildcard resolved to multiple address");
1007 return -1;
1008 }
1009 if (res->ai_addrlen < addr_ret_size)
1010 addr_ret_size = res->ai_addrlen;
1011 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1012 freeaddrinfo(res);
1013 return siz;
1014 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001015 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001016 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001017 if (strcmp(name, "255.255.255.255") == 0 ||
1018 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 struct sockaddr_in *sin;
1020 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001021 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 "address family mismatched");
1023 return -1;
1024 }
1025 sin = (struct sockaddr_in *)addr_ret;
1026 memset((void *) sin, '\0', sizeof(*sin));
1027 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001028#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 sin->sin_addr.s_addr = INADDR_BROADCAST;
1032 return sizeof(sin->sin_addr);
1033 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001034
1035 /* avoid a name resolution in case of numeric address */
1036#ifdef HAVE_INET_PTON
1037 /* check for an IPv4 address */
1038 if (af == AF_UNSPEC || af == AF_INET) {
1039 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1040 memset(sin, 0, sizeof(*sin));
1041 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1042 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001043#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001044 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001045#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001046 return 4;
1047 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001049#ifdef ENABLE_IPV6
1050 /* check for an IPv6 address - if the address contains a scope ID, we
1051 * fallback to getaddrinfo(), which can handle translation from interface
1052 * name to interface index */
1053 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1054 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1055 memset(sin, 0, sizeof(*sin));
1056 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1057 sin->sin6_family = AF_INET6;
1058#ifdef HAVE_SOCKADDR_SA_LEN
1059 sin->sin6_len = sizeof(*sin);
1060#endif
1061 return 16;
1062 }
1063 }
1064#endif /* ENABLE_IPV6 */
1065#else /* HAVE_INET_PTON */
1066 /* check for an IPv4 address */
1067 if (af == AF_INET || af == AF_UNSPEC) {
1068 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1069 memset(sin, 0, sizeof(*sin));
1070 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1071 sin->sin_family = AF_INET;
1072#ifdef HAVE_SOCKADDR_SA_LEN
1073 sin->sin_len = sizeof(*sin);
1074#endif
1075 return 4;
1076 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001077 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001078#endif /* HAVE_INET_PTON */
1079
1080 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 memset(&hints, 0, sizeof(hints));
1082 hints.ai_family = af;
1083 Py_BEGIN_ALLOW_THREADS
1084 ACQUIRE_GETADDRINFO_LOCK
1085 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001086#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 if (error == EAI_NONAME && af == AF_UNSPEC) {
1088 /* On Tru64 V5.1, numeric-to-addr conversion fails
1089 if no address family is given. Assume IPv4 for now.*/
1090 hints.ai_family = AF_INET;
1091 error = getaddrinfo(name, NULL, &hints, &res);
1092 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 Py_END_ALLOW_THREADS
1095 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1096 if (error) {
1097 set_gaierror(error);
1098 return -1;
1099 }
1100 if (res->ai_addrlen < addr_ret_size)
1101 addr_ret_size = res->ai_addrlen;
1102 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1103 freeaddrinfo(res);
1104 switch (addr_ret->sa_family) {
1105 case AF_INET:
1106 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001107#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 case AF_INET6:
1109 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001112 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 return -1;
1114 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115}
1116
Guido van Rossum30a685f1991-06-27 15:51:29 +00001117
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118/* Create a string object representing an IP address.
1119 This is always a string of the form 'dd.dd.dd.dd' (with variable
1120 size numbers). */
1121
Guido van Rossum73624e91994-10-10 17:59:00 +00001122static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001123makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 char buf[NI_MAXHOST];
1126 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1129 NI_NUMERICHOST);
1130 if (error) {
1131 set_gaierror(error);
1132 return NULL;
1133 }
1134 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135}
1136
1137
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001138#ifdef USE_BLUETOOTH
1139/* Convert a string representation of a Bluetooth address into a numeric
1140 address. Returns the length (6), or raises an exception and returns -1 if
1141 an error occurred. */
1142
1143static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001144setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 unsigned int b0, b1, b2, b3, b4, b5;
1147 char ch;
1148 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1151 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1152 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1153 bdaddr->b[0] = b0;
1154 bdaddr->b[1] = b1;
1155 bdaddr->b[2] = b2;
1156 bdaddr->b[3] = b3;
1157 bdaddr->b[4] = b4;
1158 bdaddr->b[5] = b5;
1159 return 6;
1160 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001161 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 return -1;
1163 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001164}
1165
1166/* Create a string representation of the Bluetooth address. This is always a
1167 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1168 value (zero padded if necessary). */
1169
1170static PyObject *
1171makebdaddr(bdaddr_t *bdaddr)
1172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1176 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1177 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1178 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001179}
1180#endif
1181
1182
Guido van Rossum30a685f1991-06-27 15:51:29 +00001183/* Create an object representing the given socket address,
1184 suitable for passing it back to bind(), connect() etc.
1185 The family field of the sockaddr structure is inspected
1186 to determine what kind of address it really is. */
1187
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001190makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 if (addrlen == 0) {
1193 /* No address -- may be recvfrom() from known socket */
1194 Py_INCREF(Py_None);
1195 return Py_None;
1196 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 case AF_INET:
1201 {
1202 struct sockaddr_in *a;
1203 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1204 PyObject *ret = NULL;
1205 if (addrobj) {
1206 a = (struct sockaddr_in *)addr;
1207 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1208 Py_DECREF(addrobj);
1209 }
1210 return ret;
1211 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001213#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 case AF_UNIX:
1215 {
1216 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001217#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1219 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001220 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 }
1222 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001223#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 {
1225 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001226 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 }
1228 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001229#endif /* AF_UNIX */
1230
Martin v. Löwis11017b12006-01-14 18:12:57 +00001231#if defined(AF_NETLINK)
1232 case AF_NETLINK:
1233 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1235 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001236 }
1237#endif /* AF_NETLINK */
1238
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001239#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 case AF_INET6:
1241 {
1242 struct sockaddr_in6 *a;
1243 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1244 PyObject *ret = NULL;
1245 if (addrobj) {
1246 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001247 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 addrobj,
1249 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001250 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 a->sin6_scope_id);
1252 Py_DECREF(addrobj);
1253 }
1254 return ret;
1255 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001256#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 case AF_BLUETOOTH:
1260 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 case BTPROTO_L2CAP:
1263 {
1264 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1265 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1266 PyObject *ret = NULL;
1267 if (addrobj) {
1268 ret = Py_BuildValue("Oi",
1269 addrobj,
1270 _BT_L2_MEMB(a, psm));
1271 Py_DECREF(addrobj);
1272 }
1273 return ret;
1274 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 case BTPROTO_RFCOMM:
1277 {
1278 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1279 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1280 PyObject *ret = NULL;
1281 if (addrobj) {
1282 ret = Py_BuildValue("Oi",
1283 addrobj,
1284 _BT_RC_MEMB(a, channel));
1285 Py_DECREF(addrobj);
1286 }
1287 return ret;
1288 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case BTPROTO_HCI:
1291 {
1292 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001293#if defined(__NetBSD__) || defined(__DragonFly__)
1294 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1295#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyObject *ret = NULL;
1297 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1298 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001301
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 case BTPROTO_SCO:
1304 {
1305 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1306 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1307 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001308#endif
1309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 default:
1311 PyErr_SetString(PyExc_ValueError,
1312 "Unknown Bluetooth protocol");
1313 return NULL;
1314 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001315#endif
1316
Antoine Pitroub156a462010-10-27 20:13:57 +00001317#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 case AF_PACKET:
1319 {
1320 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1321 char *ifname = "";
1322 struct ifreq ifr;
1323 /* need to look up interface name give index */
1324 if (a->sll_ifindex) {
1325 ifr.ifr_ifindex = a->sll_ifindex;
1326 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1327 ifname = ifr.ifr_name;
1328 }
1329 return Py_BuildValue("shbhy#",
1330 ifname,
1331 ntohs(a->sll_protocol),
1332 a->sll_pkttype,
1333 a->sll_hatype,
1334 a->sll_addr,
1335 a->sll_halen);
1336 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001337#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001338
Christian Heimes043d6f62008-01-07 17:19:16 +00001339#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 case AF_TIPC:
1341 {
1342 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1343 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1344 return Py_BuildValue("IIIII",
1345 a->addrtype,
1346 a->addr.nameseq.type,
1347 a->addr.nameseq.lower,
1348 a->addr.nameseq.upper,
1349 a->scope);
1350 } else if (a->addrtype == TIPC_ADDR_NAME) {
1351 return Py_BuildValue("IIIII",
1352 a->addrtype,
1353 a->addr.name.name.type,
1354 a->addr.name.name.instance,
1355 a->addr.name.name.instance,
1356 a->scope);
1357 } else if (a->addrtype == TIPC_ADDR_ID) {
1358 return Py_BuildValue("IIIII",
1359 a->addrtype,
1360 a->addr.id.node,
1361 a->addr.id.ref,
1362 0,
1363 a->scope);
1364 } else {
1365 PyErr_SetString(PyExc_ValueError,
1366 "Invalid address type");
1367 return NULL;
1368 }
1369 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001370#endif
1371
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001372#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001373 case AF_CAN:
1374 {
1375 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1376 char *ifname = "";
1377 struct ifreq ifr;
1378 /* need to look up interface name given index */
1379 if (a->can_ifindex) {
1380 ifr.ifr_ifindex = a->can_ifindex;
1381 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1382 ifname = ifr.ifr_name;
1383 }
1384
1385 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1386 ifname,
1387 a->can_family);
1388 }
1389#endif
1390
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001391#ifdef PF_SYSTEM
1392 case PF_SYSTEM:
1393 switch(proto) {
1394#ifdef SYSPROTO_CONTROL
1395 case SYSPROTO_CONTROL:
1396 {
1397 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1398 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1399 }
1400#endif
1401 default:
1402 PyErr_SetString(PyExc_ValueError,
1403 "Invalid address type");
1404 return 0;
1405 }
1406#endif
1407
Christian Heimesdffa3942016-09-05 23:54:41 +02001408#ifdef HAVE_SOCKADDR_ALG
1409 case AF_ALG:
1410 {
1411 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1412 return Py_BuildValue("s#s#HH",
1413 a->salg_type,
1414 strnlen((const char*)a->salg_type,
1415 sizeof(a->salg_type)),
1416 a->salg_name,
1417 strnlen((const char*)a->salg_name,
1418 sizeof(a->salg_name)),
1419 a->salg_feat,
1420 a->salg_mask);
1421 }
1422#endif
1423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 default:
1427 /* If we don't know the address family, don't raise an
1428 exception -- return it as an (int, bytes) tuple. */
1429 return Py_BuildValue("iy#",
1430 addr->sa_family,
1431 addr->sa_data,
1432 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435}
1436
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001437/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1438 (in particular, numeric IP addresses). */
1439struct maybe_idna {
1440 PyObject *obj;
1441 char *buf;
1442};
1443
1444static void
1445idna_cleanup(struct maybe_idna *data)
1446{
1447 Py_CLEAR(data->obj);
1448}
1449
1450static int
1451idna_converter(PyObject *obj, struct maybe_idna *data)
1452{
1453 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001454 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455 if (obj == NULL) {
1456 idna_cleanup(data);
1457 return 1;
1458 }
1459 data->obj = NULL;
1460 len = -1;
1461 if (PyBytes_Check(obj)) {
1462 data->buf = PyBytes_AsString(obj);
1463 len = PyBytes_Size(obj);
1464 }
1465 else if (PyByteArray_Check(obj)) {
1466 data->buf = PyByteArray_AsString(obj);
1467 len = PyByteArray_Size(obj);
1468 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001469 else if (PyUnicode_Check(obj)) {
1470 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1471 data->buf = PyUnicode_DATA(obj);
1472 len = PyUnicode_GET_LENGTH(obj);
1473 }
1474 else {
1475 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1476 if (!obj2) {
1477 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1478 return 0;
1479 }
1480 assert(PyBytes_Check(obj2));
1481 data->obj = obj2;
1482 data->buf = PyBytes_AS_STRING(obj2);
1483 len = PyBytes_GET_SIZE(obj2);
1484 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001485 }
1486 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001487 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1488 obj->ob_type->tp_name);
1489 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001490 }
1491 if (strlen(data->buf) != len) {
1492 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001493 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001494 return 0;
1495 }
1496 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001497}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001498
1499/* Parse a socket address argument according to the socket object's
1500 address family. Return 1 if the address was in the proper format,
1501 0 of not. The address is returned through addr_ret, its length
1502 through len_ret. */
1503
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001504static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001505getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001509
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001510#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 case AF_UNIX:
1512 {
1513 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001514 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001515 int retval = 0;
1516
1517 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1518 allow embedded nulls on Linux. */
1519 if (PyUnicode_Check(args)) {
1520 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1521 return 0;
1522 }
1523 else
1524 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001525 if (!PyArg_Parse(args, "y*", &path)) {
1526 Py_DECREF(args);
1527 return retval;
1528 }
1529 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001532#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001533 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001535 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001536 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001538 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 }
1540 }
1541 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 {
1544 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001545 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001546 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001548 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001550 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 }
1552 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 memcpy(addr->sun_path, path.buf, path.len);
1554 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001555 retval = 1;
1556 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001557 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001558 Py_DECREF(args);
1559 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001561#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001562
Martin v. Löwis11017b12006-01-14 18:12:57 +00001563#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 case AF_NETLINK:
1565 {
1566 struct sockaddr_nl* addr;
1567 int pid, groups;
1568 addr = (struct sockaddr_nl *)addr_ret;
1569 if (!PyTuple_Check(args)) {
1570 PyErr_Format(
1571 PyExc_TypeError,
1572 "getsockaddrarg: "
1573 "AF_NETLINK address must be tuple, not %.500s",
1574 Py_TYPE(args)->tp_name);
1575 return 0;
1576 }
1577 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1578 return 0;
1579 addr->nl_family = AF_NETLINK;
1580 addr->nl_pid = pid;
1581 addr->nl_groups = groups;
1582 *len_ret = sizeof(*addr);
1583 return 1;
1584 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001585#endif
1586
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001587#ifdef AF_RDS
1588 case AF_RDS:
1589 /* RDS sockets use sockaddr_in: fall-through */
1590#endif
1591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 case AF_INET:
1593 {
1594 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001595 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 int port, result;
1597 if (!PyTuple_Check(args)) {
1598 PyErr_Format(
1599 PyExc_TypeError,
1600 "getsockaddrarg: "
1601 "AF_INET address must be tuple, not %.500s",
1602 Py_TYPE(args)->tp_name);
1603 return 0;
1604 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001605 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1606 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 return 0;
1608 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001609 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001611 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 if (result < 0)
1613 return 0;
1614 if (port < 0 || port > 0xffff) {
1615 PyErr_SetString(
1616 PyExc_OverflowError,
1617 "getsockaddrarg: port must be 0-65535.");
1618 return 0;
1619 }
1620 addr->sin_family = AF_INET;
1621 addr->sin_port = htons((short)port);
1622 *len_ret = sizeof *addr;
1623 return 1;
1624 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001625
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001626#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 case AF_INET6:
1628 {
1629 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001630 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001631 int port, result;
1632 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 flowinfo = scope_id = 0;
1634 if (!PyTuple_Check(args)) {
1635 PyErr_Format(
1636 PyExc_TypeError,
1637 "getsockaddrarg: "
1638 "AF_INET6 address must be tuple, not %.500s",
1639 Py_TYPE(args)->tp_name);
1640 return 0;
1641 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001642 if (!PyArg_ParseTuple(args, "O&i|II",
1643 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 &scope_id)) {
1645 return 0;
1646 }
1647 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001648 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001650 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 if (result < 0)
1652 return 0;
1653 if (port < 0 || port > 0xffff) {
1654 PyErr_SetString(
1655 PyExc_OverflowError,
1656 "getsockaddrarg: port must be 0-65535.");
1657 return 0;
1658 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001659 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001660 PyErr_SetString(
1661 PyExc_OverflowError,
1662 "getsockaddrarg: flowinfo must be 0-1048575.");
1663 return 0;
1664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 addr->sin6_family = s->sock_family;
1666 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001667 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 addr->sin6_scope_id = scope_id;
1669 *len_ret = sizeof *addr;
1670 return 1;
1671 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001672#endif
1673
Hye-Shik Chang81268602004-02-02 06:05:24 +00001674#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 case AF_BLUETOOTH:
1676 {
1677 switch (s->sock_proto) {
1678 case BTPROTO_L2CAP:
1679 {
1680 struct sockaddr_l2 *addr;
1681 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 addr = (struct sockaddr_l2 *)addr_ret;
1684 memset(addr, 0, sizeof(struct sockaddr_l2));
1685 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1686 if (!PyArg_ParseTuple(args, "si", &straddr,
1687 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 "wrong format");
1690 return 0;
1691 }
1692 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1693 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 *len_ret = sizeof *addr;
1696 return 1;
1697 }
1698 case BTPROTO_RFCOMM:
1699 {
1700 struct sockaddr_rc *addr;
1701 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 addr = (struct sockaddr_rc *)addr_ret;
1704 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1705 if (!PyArg_ParseTuple(args, "si", &straddr,
1706 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001707 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 "wrong format");
1709 return 0;
1710 }
1711 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1712 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 *len_ret = sizeof *addr;
1715 return 1;
1716 }
1717 case BTPROTO_HCI:
1718 {
1719 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001720#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001721 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001722
Alexander Belopolskye239d232010-12-08 23:31:48 +00001723 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001724 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001726 "wrong format");
1727 return 0;
1728 }
1729 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1730 return 0;
1731#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1733 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001734 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 "wrong format");
1736 return 0;
1737 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 *len_ret = sizeof *addr;
1740 return 1;
1741 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001742#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 case BTPROTO_SCO:
1744 {
1745 struct sockaddr_sco *addr;
1746 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 addr = (struct sockaddr_sco *)addr_ret;
1749 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1750 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001751 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 "wrong format");
1753 return 0;
1754 }
1755 straddr = PyBytes_AS_STRING(args);
1756 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1757 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 *len_ret = sizeof *addr;
1760 return 1;
1761 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001764 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return 0;
1766 }
1767 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001768#endif
1769
Antoine Pitroub156a462010-10-27 20:13:57 +00001770#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 case AF_PACKET:
1772 {
1773 struct sockaddr_ll* addr;
1774 struct ifreq ifr;
1775 char *interfaceName;
1776 int protoNumber;
1777 int hatype = 0;
1778 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001779 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 if (!PyTuple_Check(args)) {
1782 PyErr_Format(
1783 PyExc_TypeError,
1784 "getsockaddrarg: "
1785 "AF_PACKET address must be tuple, not %.500s",
1786 Py_TYPE(args)->tp_name);
1787 return 0;
1788 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001789 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001791 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 return 0;
1793 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1794 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1795 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1796 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001797 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 return 0;
1799 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001800 if (haddr.buf && haddr.len > 8) {
1801 PyErr_SetString(PyExc_ValueError,
1802 "Hardware address must be 8 bytes or less");
1803 PyBuffer_Release(&haddr);
1804 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 }
1806 if (protoNumber < 0 || protoNumber > 0xffff) {
1807 PyErr_SetString(
1808 PyExc_OverflowError,
1809 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001810 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 return 0;
1812 }
1813 addr = (struct sockaddr_ll*)addr_ret;
1814 addr->sll_family = AF_PACKET;
1815 addr->sll_protocol = htons((short)protoNumber);
1816 addr->sll_ifindex = ifr.ifr_ifindex;
1817 addr->sll_pkttype = pkttype;
1818 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001819 if (haddr.buf) {
1820 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1821 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001823 else
1824 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001826 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return 1;
1828 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001829#endif
1830
Christian Heimes043d6f62008-01-07 17:19:16 +00001831#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 case AF_TIPC:
1833 {
1834 unsigned int atype, v1, v2, v3;
1835 unsigned int scope = TIPC_CLUSTER_SCOPE;
1836 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 if (!PyTuple_Check(args)) {
1839 PyErr_Format(
1840 PyExc_TypeError,
1841 "getsockaddrarg: "
1842 "AF_TIPC address must be tuple, not %.500s",
1843 Py_TYPE(args)->tp_name);
1844 return 0;
1845 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 if (!PyArg_ParseTuple(args,
1848 "IIII|I;Invalid TIPC address format",
1849 &atype, &v1, &v2, &v3, &scope))
1850 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 addr = (struct sockaddr_tipc *) addr_ret;
1853 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 addr->family = AF_TIPC;
1856 addr->scope = scope;
1857 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (atype == TIPC_ADDR_NAMESEQ) {
1860 addr->addr.nameseq.type = v1;
1861 addr->addr.nameseq.lower = v2;
1862 addr->addr.nameseq.upper = v3;
1863 } else if (atype == TIPC_ADDR_NAME) {
1864 addr->addr.name.name.type = v1;
1865 addr->addr.name.name.instance = v2;
1866 } else if (atype == TIPC_ADDR_ID) {
1867 addr->addr.id.node = v1;
1868 addr->addr.id.ref = v2;
1869 } else {
1870 /* Shouldn't happen */
1871 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1872 return 0;
1873 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 return 1;
1878 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001879#endif
1880
Vinay Sajiped6783f2014-03-21 11:44:32 +00001881#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001882 case AF_CAN:
1883 switch (s->sock_proto) {
1884 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001885 /* fall-through */
1886 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001887 {
1888 struct sockaddr_can *addr;
1889 PyObject *interfaceName;
1890 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001891 Py_ssize_t len;
1892
Benjamin Peterson18b71912013-05-16 15:29:44 -05001893 addr = (struct sockaddr_can *)addr_ret;
1894
Charles-François Natali47413c12011-10-06 19:47:44 +02001895 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1896 &interfaceName))
1897 return 0;
1898
1899 len = PyBytes_GET_SIZE(interfaceName);
1900
1901 if (len == 0) {
1902 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001903 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001904 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1905 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001906 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1907 s->errorhandler();
1908 Py_DECREF(interfaceName);
1909 return 0;
1910 }
1911 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001912 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 "AF_CAN interface name too long");
1914 Py_DECREF(interfaceName);
1915 return 0;
1916 }
1917
1918 addr->can_family = AF_CAN;
1919 addr->can_ifindex = ifr.ifr_ifindex;
1920
1921 *len_ret = sizeof(*addr);
1922 Py_DECREF(interfaceName);
1923 return 1;
1924 }
1925 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001926 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001927 "getsockaddrarg: unsupported CAN protocol");
1928 return 0;
1929 }
1930#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001931
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001932#ifdef PF_SYSTEM
1933 case PF_SYSTEM:
1934 switch (s->sock_proto) {
1935#ifdef SYSPROTO_CONTROL
1936 case SYSPROTO_CONTROL:
1937 {
1938 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001939
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001940 addr = (struct sockaddr_ctl *)addr_ret;
1941 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001942 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001943
1944 if (PyUnicode_Check(args)) {
1945 struct ctl_info info;
1946 PyObject *ctl_name;
1947
1948 if (!PyArg_Parse(args, "O&",
1949 PyUnicode_FSConverter, &ctl_name)) {
1950 return 0;
1951 }
1952
Victor Stinnerf50e1872015-03-20 11:32:24 +01001953 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001954 PyErr_SetString(PyExc_ValueError,
1955 "provided string is too long");
1956 Py_DECREF(ctl_name);
1957 return 0;
1958 }
1959 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1960 sizeof(info.ctl_name));
1961 Py_DECREF(ctl_name);
1962
1963 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1964 PyErr_SetString(PyExc_OSError,
1965 "cannot find kernel control with provided name");
1966 return 0;
1967 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001968
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001969 addr->sc_id = info.ctl_id;
1970 addr->sc_unit = 0;
1971 } else if (!PyArg_ParseTuple(args, "II",
1972 &(addr->sc_id), &(addr->sc_unit))) {
1973 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1974 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001975
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001976 return 0;
1977 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001978
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001979 *len_ret = sizeof(*addr);
1980 return 1;
1981 }
1982#endif
1983 default:
1984 PyErr_SetString(PyExc_OSError,
1985 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1986 return 0;
1987 }
1988#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02001989#ifdef HAVE_SOCKADDR_ALG
1990 case AF_ALG:
1991 {
1992 struct sockaddr_alg *sa;
1993 char *type;
1994 char *name;
1995 sa = (struct sockaddr_alg *)addr_ret;
1996
1997 memset(sa, 0, sizeof(*sa));
1998 sa->salg_family = AF_ALG;
1999
2000 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2001 &type, &name, &sa->salg_feat, &sa->salg_mask))
2002 return 0;
2003 /* sockaddr_alg has fixed-sized char arrays for type and name */
2004 if (strlen(type) > sizeof(sa->salg_type)) {
2005 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2006 return 0;
2007 }
2008 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2009 if (strlen(name) > sizeof(sa->salg_name)) {
2010 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2011 return 0;
2012 }
2013 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2014
2015 *len_ret = sizeof(*sa);
2016 return 1;
2017 }
2018#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002023 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002027}
2028
Guido van Rossum30a685f1991-06-27 15:51:29 +00002029
Guido van Rossum48a680c2001-03-02 06:34:14 +00002030/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002031 Return 1 if the family is known, 0 otherwise. The length is returned
2032 through len_ret. */
2033
2034static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002035getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002038
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002039#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 case AF_UNIX:
2041 {
2042 *len_ret = sizeof (struct sockaddr_un);
2043 return 1;
2044 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002045#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00002046#if defined(AF_NETLINK)
2047 case AF_NETLINK:
2048 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 *len_ret = sizeof (struct sockaddr_nl);
2050 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00002051 }
2052#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002053
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002054#ifdef AF_RDS
2055 case AF_RDS:
2056 /* RDS sockets use sockaddr_in: fall-through */
2057#endif
2058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 case AF_INET:
2060 {
2061 *len_ret = sizeof (struct sockaddr_in);
2062 return 1;
2063 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002064
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002065#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 case AF_INET6:
2067 {
2068 *len_ret = sizeof (struct sockaddr_in6);
2069 return 1;
2070 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002071#endif
2072
Hye-Shik Chang81268602004-02-02 06:05:24 +00002073#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 case AF_BLUETOOTH:
2075 {
2076 switch(s->sock_proto)
2077 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 case BTPROTO_L2CAP:
2080 *len_ret = sizeof (struct sockaddr_l2);
2081 return 1;
2082 case BTPROTO_RFCOMM:
2083 *len_ret = sizeof (struct sockaddr_rc);
2084 return 1;
2085 case BTPROTO_HCI:
2086 *len_ret = sizeof (struct sockaddr_hci);
2087 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002088#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 case BTPROTO_SCO:
2090 *len_ret = sizeof (struct sockaddr_sco);
2091 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002094 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 "unknown BT protocol");
2096 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 }
2099 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002100#endif
2101
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002102#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 case AF_PACKET:
2104 {
2105 *len_ret = sizeof (struct sockaddr_ll);
2106 return 1;
2107 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002108#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002109
Christian Heimes043d6f62008-01-07 17:19:16 +00002110#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 case AF_TIPC:
2112 {
2113 *len_ret = sizeof (struct sockaddr_tipc);
2114 return 1;
2115 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002116#endif
2117
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002118#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002119 case AF_CAN:
2120 {
2121 *len_ret = sizeof (struct sockaddr_can);
2122 return 1;
2123 }
2124#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002125
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002126#ifdef PF_SYSTEM
2127 case PF_SYSTEM:
2128 switch(s->sock_proto) {
2129#ifdef SYSPROTO_CONTROL
2130 case SYSPROTO_CONTROL:
2131 *len_ret = sizeof (struct sockaddr_ctl);
2132 return 1;
2133#endif
2134 default:
2135 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2136 "unknown PF_SYSTEM protocol");
2137 return 0;
2138 }
2139#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002140#ifdef HAVE_SOCKADDR_ALG
2141 case AF_ALG:
2142 {
2143 *len_ret = sizeof (struct sockaddr_alg);
2144 return 1;
2145 }
2146#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002151 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002155}
2156
2157
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002158/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2159 Currently, these methods are only compiled if the RFC 2292/3542
2160 CMSG_LEN() macro is available. Older systems seem to have used
2161 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2162 it may be possible to define CMSG_LEN() that way if it's not
2163 provided. Some architectures might need extra padding after the
2164 cmsghdr, however, and CMSG_LEN() would have to take account of
2165 this. */
2166#ifdef CMSG_LEN
2167/* If length is in range, set *result to CMSG_LEN(length) and return
2168 true; otherwise, return false. */
2169static int
2170get_CMSG_LEN(size_t length, size_t *result)
2171{
2172 size_t tmp;
2173
2174 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2175 return 0;
2176 tmp = CMSG_LEN(length);
2177 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2178 return 0;
2179 *result = tmp;
2180 return 1;
2181}
2182
2183#ifdef CMSG_SPACE
2184/* If length is in range, set *result to CMSG_SPACE(length) and return
2185 true; otherwise, return false. */
2186static int
2187get_CMSG_SPACE(size_t length, size_t *result)
2188{
2189 size_t tmp;
2190
2191 /* Use CMSG_SPACE(1) here in order to take account of the padding
2192 necessary before *and* after the data. */
2193 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2194 return 0;
2195 tmp = CMSG_SPACE(length);
2196 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2197 return 0;
2198 *result = tmp;
2199 return 1;
2200}
2201#endif
2202
2203/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2204 pointer in msg->msg_control with at least "space" bytes after it,
2205 and its cmsg_len member inside the buffer. */
2206static int
2207cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2208{
2209 size_t cmsg_offset;
2210 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2211 sizeof(cmsgh->cmsg_len));
2212
Charles-François Natali466517d2011-08-28 18:23:43 +02002213 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002214 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002215 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002216 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2217 annoying under OS X as it's unsigned there and so it triggers a
2218 tautological comparison warning under Clang when compared against 0.
2219 Since the check is valid on other platforms, silence the warning under
2220 Clang. */
2221 #ifdef __clang__
2222 #pragma clang diagnostic push
2223 #pragma clang diagnostic ignored "-Wtautological-compare"
2224 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002225 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002226 #pragma GCC diagnostic push
2227 #pragma GCC diagnostic ignored "-Wtype-limits"
2228 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002229 if (msg->msg_controllen < 0)
2230 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002231 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002232 #pragma GCC diagnostic pop
2233 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002234 #ifdef __clang__
2235 #pragma clang diagnostic pop
2236 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002237 if (space < cmsg_len_end)
2238 space = cmsg_len_end;
2239 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2240 return (cmsg_offset <= (size_t)-1 - space &&
2241 cmsg_offset + space <= msg->msg_controllen);
2242}
2243
2244/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2245 *space to number of bytes following it in the buffer and return
2246 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2247 msg->msg_controllen are valid. */
2248static int
2249get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2250{
2251 size_t data_offset;
2252 char *data_ptr;
2253
2254 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2255 return 0;
2256 data_offset = data_ptr - (char *)msg->msg_control;
2257 if (data_offset > msg->msg_controllen)
2258 return 0;
2259 *space = msg->msg_controllen - data_offset;
2260 return 1;
2261}
2262
2263/* If cmsgh is invalid or not contained in the buffer pointed to by
2264 msg->msg_control, return -1. If cmsgh is valid and its associated
2265 data is entirely contained in the buffer, set *data_len to the
2266 length of the associated data and return 0. If only part of the
2267 associated data is contained in the buffer but cmsgh is otherwise
2268 valid, set *data_len to the length contained in the buffer and
2269 return 1. */
2270static int
2271get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2272{
2273 size_t space, cmsg_data_len;
2274
2275 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2276 cmsgh->cmsg_len < CMSG_LEN(0))
2277 return -1;
2278 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2279 if (!get_cmsg_data_space(msg, cmsgh, &space))
2280 return -1;
2281 if (space >= cmsg_data_len) {
2282 *data_len = cmsg_data_len;
2283 return 0;
2284 }
2285 *data_len = space;
2286 return 1;
2287}
2288#endif /* CMSG_LEN */
2289
2290
Victor Stinner31bf2d52015-04-01 21:57:09 +02002291struct sock_accept {
2292 socklen_t *addrlen;
2293 sock_addr_t *addrbuf;
2294 SOCKET_T result;
2295};
2296
2297#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2298/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2299static int accept4_works = -1;
2300#endif
2301
2302static int
2303sock_accept_impl(PySocketSockObject *s, void *data)
2304{
2305 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002306 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2307 socklen_t *paddrlen = ctx->addrlen;
2308#ifdef HAVE_SOCKADDR_ALG
2309 /* AF_ALG does not support accept() with addr and raises
2310 * ECONNABORTED instead. */
2311 if (s->sock_family == AF_ALG) {
2312 addr = NULL;
2313 paddrlen = NULL;
2314 *ctx->addrlen = 0;
2315 }
2316#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002317
2318#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2319 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002320 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002321 SOCK_CLOEXEC);
2322 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2323 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2324 accept4_works = (errno != ENOSYS);
2325 }
2326 }
2327 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002328 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002329#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002330 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002331#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002332
2333#ifdef MS_WINDOWS
2334 return (ctx->result != INVALID_SOCKET);
2335#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002336 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002337#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002338}
2339
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002340/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002341
Guido van Rossum73624e91994-10-10 17:59:00 +00002342static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002343sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002346 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 socklen_t addrlen;
2348 PyObject *sock = NULL;
2349 PyObject *addr = NULL;
2350 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002351 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 if (!getsockaddrlen(s, &addrlen))
2354 return NULL;
2355 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 if (!IS_SELECTABLE(s))
2358 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002359
Victor Stinner31bf2d52015-04-01 21:57:09 +02002360 ctx.addrlen = &addrlen;
2361 ctx.addrbuf = &addrbuf;
2362 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002364 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002365
Victor Stinnerdaf45552013-08-28 00:53:59 +02002366#ifdef MS_WINDOWS
2367 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2368 PyErr_SetFromWindowsErr(0);
2369 SOCKETCLOSE(newfd);
2370 goto finally;
2371 }
2372#else
2373
2374#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2375 if (!accept4_works)
2376#endif
2377 {
2378 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2379 SOCKETCLOSE(newfd);
2380 goto finally;
2381 }
2382 }
2383#endif
2384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 sock = PyLong_FromSocket_t(newfd);
2386 if (sock == NULL) {
2387 SOCKETCLOSE(newfd);
2388 goto finally;
2389 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2392 addrlen, s->sock_proto);
2393 if (addr == NULL)
2394 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002397
Guido van Rossum67f7a382002-06-06 21:08:16 +00002398finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 Py_XDECREF(sock);
2400 Py_XDECREF(addr);
2401 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002402}
2403
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002404PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002405"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002406\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002407Wait for an incoming connection. Return a new socket file descriptor\n\
2408representing the connection, and the address of the client.\n\
2409For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002410
Guido van Rossum11ba0942002-06-13 15:07:44 +00002411/* s.setblocking(flag) method. Argument:
2412 False -- non-blocking mode; same as settimeout(0)
2413 True -- blocking mode; same as settimeout(None)
2414*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002415
Guido van Rossum73624e91994-10-10 17:59:00 +00002416static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002417sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002418{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002419 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 block = PyLong_AsLong(arg);
2422 if (block == -1 && PyErr_Occurred())
2423 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002424
Victor Stinner9001d802015-04-06 23:06:01 +02002425 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 Py_INCREF(Py_None);
2429 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002430}
Guido van Rossume4485b01994-09-07 14:32:49 +00002431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002432PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002433"setblocking(flag)\n\
2434\n\
2435Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002436setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002437setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002438
Victor Stinner71694d52015-03-28 01:18:54 +01002439static int
2440socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2441{
2442#ifdef MS_WINDOWS
2443 struct timeval tv;
2444#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002445#ifndef HAVE_POLL
2446 _PyTime_t ms;
2447#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002448 int overflow = 0;
2449
2450 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002451 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002452 return 0;
2453 }
2454
Victor Stinner869e1772015-03-30 03:49:14 +02002455 if (_PyTime_FromSecondsObject(timeout,
2456 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002457 return -1;
2458
2459 if (*timeout < 0) {
2460 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2461 return -1;
2462 }
2463
2464#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002465 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002466#endif
2467#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002468 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2469 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002470#endif
2471 if (overflow) {
2472 PyErr_SetString(PyExc_OverflowError,
2473 "timeout doesn't fit into C timeval");
2474 return -1;
2475 }
2476
2477 return 0;
2478}
2479
Guido van Rossum11ba0942002-06-13 15:07:44 +00002480/* s.settimeout(timeout) method. Argument:
2481 None -- no timeout, blocking mode; same as setblocking(True)
2482 0.0 -- non-blocking mode; same as setblocking(False)
2483 > 0 -- timeout mode; operations time out after timeout seconds
2484 < 0 -- illegal; raises an exception
2485*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002487sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002488{
Victor Stinner71694d52015-03-28 01:18:54 +01002489 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002490
Victor Stinner71694d52015-03-28 01:18:54 +01002491 if (socket_parse_timeout(&timeout, arg) < 0)
2492 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002495 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 Py_INCREF(Py_None);
2498 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002499}
2500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002501PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002502"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002503\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002504Set a timeout on socket operations. 'timeout' can be a float,\n\
2505giving in seconds, or None. Setting a timeout of None disables\n\
2506the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002507Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002509/* s.gettimeout() method.
2510 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002512sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513{
Victor Stinner71694d52015-03-28 01:18:54 +01002514 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 Py_INCREF(Py_None);
2516 return Py_None;
2517 }
Victor Stinner71694d52015-03-28 01:18:54 +01002518 else {
2519 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2520 return PyFloat_FromDouble(seconds);
2521 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002522}
2523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002525"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002527Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002528operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002529operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002530
Guido van Rossumaee08791992-09-08 09:05:33 +00002531/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002532 With an integer third argument, sets an integer optval with optlen=4.
2533 With None as third argument and an integer fourth argument, set
2534 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002535 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002536 use optional built-in module 'struct' to encode the string.
2537*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002538
Guido van Rossum73624e91994-10-10 17:59:00 +00002539static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002540sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 int level;
2543 int optname;
2544 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002545 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002547 unsigned int optlen;
2548 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002549
Christian Heimesdffa3942016-09-05 23:54:41 +02002550 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 if (PyArg_ParseTuple(args, "iii:setsockopt",
2552 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002553 res = setsockopt(s->sock_fd, level, optname,
2554 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002555 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002557
2558 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002559 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002560 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2561 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2562 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002563 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002564 NULL, (socklen_t)optlen);
2565 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002567
2568 PyErr_Clear();
2569 /* setsockopt(level, opt, buffer) */
2570 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2571 &level, &optname, &optval))
2572 return NULL;
2573
2574#ifdef MS_WINDOWS
2575 if (optval.len > INT_MAX) {
2576 PyBuffer_Release(&optval);
2577 PyErr_Format(PyExc_OverflowError,
2578 "socket option is larger than %i bytes",
2579 INT_MAX);
2580 return NULL;
2581 }
2582 res = setsockopt(s->sock_fd, level, optname,
2583 optval.buf, (int)optval.len);
2584#else
2585 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2586#endif
2587 PyBuffer_Release(&optval);
2588
2589done:
Victor Stinnercc739322016-03-23 21:35:29 +01002590 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002592 }
2593
2594 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002595}
2596
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002597PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002598"setsockopt(level, option, value: int)\n\
2599setsockopt(level, option, value: buffer)\n\
2600setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002601\n\
2602Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002603The value argument can either be an integer, a string buffer, or \n\
2604None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002605
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002606
Guido van Rossumaee08791992-09-08 09:05:33 +00002607/* s.getsockopt() method.
2608 With two arguments, retrieves an integer option.
2609 With a third integer argument, retrieves a string buffer of that size;
2610 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002611
Guido van Rossum73624e91994-10-10 17:59:00 +00002612static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002613sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 int level;
2616 int optname;
2617 int res;
2618 PyObject *buf;
2619 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2622 &level, &optname, &buflen))
2623 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (buflen == 0) {
2626 int flag = 0;
2627 socklen_t flagsize = sizeof flag;
2628 res = getsockopt(s->sock_fd, level, optname,
2629 (void *)&flag, &flagsize);
2630 if (res < 0)
2631 return s->errorhandler();
2632 return PyLong_FromLong(flag);
2633 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002635 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 "getsockopt buflen out of range");
2637 return NULL;
2638 }
2639 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2640 if (buf == NULL)
2641 return NULL;
2642 res = getsockopt(s->sock_fd, level, optname,
2643 (void *)PyBytes_AS_STRING(buf), &buflen);
2644 if (res < 0) {
2645 Py_DECREF(buf);
2646 return s->errorhandler();
2647 }
2648 _PyBytes_Resize(&buf, buflen);
2649 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002650}
2651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002652PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002653"getsockopt(level, option[, buffersize]) -> value\n\
2654\n\
2655Get a socket option. See the Unix manual for level and option.\n\
2656If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002657string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002658
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002659
Fred Drake728819a2000-07-01 03:40:12 +00002660/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002661
Guido van Rossum73624e91994-10-10 17:59:00 +00002662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002663sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 sock_addr_t addrbuf;
2666 int addrlen;
2667 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2670 return NULL;
2671 Py_BEGIN_ALLOW_THREADS
2672 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2673 Py_END_ALLOW_THREADS
2674 if (res < 0)
2675 return s->errorhandler();
2676 Py_INCREF(Py_None);
2677 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002678}
2679
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002680PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002681"bind(address)\n\
2682\n\
2683Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002684pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002685sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002686
Guido van Rossum30a685f1991-06-27 15:51:29 +00002687
2688/* s.close() method.
2689 Set the file descriptor to -1 so operations tried subsequently
2690 will surely fail. */
2691
Guido van Rossum73624e91994-10-10 17:59:00 +00002692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002693sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002696 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002697
Victor Stinner19a8e842016-03-21 16:36:48 +01002698 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002699 if (fd != INVALID_SOCKET) {
2700 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002701
2702 /* We do not want to retry upon EINTR: see
2703 http://lwn.net/Articles/576478/ and
2704 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2705 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002707 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002709 if (res < 0) {
2710 return s->errorhandler();
2711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 }
2713 Py_INCREF(Py_None);
2714 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002715}
2716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002717PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002718"close()\n\
2719\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002721
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002722static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002723sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002724{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002725 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002726 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002727 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002728}
2729
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002730PyDoc_STRVAR(detach_doc,
2731"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002732\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002733Close the socket object without closing the underlying file descriptor.\n\
2734The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002735can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002736
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002737static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002738sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002739{
Victor Stinner81c41db2015-04-02 11:50:57 +02002740 int err;
2741 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002742
Victor Stinner81c41db2015-04-02 11:50:57 +02002743 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2744 /* getsockopt() failed */
2745 return 0;
2746 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002747
Victor Stinner81c41db2015-04-02 11:50:57 +02002748 if (err == EISCONN)
2749 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002750 if (err != 0) {
2751 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2752 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002753 return 0;
2754 }
2755 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002756}
2757
2758static int
2759internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2760 int raise)
2761{
2762 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002763
2764 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002766 Py_END_ALLOW_THREADS
2767
Victor Stinner70a46f62015-03-31 22:03:59 +02002768 if (!res) {
2769 /* connect() succeeded, the socket is connected */
2770 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002772
Victor Stinner81c41db2015-04-02 11:50:57 +02002773 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002774
Victor Stinner81c41db2015-04-02 11:50:57 +02002775 /* save error, PyErr_CheckSignals() can replace it */
2776 err = GET_SOCK_ERROR;
2777 if (CHECK_ERRNO(EINTR)) {
2778 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002779 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002780
2781 /* Issue #23618: when connect() fails with EINTR, the connection is
2782 running asynchronously.
2783
2784 If the socket is blocking or has a timeout, wait until the
2785 connection completes, fails or timed out using select(), and then
2786 get the connection status using getsockopt(SO_ERROR).
2787
2788 If the socket is non-blocking, raise InterruptedError. The caller is
2789 responsible to wait until the connection completes, fails or timed
2790 out (it's the case in asyncio for example). */
2791 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2792 }
2793 else {
2794 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2795 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002796 }
2797
Victor Stinner81c41db2015-04-02 11:50:57 +02002798 if (!wait_connect) {
2799 if (raise) {
2800 /* restore error, maybe replaced by PyErr_CheckSignals() */
2801 SET_SOCK_ERROR(err);
2802 s->errorhandler();
2803 return -1;
2804 }
2805 else
2806 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002807 }
2808
Victor Stinner81c41db2015-04-02 11:50:57 +02002809 if (raise) {
2810 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002811 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2812 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002813 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002814 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002815 else {
2816 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002817 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2818 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002819 return err;
2820 }
2821 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002822}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002823
Fred Drake728819a2000-07-01 03:40:12 +00002824/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002825
Guido van Rossum73624e91994-10-10 17:59:00 +00002826static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002827sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 sock_addr_t addrbuf;
2830 int addrlen;
2831 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2834 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002835
Victor Stinner81c41db2015-04-02 11:50:57 +02002836 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002837 if (res < 0)
2838 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002839
Victor Stinneree699e92015-03-31 21:28:42 +02002840 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002841}
2842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002843PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002844"connect(address)\n\
2845\n\
2846Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002847is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002848
Guido van Rossum30a685f1991-06-27 15:51:29 +00002849
Fred Drake728819a2000-07-01 03:40:12 +00002850/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002851
2852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002853sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 sock_addr_t addrbuf;
2856 int addrlen;
2857 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2860 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002861
Victor Stinner81c41db2015-04-02 11:50:57 +02002862 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002863 if (res < 0)
2864 return NULL;
2865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002867}
2868
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002869PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002870"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002871\n\
2872This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002873instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002874
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002875
Guido van Rossumed233a51992-06-23 09:07:03 +00002876/* s.fileno() method */
2877
Guido van Rossum73624e91994-10-10 17:59:00 +00002878static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002879sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002882}
2883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002884PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002885"fileno() -> integer\n\
2886\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002888
Guido van Rossumed233a51992-06-23 09:07:03 +00002889
Guido van Rossumc89705d1992-11-26 08:54:07 +00002890/* s.getsockname() method */
2891
Guido van Rossum73624e91994-10-10 17:59:00 +00002892static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002893sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 sock_addr_t addrbuf;
2896 int res;
2897 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 if (!getsockaddrlen(s, &addrlen))
2900 return NULL;
2901 memset(&addrbuf, 0, addrlen);
2902 Py_BEGIN_ALLOW_THREADS
2903 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2904 Py_END_ALLOW_THREADS
2905 if (res < 0)
2906 return s->errorhandler();
2907 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2908 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002909}
2910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912"getsockname() -> address info\n\
2913\n\
2914Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002915info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002916
Guido van Rossumc89705d1992-11-26 08:54:07 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002919/* s.getpeername() method */
2920
Guido van Rossum73624e91994-10-10 17:59:00 +00002921static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002922sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 sock_addr_t addrbuf;
2925 int res;
2926 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 if (!getsockaddrlen(s, &addrlen))
2929 return NULL;
2930 memset(&addrbuf, 0, addrlen);
2931 Py_BEGIN_ALLOW_THREADS
2932 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2933 Py_END_ALLOW_THREADS
2934 if (res < 0)
2935 return s->errorhandler();
2936 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2937 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002938}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002939
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002940PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941"getpeername() -> address info\n\
2942\n\
2943Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002944info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002945
Guido van Rossumb6775db1994-08-01 11:34:53 +00002946#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002947
2948
Guido van Rossum30a685f1991-06-27 15:51:29 +00002949/* s.listen(n) method */
2950
Guido van Rossum73624e91994-10-10 17:59:00 +00002951static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002952sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002953{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002954 /* We try to choose a default backlog high enough to avoid connection drops
2955 * for common workloads, yet not too high to limit resource usage. */
2956 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002958
Charles-François Natali644b8f52014-05-22 19:45:39 +01002959 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002963 /* To avoid problems on systems that don't allow a negative backlog
2964 * (which doesn't make sense anyway) we force a minimum value of 0. */
2965 if (backlog < 0)
2966 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 res = listen(s->sock_fd, backlog);
2968 Py_END_ALLOW_THREADS
2969 if (res < 0)
2970 return s->errorhandler();
2971 Py_INCREF(Py_None);
2972 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002973}
2974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002976"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002977\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002978Enable a server to accept connections. If backlog is specified, it must be\n\
2979at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002980unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002981connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002982
Victor Stinner31bf2d52015-04-01 21:57:09 +02002983struct sock_recv {
2984 char *cbuf;
2985 Py_ssize_t len;
2986 int flags;
2987 Py_ssize_t result;
2988};
2989
2990static int
2991sock_recv_impl(PySocketSockObject *s, void *data)
2992{
2993 struct sock_recv *ctx = data;
2994
2995#ifdef MS_WINDOWS
2996 if (ctx->len > INT_MAX)
2997 ctx->len = INT_MAX;
2998 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2999#else
3000 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3001#endif
3002 return (ctx->result >= 0);
3003}
3004
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005
Thomas Wouters477c8d52006-05-27 19:21:47 +00003006/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003007 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003008 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003009 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003010 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003011 * also possible that we return a number of bytes smaller than the request
3012 * bytes.
3013 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003014
Antoine Pitrou19467d22010-08-17 19:33:30 +00003015static Py_ssize_t
3016sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003017{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003018 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 if (!IS_SELECTABLE(s)) {
3021 select_error();
3022 return -1;
3023 }
3024 if (len == 0) {
3025 /* If 0 bytes were requested, do nothing. */
3026 return 0;
3027 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003028
Victor Stinner31bf2d52015-04-01 21:57:09 +02003029 ctx.cbuf = cbuf;
3030 ctx.len = len;
3031 ctx.flags = flags;
3032 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003034
3035 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003036}
3037
Guido van Rossum48a680c2001-03-02 06:34:14 +00003038
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003039/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003040
Guido van Rossum73624e91994-10-10 17:59:00 +00003041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003042sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003043{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003044 Py_ssize_t recvlen, outlen;
3045 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003047
Antoine Pitrou19467d22010-08-17 19:33:30 +00003048 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 if (recvlen < 0) {
3052 PyErr_SetString(PyExc_ValueError,
3053 "negative buffersize in recv");
3054 return NULL;
3055 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 /* Allocate a new string. */
3058 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3059 if (buf == NULL)
3060 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 /* Call the guts */
3063 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3064 if (outlen < 0) {
3065 /* An error occurred, release the string and return an
3066 error. */
3067 Py_DECREF(buf);
3068 return NULL;
3069 }
3070 if (outlen != recvlen) {
3071 /* We did not read as many bytes as we anticipated, resize the
3072 string if possible and be successful. */
3073 _PyBytes_Resize(&buf, outlen);
3074 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003077}
3078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003079PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003080"recv(buffersize[, flags]) -> data\n\
3081\n\
3082Receive up to buffersize bytes from the socket. For the optional flags\n\
3083argument, see the Unix manual. When no data is available, block until\n\
3084at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003085the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003086
Guido van Rossum30a685f1991-06-27 15:51:29 +00003087
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003088/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003089
Thomas Wouters477c8d52006-05-27 19:21:47 +00003090static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003091sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003094
Antoine Pitrou19467d22010-08-17 19:33:30 +00003095 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 Py_buffer pbuf;
3097 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003098 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003101 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 &pbuf, &recvlen, &flags))
3103 return NULL;
3104 buf = pbuf.buf;
3105 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 if (recvlen < 0) {
3108 PyBuffer_Release(&pbuf);
3109 PyErr_SetString(PyExc_ValueError,
3110 "negative buffersize in recv_into");
3111 return NULL;
3112 }
3113 if (recvlen == 0) {
3114 /* If nbytes was not specified, use the buffer's length */
3115 recvlen = buflen;
3116 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 /* Check if the buffer is large enough */
3119 if (buflen < recvlen) {
3120 PyBuffer_Release(&pbuf);
3121 PyErr_SetString(PyExc_ValueError,
3122 "buffer too small for requested bytes");
3123 return NULL;
3124 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 /* Call the guts */
3127 readlen = sock_recv_guts(s, buf, recvlen, flags);
3128 if (readlen < 0) {
3129 /* Return an error. */
3130 PyBuffer_Release(&pbuf);
3131 return NULL;
3132 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 PyBuffer_Release(&pbuf);
3135 /* Return the number of bytes read. Note that we do not do anything
3136 special here in the case that readlen < recvlen. */
3137 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003138}
3139
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003140PyDoc_STRVAR(recv_into_doc,
3141"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142\n\
3143A version of recv() that stores its data into a buffer rather than creating \n\
3144a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3145is not specified (or 0), receive up to the size available in the given buffer.\n\
3146\n\
3147See recv() for documentation about the flags.");
3148
Victor Stinner31bf2d52015-04-01 21:57:09 +02003149struct sock_recvfrom {
3150 char* cbuf;
3151 Py_ssize_t len;
3152 int flags;
3153 socklen_t *addrlen;
3154 sock_addr_t *addrbuf;
3155 Py_ssize_t result;
3156};
3157
3158static int
3159sock_recvfrom_impl(PySocketSockObject *s, void *data)
3160{
3161 struct sock_recvfrom *ctx = data;
3162
3163 memset(ctx->addrbuf, 0, *ctx->addrlen);
3164
3165#ifdef MS_WINDOWS
3166 if (ctx->len > INT_MAX)
3167 ctx->len = INT_MAX;
3168 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3169 SAS2SA(ctx->addrbuf), ctx->addrlen);
3170#else
3171 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3172 SAS2SA(ctx->addrbuf), ctx->addrlen);
3173#endif
3174 return (ctx->result >= 0);
3175}
3176
Thomas Wouters477c8d52006-05-27 19:21:47 +00003177
3178/*
Christian Heimes99170a52007-12-19 02:07:34 +00003179 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3180 * into a char buffer. If you have any inc/def ref to do to the objects that
3181 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003182 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003183 * that it is also possible that we return a number of bytes smaller than the
3184 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003185 *
3186 * 'addr' is a return value for the address object. Note that you must decref
3187 * it yourself.
3188 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003189static Py_ssize_t
3190sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003195 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 if (!getsockaddrlen(s, &addrlen))
3200 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 if (!IS_SELECTABLE(s)) {
3203 select_error();
3204 return -1;
3205 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003206
Victor Stinner31bf2d52015-04-01 21:57:09 +02003207 ctx.cbuf = cbuf;
3208 ctx.len = len;
3209 ctx.flags = flags;
3210 ctx.addrbuf = &addrbuf;
3211 ctx.addrlen = &addrlen;
3212 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003214
Victor Stinner31bf2d52015-04-01 21:57:09 +02003215 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3216 s->sock_proto);
3217 if (*addr == NULL)
3218 return -1;
3219
3220 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003221}
3222
3223/* s.recvfrom(nbytes [,flags]) method */
3224
3225static PyObject *
3226sock_recvfrom(PySocketSockObject *s, PyObject *args)
3227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 PyObject *buf = NULL;
3229 PyObject *addr = NULL;
3230 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003231 int flags = 0;
3232 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003233
Antoine Pitrou19467d22010-08-17 19:33:30 +00003234 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 if (recvlen < 0) {
3238 PyErr_SetString(PyExc_ValueError,
3239 "negative buffersize in recvfrom");
3240 return NULL;
3241 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3244 if (buf == NULL)
3245 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3248 recvlen, flags, &addr);
3249 if (outlen < 0) {
3250 goto finally;
3251 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 if (outlen != recvlen) {
3254 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003255 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003257 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 goto finally;
3259 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003262
3263finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 Py_XDECREF(buf);
3265 Py_XDECREF(addr);
3266 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003267}
3268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003270"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3271\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003272Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003273
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003275/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003276
3277static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003278sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003281
Antoine Pitrou19467d22010-08-17 19:33:30 +00003282 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 Py_buffer pbuf;
3284 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003285 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003288
Antoine Pitrou19467d22010-08-17 19:33:30 +00003289 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 kwlist, &pbuf,
3291 &recvlen, &flags))
3292 return NULL;
3293 buf = pbuf.buf;
3294 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 if (recvlen < 0) {
3297 PyBuffer_Release(&pbuf);
3298 PyErr_SetString(PyExc_ValueError,
3299 "negative buffersize in recvfrom_into");
3300 return NULL;
3301 }
3302 if (recvlen == 0) {
3303 /* If nbytes was not specified, use the buffer's length */
3304 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003305 } else if (recvlen > buflen) {
3306 PyBuffer_Release(&pbuf);
3307 PyErr_SetString(PyExc_ValueError,
3308 "nbytes is greater than the length of the buffer");
3309 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3313 if (readlen < 0) {
3314 PyBuffer_Release(&pbuf);
3315 /* Return an error */
3316 Py_XDECREF(addr);
3317 return NULL;
3318 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 PyBuffer_Release(&pbuf);
3321 /* Return the number of bytes read and the address. Note that we do
3322 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003323 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003324}
3325
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003326PyDoc_STRVAR(recvfrom_into_doc,
3327"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003328\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003329Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003330
Victor Stinner35bee932015-04-02 12:28:07 +02003331/* The sendmsg() and recvmsg[_into]() methods require a working
3332 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3333#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003334struct sock_recvmsg {
3335 struct msghdr *msg;
3336 int flags;
3337 ssize_t result;
3338};
3339
3340static int
3341sock_recvmsg_impl(PySocketSockObject *s, void *data)
3342{
3343 struct sock_recvmsg *ctx = data;
3344
3345 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3346 return (ctx->result >= 0);
3347}
3348
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003349/*
3350 * Call recvmsg() with the supplied iovec structures, flags, and
3351 * ancillary data buffer size (controllen). Returns the tuple return
3352 * value for recvmsg() or recvmsg_into(), with the first item provided
3353 * by the supplied makeval() function. makeval() will be called with
3354 * the length read and makeval_data as arguments, and must return a
3355 * new reference (which will be decrefed if there is a subsequent
3356 * error). On error, closes any file descriptors received via
3357 * SCM_RIGHTS.
3358 */
3359static PyObject *
3360sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3361 int flags, Py_ssize_t controllen,
3362 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3363{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003364 sock_addr_t addrbuf;
3365 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003366 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367 PyObject *cmsg_list = NULL, *retval = NULL;
3368 void *controlbuf = NULL;
3369 struct cmsghdr *cmsgh;
3370 size_t cmsgdatalen = 0;
3371 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003372 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003373
3374 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3375 ignored" when the socket is connected (Linux fills them in
3376 anyway for AF_UNIX sockets at least). Normally msg_namelen
3377 seems to be set to 0 if there's no address, but try to
3378 initialize msg_name to something that won't be mistaken for a
3379 real address if that doesn't happen. */
3380 if (!getsockaddrlen(s, &addrbuflen))
3381 return NULL;
3382 memset(&addrbuf, 0, addrbuflen);
3383 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3384
3385 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3386 PyErr_SetString(PyExc_ValueError,
3387 "invalid ancillary data buffer length");
3388 return NULL;
3389 }
3390 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3391 return PyErr_NoMemory();
3392
3393 /* Make the system call. */
3394 if (!IS_SELECTABLE(s)) {
3395 select_error();
3396 goto finally;
3397 }
3398
Victor Stinner31bf2d52015-04-01 21:57:09 +02003399 msg.msg_name = SAS2SA(&addrbuf);
3400 msg.msg_namelen = addrbuflen;
3401 msg.msg_iov = iov;
3402 msg.msg_iovlen = iovlen;
3403 msg.msg_control = controlbuf;
3404 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003405
Victor Stinner31bf2d52015-04-01 21:57:09 +02003406 ctx.msg = &msg;
3407 ctx.flags = flags;
3408 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003409 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003410
3411 /* Make list of (level, type, data) tuples from control messages. */
3412 if ((cmsg_list = PyList_New(0)) == NULL)
3413 goto err_closefds;
3414 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3415 implementations didn't do so. */
3416 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3417 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3418 PyObject *bytes, *tuple;
3419 int tmp;
3420
3421 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3422 if (cmsg_status != 0) {
3423 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3424 "received malformed or improperly-truncated "
3425 "ancillary data", 1) == -1)
3426 goto err_closefds;
3427 }
3428 if (cmsg_status < 0)
3429 break;
3430 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003431 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432 goto err_closefds;
3433 }
3434
3435 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3436 cmsgdatalen);
3437 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3438 (int)cmsgh->cmsg_type, bytes);
3439 if (tuple == NULL)
3440 goto err_closefds;
3441 tmp = PyList_Append(cmsg_list, tuple);
3442 Py_DECREF(tuple);
3443 if (tmp != 0)
3444 goto err_closefds;
3445
3446 if (cmsg_status != 0)
3447 break;
3448 }
3449
3450 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003451 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 cmsg_list,
3453 (int)msg.msg_flags,
3454 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3455 ((msg.msg_namelen > addrbuflen) ?
3456 addrbuflen : msg.msg_namelen),
3457 s->sock_proto));
3458 if (retval == NULL)
3459 goto err_closefds;
3460
3461finally:
3462 Py_XDECREF(cmsg_list);
3463 PyMem_Free(controlbuf);
3464 return retval;
3465
3466err_closefds:
3467#ifdef SCM_RIGHTS
3468 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3469 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3470 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3471 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3472 if (cmsg_status < 0)
3473 break;
3474 if (cmsgh->cmsg_level == SOL_SOCKET &&
3475 cmsgh->cmsg_type == SCM_RIGHTS) {
3476 size_t numfds;
3477 int *fdp;
3478
3479 numfds = cmsgdatalen / sizeof(int);
3480 fdp = (int *)CMSG_DATA(cmsgh);
3481 while (numfds-- > 0)
3482 close(*fdp++);
3483 }
3484 if (cmsg_status != 0)
3485 break;
3486 }
3487#endif /* SCM_RIGHTS */
3488 goto finally;
3489}
3490
3491
3492static PyObject *
3493makeval_recvmsg(ssize_t received, void *data)
3494{
3495 PyObject **buf = data;
3496
3497 if (received < PyBytes_GET_SIZE(*buf))
3498 _PyBytes_Resize(buf, received);
3499 Py_XINCREF(*buf);
3500 return *buf;
3501}
3502
3503/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3504
3505static PyObject *
3506sock_recvmsg(PySocketSockObject *s, PyObject *args)
3507{
3508 Py_ssize_t bufsize, ancbufsize = 0;
3509 int flags = 0;
3510 struct iovec iov;
3511 PyObject *buf = NULL, *retval = NULL;
3512
3513 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3514 return NULL;
3515
3516 if (bufsize < 0) {
3517 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3518 return NULL;
3519 }
3520 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3521 return NULL;
3522 iov.iov_base = PyBytes_AS_STRING(buf);
3523 iov.iov_len = bufsize;
3524
3525 /* Note that we're passing a pointer to *our pointer* to the bytes
3526 object here (&buf); makeval_recvmsg() may incref the object, or
3527 deallocate it and set our pointer to NULL. */
3528 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3529 &makeval_recvmsg, &buf);
3530 Py_XDECREF(buf);
3531 return retval;
3532}
3533
3534PyDoc_STRVAR(recvmsg_doc,
3535"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3536\n\
3537Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3538socket. The ancbufsize argument sets the size in bytes of the\n\
3539internal buffer used to receive the ancillary data; it defaults to 0,\n\
3540meaning that no ancillary data will be received. Appropriate buffer\n\
3541sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3542CMSG_LEN(), and items which do not fit into the buffer might be\n\
3543truncated or discarded. The flags argument defaults to 0 and has the\n\
3544same meaning as for recv().\n\
3545\n\
3546The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3547The data item is a bytes object holding the non-ancillary data\n\
3548received. The ancdata item is a list of zero or more tuples\n\
3549(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3550(control messages) received: cmsg_level and cmsg_type are integers\n\
3551specifying the protocol level and protocol-specific type respectively,\n\
3552and cmsg_data is a bytes object holding the associated data. The\n\
3553msg_flags item is the bitwise OR of various flags indicating\n\
3554conditions on the received message; see your system documentation for\n\
3555details. If the receiving socket is unconnected, address is the\n\
3556address of the sending socket, if available; otherwise, its value is\n\
3557unspecified.\n\
3558\n\
3559If recvmsg() raises an exception after the system call returns, it\n\
3560will first attempt to close any file descriptors received via the\n\
3561SCM_RIGHTS mechanism.");
3562
3563
3564static PyObject *
3565makeval_recvmsg_into(ssize_t received, void *data)
3566{
3567 return PyLong_FromSsize_t(received);
3568}
3569
3570/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3571
3572static PyObject *
3573sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3574{
3575 Py_ssize_t ancbufsize = 0;
3576 int flags = 0;
3577 struct iovec *iovs = NULL;
3578 Py_ssize_t i, nitems, nbufs = 0;
3579 Py_buffer *bufs = NULL;
3580 PyObject *buffers_arg, *fast, *retval = NULL;
3581
3582 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3583 &buffers_arg, &ancbufsize, &flags))
3584 return NULL;
3585
3586 if ((fast = PySequence_Fast(buffers_arg,
3587 "recvmsg_into() argument 1 must be an "
3588 "iterable")) == NULL)
3589 return NULL;
3590 nitems = PySequence_Fast_GET_SIZE(fast);
3591 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003592 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593 goto finally;
3594 }
3595
3596 /* Fill in an iovec for each item, and save the Py_buffer
3597 structs to release afterwards. */
3598 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3599 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3600 PyErr_NoMemory();
3601 goto finally;
3602 }
3603 for (; nbufs < nitems; nbufs++) {
3604 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3605 "w*;recvmsg_into() argument 1 must be an iterable "
3606 "of single-segment read-write buffers",
3607 &bufs[nbufs]))
3608 goto finally;
3609 iovs[nbufs].iov_base = bufs[nbufs].buf;
3610 iovs[nbufs].iov_len = bufs[nbufs].len;
3611 }
3612
3613 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3614 &makeval_recvmsg_into, NULL);
3615finally:
3616 for (i = 0; i < nbufs; i++)
3617 PyBuffer_Release(&bufs[i]);
3618 PyMem_Free(bufs);
3619 PyMem_Free(iovs);
3620 Py_DECREF(fast);
3621 return retval;
3622}
3623
3624PyDoc_STRVAR(recvmsg_into_doc,
3625"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3626\n\
3627Receive normal data and ancillary data from the socket, scattering the\n\
3628non-ancillary data into a series of buffers. The buffers argument\n\
3629must be an iterable of objects that export writable buffers\n\
3630(e.g. bytearray objects); these will be filled with successive chunks\n\
3631of the non-ancillary data until it has all been written or there are\n\
3632no more buffers. The ancbufsize argument sets the size in bytes of\n\
3633the internal buffer used to receive the ancillary data; it defaults to\n\
36340, meaning that no ancillary data will be received. Appropriate\n\
3635buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3636or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3637truncated or discarded. The flags argument defaults to 0 and has the\n\
3638same meaning as for recv().\n\
3639\n\
3640The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3641The nbytes item is the total number of bytes of non-ancillary data\n\
3642written into the buffers. The ancdata item is a list of zero or more\n\
3643tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3644data (control messages) received: cmsg_level and cmsg_type are\n\
3645integers specifying the protocol level and protocol-specific type\n\
3646respectively, and cmsg_data is a bytes object holding the associated\n\
3647data. The msg_flags item is the bitwise OR of various flags\n\
3648indicating conditions on the received message; see your system\n\
3649documentation for details. If the receiving socket is unconnected,\n\
3650address is the address of the sending socket, if available; otherwise,\n\
3651its value is unspecified.\n\
3652\n\
3653If recvmsg_into() raises an exception after the system call returns,\n\
3654it will first attempt to close any file descriptors received via the\n\
3655SCM_RIGHTS mechanism.");
3656#endif /* CMSG_LEN */
3657
3658
Victor Stinner31bf2d52015-04-01 21:57:09 +02003659struct sock_send {
3660 char *buf;
3661 Py_ssize_t len;
3662 int flags;
3663 Py_ssize_t result;
3664};
3665
3666static int
3667sock_send_impl(PySocketSockObject *s, void *data)
3668{
3669 struct sock_send *ctx = data;
3670
3671#ifdef MS_WINDOWS
3672 if (ctx->len > INT_MAX)
3673 ctx->len = INT_MAX;
3674 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3675#else
3676 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3677#endif
3678 return (ctx->result >= 0);
3679}
3680
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003681/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003682
Guido van Rossum73624e91994-10-10 17:59:00 +00003683static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003684sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003685{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003686 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003688 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3691 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 if (!IS_SELECTABLE(s)) {
3694 PyBuffer_Release(&pbuf);
3695 return select_error();
3696 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003697 ctx.buf = pbuf.buf;
3698 ctx.len = pbuf.len;
3699 ctx.flags = flags;
3700 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003701 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 return NULL;
3703 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003704 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003705
3706 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003707}
3708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003709PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003710"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003711\n\
3712Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003713argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003714sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003715
3716
3717/* s.sendall(data [,flags]) method */
3718
3719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003720sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003723 Py_ssize_t len, n;
3724 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003726 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003727 int has_timeout = (s->sock_timeout > 0);
3728 _PyTime_t interval = s->sock_timeout;
3729 _PyTime_t deadline = 0;
3730 int deadline_initialized = 0;
3731 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3734 return NULL;
3735 buf = pbuf.buf;
3736 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 if (!IS_SELECTABLE(s)) {
3739 PyBuffer_Release(&pbuf);
3740 return select_error();
3741 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003744 if (has_timeout) {
3745 if (deadline_initialized) {
3746 /* recompute the timeout */
3747 interval = deadline - _PyTime_GetMonotonicClock();
3748 }
3749 else {
3750 deadline_initialized = 1;
3751 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3752 }
3753
3754 if (interval <= 0) {
3755 PyErr_SetString(socket_timeout, "timed out");
3756 goto done;
3757 }
3758 }
3759
Victor Stinner02f32ab2015-04-01 22:53:26 +02003760 ctx.buf = buf;
3761 ctx.len = len;
3762 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003763 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3764 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003765 n = ctx.result;
3766 assert(n >= 0);
3767
3768 buf += n;
3769 len -= n;
3770
3771 /* We must run our signal handlers before looping again.
3772 send() can return a successful partial write when it is
3773 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003774 if (PyErr_CheckSignals())
3775 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003776 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003778
Victor Stinner8912d142015-04-06 23:16:34 +02003779 Py_INCREF(Py_None);
3780 res = Py_None;
3781
3782done:
3783 PyBuffer_Release(&pbuf);
3784 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003785}
3786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003787PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003788"sendall(data[, flags])\n\
3789\n\
3790Send a data string to the socket. For the optional flags\n\
3791argument, see the Unix manual. This calls send() repeatedly\n\
3792until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003793to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003794
Guido van Rossum30a685f1991-06-27 15:51:29 +00003795
Victor Stinner31bf2d52015-04-01 21:57:09 +02003796struct sock_sendto {
3797 char *buf;
3798 Py_ssize_t len;
3799 int flags;
3800 int addrlen;
3801 sock_addr_t *addrbuf;
3802 Py_ssize_t result;
3803};
3804
3805static int
3806sock_sendto_impl(PySocketSockObject *s, void *data)
3807{
3808 struct sock_sendto *ctx = data;
3809
3810#ifdef MS_WINDOWS
3811 if (ctx->len > INT_MAX)
3812 ctx->len = INT_MAX;
3813 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3814 SAS2SA(ctx->addrbuf), ctx->addrlen);
3815#else
3816 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3817 SAS2SA(ctx->addrbuf), ctx->addrlen);
3818#endif
3819 return (ctx->result >= 0);
3820}
3821
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003822/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003823
Guido van Rossum73624e91994-10-10 17:59:00 +00003824static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003825sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 Py_buffer pbuf;
3828 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003829 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003831 int addrlen, flags;
3832 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003835 arglen = PyTuple_Size(args);
3836 switch (arglen) {
3837 case 2:
3838 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3839 break;
3840 case 3:
3841 PyArg_ParseTuple(args, "y*iO:sendto",
3842 &pbuf, &flags, &addro);
3843 break;
3844 default:
3845 PyErr_Format(PyExc_TypeError,
3846 "sendto() takes 2 or 3 arguments (%d given)",
3847 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003848 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003850 if (PyErr_Occurred())
3851 return NULL;
3852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 if (!IS_SELECTABLE(s)) {
3854 PyBuffer_Release(&pbuf);
3855 return select_error();
3856 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3859 PyBuffer_Release(&pbuf);
3860 return NULL;
3861 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003862
Victor Stinner31bf2d52015-04-01 21:57:09 +02003863 ctx.buf = pbuf.buf;
3864 ctx.len = pbuf.len;
3865 ctx.flags = flags;
3866 ctx.addrlen = addrlen;
3867 ctx.addrbuf = &addrbuf;
3868 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003869 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003870 return NULL;
3871 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003872 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003873
3874 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003875}
3876
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003877PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003878"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003879\n\
3880Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003881For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003882
Guido van Rossum30a685f1991-06-27 15:51:29 +00003883
Victor Stinner35bee932015-04-02 12:28:07 +02003884/* The sendmsg() and recvmsg[_into]() methods require a working
3885 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3886#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003887struct sock_sendmsg {
3888 struct msghdr *msg;
3889 int flags;
3890 ssize_t result;
3891};
3892
3893static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003894sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3895 struct msghdr *msg,
3896 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3897 Py_ssize_t ndataparts, ndatabufs = 0;
3898 int result = -1;
3899 struct iovec *iovs = NULL;
3900 PyObject *data_fast = NULL;
3901 Py_buffer *databufs = NULL;
3902
3903 /* Fill in an iovec for each message part, and save the Py_buffer
3904 structs to release afterwards. */
3905 if ((data_fast = PySequence_Fast(data_arg,
3906 "sendmsg() argument 1 must be an "
3907 "iterable")) == NULL)
3908 goto finally;
3909 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3910 if (ndataparts > INT_MAX) {
3911 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3912 goto finally;
3913 }
3914 msg->msg_iovlen = ndataparts;
3915 if (ndataparts > 0 &&
3916 ((msg->msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3917 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3918 PyErr_NoMemory();
3919 goto finally;
3920 }
3921 for (; ndatabufs < ndataparts; ndatabufs++) {
3922 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3923 "y*;sendmsg() argument 1 must be an iterable of "
3924 "bytes-like objects",
3925 &databufs[ndatabufs]))
3926 goto finally;
3927 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3928 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3929 }
3930 result = 0;
3931 finally:
3932 *databufsout = databufs;
3933 *ndatabufsout = ndatabufs;
3934 Py_XDECREF(data_fast);
3935 return result;
3936}
3937
3938static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003939sock_sendmsg_impl(PySocketSockObject *s, void *data)
3940{
3941 struct sock_sendmsg *ctx = data;
3942
3943 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3944 return (ctx->result >= 0);
3945}
3946
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003947/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3948
3949static PyObject *
3950sock_sendmsg(PySocketSockObject *s, PyObject *args)
3951{
Christian Heimesdffa3942016-09-05 23:54:41 +02003952 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003953 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003954 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003955 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003956 struct cmsginfo {
3957 int level;
3958 int type;
3959 Py_buffer data;
3960 } *cmsgs = NULL;
3961 void *controlbuf = NULL;
3962 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003963 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003964 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003965 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003966 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003967
3968 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3969 &data_arg, &cmsg_arg, &flags, &addr_arg))
3970 return NULL;
3971
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972 /* Parse destination address. */
3973 if (addr_arg != NULL && addr_arg != Py_None) {
3974 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3975 goto finally;
3976 msg.msg_name = &addrbuf;
3977 msg.msg_namelen = addrlen;
3978 }
3979
3980 /* Fill in an iovec for each message part, and save the Py_buffer
3981 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02003982 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003984 }
3985
3986 if (cmsg_arg == NULL)
3987 ncmsgs = 0;
3988 else {
3989 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3990 "sendmsg() argument 2 must be an "
3991 "iterable")) == NULL)
3992 goto finally;
3993 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3994 }
3995
3996#ifndef CMSG_SPACE
3997 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003998 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003999 "sending multiple control messages is not supported "
4000 "on this system");
4001 goto finally;
4002 }
4003#endif
4004 /* Save level, type and Py_buffer for each control message,
4005 and calculate total size. */
4006 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4007 PyErr_NoMemory();
4008 goto finally;
4009 }
4010 controllen = controllen_last = 0;
4011 while (ncmsgbufs < ncmsgs) {
4012 size_t bufsize, space;
4013
4014 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4015 "(iiy*):[sendmsg() ancillary data items]",
4016 &cmsgs[ncmsgbufs].level,
4017 &cmsgs[ncmsgbufs].type,
4018 &cmsgs[ncmsgbufs].data))
4019 goto finally;
4020 bufsize = cmsgs[ncmsgbufs++].data.len;
4021
4022#ifdef CMSG_SPACE
4023 if (!get_CMSG_SPACE(bufsize, &space)) {
4024#else
4025 if (!get_CMSG_LEN(bufsize, &space)) {
4026#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004027 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004028 goto finally;
4029 }
4030 controllen += space;
4031 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004032 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004033 goto finally;
4034 }
4035 controllen_last = controllen;
4036 }
4037
4038 /* Construct ancillary data block from control message info. */
4039 if (ncmsgbufs > 0) {
4040 struct cmsghdr *cmsgh = NULL;
4041
4042 if ((msg.msg_control = controlbuf =
4043 PyMem_Malloc(controllen)) == NULL) {
4044 PyErr_NoMemory();
4045 goto finally;
4046 }
4047 msg.msg_controllen = controllen;
4048
4049 /* Need to zero out the buffer as a workaround for glibc's
4050 CMSG_NXTHDR() implementation. After getting the pointer to
4051 the next header, it checks its (uninitialized) cmsg_len
4052 member to see if the "message" fits in the buffer, and
4053 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004054 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004055 memset(controlbuf, 0, controllen);
4056
4057 for (i = 0; i < ncmsgbufs; i++) {
4058 size_t msg_len, data_len = cmsgs[i].data.len;
4059 int enough_space = 0;
4060
4061 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4062 if (cmsgh == NULL) {
4063 PyErr_Format(PyExc_RuntimeError,
4064 "unexpected NULL result from %s()",
4065 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4066 goto finally;
4067 }
4068 if (!get_CMSG_LEN(data_len, &msg_len)) {
4069 PyErr_SetString(PyExc_RuntimeError,
4070 "item size out of range for CMSG_LEN()");
4071 goto finally;
4072 }
4073 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4074 size_t space;
4075
4076 cmsgh->cmsg_len = msg_len;
4077 if (get_cmsg_data_space(&msg, cmsgh, &space))
4078 enough_space = (space >= data_len);
4079 }
4080 if (!enough_space) {
4081 PyErr_SetString(PyExc_RuntimeError,
4082 "ancillary data does not fit in calculated "
4083 "space");
4084 goto finally;
4085 }
4086 cmsgh->cmsg_level = cmsgs[i].level;
4087 cmsgh->cmsg_type = cmsgs[i].type;
4088 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4089 }
4090 }
4091
4092 /* Make the system call. */
4093 if (!IS_SELECTABLE(s)) {
4094 select_error();
4095 goto finally;
4096 }
4097
Victor Stinner31bf2d52015-04-01 21:57:09 +02004098 ctx.msg = &msg;
4099 ctx.flags = flags;
4100 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004101 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004102
4103 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004104
4105finally:
4106 PyMem_Free(controlbuf);
4107 for (i = 0; i < ncmsgbufs; i++)
4108 PyBuffer_Release(&cmsgs[i].data);
4109 PyMem_Free(cmsgs);
4110 Py_XDECREF(cmsg_fast);
4111 for (i = 0; i < ndatabufs; i++)
4112 PyBuffer_Release(&databufs[i]);
4113 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114 return retval;
4115}
4116
4117PyDoc_STRVAR(sendmsg_doc,
4118"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4119\n\
4120Send normal and ancillary data to the socket, gathering the\n\
4121non-ancillary data from a series of buffers and concatenating it into\n\
4122a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004123data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004124The ancdata argument specifies the ancillary data (control messages)\n\
4125as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4126cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4127protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004128is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004129argument defaults to 0 and has the same meaning as for send(). If\n\
4130address is supplied and not None, it sets a destination address for\n\
4131the message. The return value is the number of bytes of non-ancillary\n\
4132data sent.");
4133#endif /* CMSG_LEN */
4134
Christian Heimesdffa3942016-09-05 23:54:41 +02004135#ifdef HAVE_SOCKADDR_ALG
4136static PyObject*
4137sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4138{
4139 PyObject *retval = NULL;
4140
4141 Py_ssize_t i, ndatabufs = 0;
4142 Py_buffer *databufs = NULL;
4143 PyObject *data_arg = NULL;
4144
4145 Py_buffer iv = {NULL, NULL};
4146
4147 PyObject *opobj = NULL;
4148 int op = -1;
4149
4150 PyObject *assoclenobj = NULL;
4151 int assoclen = -1;
4152
4153 unsigned int *uiptr;
4154 int flags = 0;
4155
4156 struct msghdr msg;
4157 struct cmsghdr *header = NULL;
4158 struct af_alg_iv *alg_iv = NULL;
4159 struct sock_sendmsg ctx;
4160 Py_ssize_t controllen;
4161 void *controlbuf = NULL;
4162 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4163
4164 if (self->sock_family != AF_ALG) {
4165 PyErr_SetString(PyExc_OSError,
4166 "algset is only supported for AF_ALG");
4167 return NULL;
4168 }
4169
4170 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4171 "|O$O!y*O!i:sendmsg_afalg", keywords,
4172 &data_arg,
4173 &PyLong_Type, &opobj, &iv,
4174 &PyLong_Type, &assoclenobj, &flags))
4175 return NULL;
4176
4177 /* op is a required, keyword-only argument >= 0 */
4178 if (opobj != NULL) {
4179 op = _PyLong_AsInt(opobj);
4180 }
4181 if (op < 0) {
4182 /* override exception from _PyLong_AsInt() */
4183 PyErr_SetString(PyExc_TypeError,
4184 "Invalid or missing argument 'op'");
4185 goto finally;
4186 }
4187 /* assoclen is optional but must be >= 0 */
4188 if (assoclenobj != NULL) {
4189 assoclen = _PyLong_AsInt(assoclenobj);
4190 if (assoclen == -1 && PyErr_Occurred()) {
4191 goto finally;
4192 }
4193 if (assoclen < 0) {
4194 PyErr_SetString(PyExc_TypeError,
4195 "assoclen must be positive");
4196 goto finally;
4197 }
4198 }
4199
4200 controllen = CMSG_SPACE(4);
4201 if (iv.buf != NULL) {
4202 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4203 }
4204 if (assoclen >= 0) {
4205 controllen += CMSG_SPACE(4);
4206 }
4207
4208 controlbuf = PyMem_Malloc(controllen);
4209 if (controlbuf == NULL) {
4210 return PyErr_NoMemory();
4211 }
4212 memset(controlbuf, 0, controllen);
4213
4214 memset(&msg, 0, sizeof(msg));
4215 msg.msg_controllen = controllen;
4216 msg.msg_control = controlbuf;
4217
4218 /* Fill in an iovec for each message part, and save the Py_buffer
4219 structs to release afterwards. */
4220 if (data_arg != NULL) {
4221 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4222 goto finally;
4223 }
4224 }
4225
4226 /* set operation to encrypt or decrypt */
4227 header = CMSG_FIRSTHDR(&msg);
4228 if (header == NULL) {
4229 PyErr_SetString(PyExc_RuntimeError,
4230 "unexpected NULL result from CMSG_FIRSTHDR");
4231 goto finally;
4232 }
4233 header->cmsg_level = SOL_ALG;
4234 header->cmsg_type = ALG_SET_OP;
4235 header->cmsg_len = CMSG_LEN(4);
4236 uiptr = (void*)CMSG_DATA(header);
4237 *uiptr = (unsigned int)op;
4238
4239 /* set initialization vector */
4240 if (iv.buf != NULL) {
4241 header = CMSG_NXTHDR(&msg, header);
4242 if (header == NULL) {
4243 PyErr_SetString(PyExc_RuntimeError,
4244 "unexpected NULL result from CMSG_NXTHDR(iv)");
4245 goto finally;
4246 }
4247 header->cmsg_level = SOL_ALG;
4248 header->cmsg_type = ALG_SET_IV;
4249 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4250 alg_iv = (void*)CMSG_DATA(header);
4251 alg_iv->ivlen = iv.len;
4252 memcpy(alg_iv->iv, iv.buf, iv.len);
4253 }
4254
4255 /* set length of associated data for AEAD */
4256 if (assoclen >= 0) {
4257 header = CMSG_NXTHDR(&msg, header);
4258 if (header == NULL) {
4259 PyErr_SetString(PyExc_RuntimeError,
4260 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4261 goto finally;
4262 }
4263 header->cmsg_level = SOL_ALG;
4264 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4265 header->cmsg_len = CMSG_LEN(4);
4266 uiptr = (void*)CMSG_DATA(header);
4267 *uiptr = (unsigned int)assoclen;
4268 }
4269
4270 ctx.msg = &msg;
4271 ctx.flags = flags;
4272 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0)
4273 goto finally;
4274
4275 retval = PyLong_FromSsize_t(ctx.result);
4276
4277 finally:
4278 PyMem_Free(controlbuf);
4279 if (iv.buf != NULL) {
4280 PyBuffer_Release(&iv);
4281 }
4282 for (i = 0; i < ndatabufs; i++)
4283 PyBuffer_Release(&databufs[i]);
4284 PyMem_Free(databufs);
4285 return retval;
4286}
4287
4288PyDoc_STRVAR(sendmsg_afalg_doc,
4289"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4290\n\
4291Set operation mode, IV and length of associated data for an AF_ALG\n\
4292operation socket.");
4293#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004294
Guido van Rossum30a685f1991-06-27 15:51:29 +00004295/* s.shutdown(how) method */
4296
Guido van Rossum73624e91994-10-10 17:59:00 +00004297static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004298sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 int how;
4301 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004302
Serhiy Storchaka78980432013-01-15 01:12:17 +02004303 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 if (how == -1 && PyErr_Occurred())
4305 return NULL;
4306 Py_BEGIN_ALLOW_THREADS
4307 res = shutdown(s->sock_fd, how);
4308 Py_END_ALLOW_THREADS
4309 if (res < 0)
4310 return s->errorhandler();
4311 Py_INCREF(Py_None);
4312 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004313}
4314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004315PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004316"shutdown(flag)\n\
4317\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004318Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4319of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004320
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004321#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004322static PyObject*
4323sock_ioctl(PySocketSockObject *s, PyObject *arg)
4324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 unsigned long cmd = SIO_RCVALL;
4326 PyObject *argO;
4327 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4330 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 switch (cmd) {
4333 case SIO_RCVALL: {
4334 unsigned int option = RCVALL_ON;
4335 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4336 return NULL;
4337 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4338 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4339 return set_error();
4340 }
4341 return PyLong_FromUnsignedLong(recv); }
4342 case SIO_KEEPALIVE_VALS: {
4343 struct tcp_keepalive ka;
4344 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4345 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4346 return NULL;
4347 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4348 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4349 return set_error();
4350 }
4351 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004352#if defined(SIO_LOOPBACK_FAST_PATH)
4353 case SIO_LOOPBACK_FAST_PATH: {
4354 unsigned int option;
4355 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4356 return NULL;
4357 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4358 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4359 return set_error();
4360 }
4361 return PyLong_FromUnsignedLong(recv); }
4362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 default:
4364 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4365 return NULL;
4366 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004367}
4368PyDoc_STRVAR(sock_ioctl_doc,
4369"ioctl(cmd, option) -> long\n\
4370\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004371Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4372SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004373SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4374SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004375#endif
4376
4377#if defined(MS_WINDOWS)
4378static PyObject*
4379sock_share(PySocketSockObject *s, PyObject *arg)
4380{
4381 WSAPROTOCOL_INFO info;
4382 DWORD processId;
4383 int result;
4384
4385 if (!PyArg_ParseTuple(arg, "I", &processId))
4386 return NULL;
4387
4388 Py_BEGIN_ALLOW_THREADS
4389 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4390 Py_END_ALLOW_THREADS
4391 if (result == SOCKET_ERROR)
4392 return set_error();
4393 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4394}
4395PyDoc_STRVAR(sock_share_doc,
4396"share(process_id) -> bytes\n\
4397\n\
4398Share the socket with another process. The target process id\n\
4399must be provided and the resulting bytes object passed to the target\n\
4400process. There the shared socket can be instantiated by calling\n\
4401socket.fromshare().");
4402
Christian Heimesfaf2f632008-01-06 16:59:19 +00004403
4404#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004405
4406/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004407
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004408static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4410 accept_doc},
4411 {"bind", (PyCFunction)sock_bind, METH_O,
4412 bind_doc},
4413 {"close", (PyCFunction)sock_close, METH_NOARGS,
4414 close_doc},
4415 {"connect", (PyCFunction)sock_connect, METH_O,
4416 connect_doc},
4417 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4418 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004419 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4420 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4422 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004423#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 {"getpeername", (PyCFunction)sock_getpeername,
4425 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 {"getsockname", (PyCFunction)sock_getsockname,
4428 METH_NOARGS, getsockname_doc},
4429 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4430 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004431#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4433 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004434#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004435#if defined(MS_WINDOWS)
4436 {"share", (PyCFunction)sock_share, METH_VARARGS,
4437 sock_share_doc},
4438#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004439 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 listen_doc},
4441 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4442 recv_doc},
4443 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4444 recv_into_doc},
4445 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4446 recvfrom_doc},
4447 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4448 recvfrom_into_doc},
4449 {"send", (PyCFunction)sock_send, METH_VARARGS,
4450 send_doc},
4451 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4452 sendall_doc},
4453 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4454 sendto_doc},
4455 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4456 setblocking_doc},
4457 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4458 settimeout_doc},
4459 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4460 gettimeout_doc},
4461 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4462 setsockopt_doc},
4463 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4464 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004465#ifdef CMSG_LEN
4466 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4467 recvmsg_doc},
4468 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4469 recvmsg_into_doc,},
4470 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4471 sendmsg_doc},
4472#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004473#ifdef HAVE_SOCKADDR_ALG
4474 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4475 sendmsg_afalg_doc},
4476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004478};
4479
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004480/* SockObject members */
4481static PyMemberDef sock_memberlist[] = {
4482 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4483 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4484 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004485 {0},
4486};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004487
Victor Stinner71694d52015-03-28 01:18:54 +01004488static PyGetSetDef sock_getsetlist[] = {
4489 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4490 {NULL} /* sentinel */
4491};
4492
Guido van Rossum73624e91994-10-10 17:59:00 +00004493/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004494 First close the file description. */
4495
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004496static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004497sock_finalize(PySocketSockObject *s)
4498{
4499 SOCKET_T fd;
4500 PyObject *error_type, *error_value, *error_traceback;
4501
4502 /* Save the current exception, if any. */
4503 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4504
Victor Stinnerd3afb622016-07-22 17:47:09 +02004505 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004506 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4507 /* Spurious errors can appear at shutdown */
4508 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4509 PyErr_WriteUnraisable((PyObject *)s);
4510 }
4511 }
4512
4513 /* Only close the socket *after* logging the ResourceWarning warning
4514 to allow the logger to call socket methods like
4515 socket.getsockname(). If the socket is closed before, socket
4516 methods fails with the EBADF error. */
4517 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004518 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004519
4520 /* We do not want to retry upon EINTR: see sock_close() */
4521 Py_BEGIN_ALLOW_THREADS
4522 (void) SOCKETCLOSE(fd);
4523 Py_END_ALLOW_THREADS
4524 }
4525
4526 /* Restore the saved exception. */
4527 PyErr_Restore(error_type, error_value, error_traceback);
4528}
4529
4530static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004531sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004532{
Victor Stinner19a8e842016-03-21 16:36:48 +01004533 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4534 return;
4535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004537}
4538
Guido van Rossum30a685f1991-06-27 15:51:29 +00004539
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004541sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004542{
Victor Stinnere254e532014-07-26 14:36:55 +02004543 long sock_fd;
4544 /* On Windows, this test is needed because SOCKET_T is unsigned */
4545 if (s->sock_fd == INVALID_SOCKET) {
4546 sock_fd = -1;
4547 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004548#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004549 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 /* this can occur on Win64, and actually there is a special
4551 ugly printf formatter for decimal pointer length integer
4552 printing, only bother if necessary*/
4553 PyErr_SetString(PyExc_OverflowError,
4554 "no printf formatter to display "
4555 "the socket descriptor in decimal");
4556 return NULL;
4557 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004558#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004559 else
4560 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 return PyUnicode_FromFormat(
4562 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004563 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 s->sock_type,
4565 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004566}
4567
4568
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004569/* Create a new, uninitialized socket object. */
4570
4571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004572sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 new = type->tp_alloc(type, 0);
4577 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004578 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004579 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 ((PySocketSockObject *)new)->errorhandler = &set_error;
4581 }
4582 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004583}
4584
4585
4586/* Initialize a new socket object. */
4587
Victor Stinnerdaf45552013-08-28 00:53:59 +02004588#ifdef SOCK_CLOEXEC
4589/* socket() and socketpair() fail with EINVAL on Linux kernel older
4590 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4591static int sock_cloexec_works = -1;
4592#endif
4593
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004594/*ARGSUSED*/
4595static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004596sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 PySocketSockObject *s = (PySocketSockObject *)self;
4599 PyObject *fdobj = NULL;
4600 SOCKET_T fd = INVALID_SOCKET;
4601 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4602 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004603#ifndef MS_WINDOWS
4604#ifdef SOCK_CLOEXEC
4605 int *atomic_flag_works = &sock_cloexec_works;
4606#else
4607 int *atomic_flag_works = NULL;
4608#endif
4609#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4612 "|iiiO:socket", keywords,
4613 &family, &type, &proto, &fdobj))
4614 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004617#ifdef MS_WINDOWS
4618 /* recreate a socket that was duplicated */
4619 if (PyBytes_Check(fdobj)) {
4620 WSAPROTOCOL_INFO info;
4621 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4622 PyErr_Format(PyExc_ValueError,
4623 "socket descriptor string has wrong size, "
4624 "should be %zu bytes.", sizeof(info));
4625 return -1;
4626 }
4627 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4628 Py_BEGIN_ALLOW_THREADS
4629 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4630 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4631 Py_END_ALLOW_THREADS
4632 if (fd == INVALID_SOCKET) {
4633 set_error();
4634 return -1;
4635 }
4636 family = info.iAddressFamily;
4637 type = info.iSocketType;
4638 proto = info.iProtocol;
4639 }
4640 else
4641#endif
4642 {
4643 fd = PyLong_AsSocket_t(fdobj);
4644 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4645 return -1;
4646 if (fd == INVALID_SOCKET) {
4647 PyErr_SetString(PyExc_ValueError,
4648 "can't use invalid socket value");
4649 return -1;
4650 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 }
4652 }
4653 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004654#ifdef MS_WINDOWS
4655 /* Windows implementation */
4656#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4657#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4658#endif
4659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004661 if (support_wsa_no_inherit) {
4662 fd = WSASocket(family, type, proto,
4663 NULL, 0,
4664 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4665 if (fd == INVALID_SOCKET) {
4666 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4667 support_wsa_no_inherit = 0;
4668 fd = socket(family, type, proto);
4669 }
4670 }
4671 else {
4672 fd = socket(family, type, proto);
4673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 if (fd == INVALID_SOCKET) {
4677 set_error();
4678 return -1;
4679 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004680
4681 if (!support_wsa_no_inherit) {
4682 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4683 closesocket(fd);
4684 PyErr_SetFromWindowsErr(0);
4685 return -1;
4686 }
4687 }
4688#else
4689 /* UNIX */
4690 Py_BEGIN_ALLOW_THREADS
4691#ifdef SOCK_CLOEXEC
4692 if (sock_cloexec_works != 0) {
4693 fd = socket(family, type | SOCK_CLOEXEC, proto);
4694 if (sock_cloexec_works == -1) {
4695 if (fd >= 0) {
4696 sock_cloexec_works = 1;
4697 }
4698 else if (errno == EINVAL) {
4699 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4700 sock_cloexec_works = 0;
4701 fd = socket(family, type, proto);
4702 }
4703 }
4704 }
4705 else
4706#endif
4707 {
4708 fd = socket(family, type, proto);
4709 }
4710 Py_END_ALLOW_THREADS
4711
4712 if (fd == INVALID_SOCKET) {
4713 set_error();
4714 return -1;
4715 }
4716
4717 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4718 SOCKETCLOSE(fd);
4719 return -1;
4720 }
4721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 }
4723 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004726
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004727}
4728
4729
Guido van Rossumb6775db1994-08-01 11:34:53 +00004730/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004731
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004732static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4734 "_socket.socket", /* tp_name */
4735 sizeof(PySocketSockObject), /* tp_basicsize */
4736 0, /* tp_itemsize */
4737 (destructor)sock_dealloc, /* tp_dealloc */
4738 0, /* tp_print */
4739 0, /* tp_getattr */
4740 0, /* tp_setattr */
4741 0, /* tp_reserved */
4742 (reprfunc)sock_repr, /* tp_repr */
4743 0, /* tp_as_number */
4744 0, /* tp_as_sequence */
4745 0, /* tp_as_mapping */
4746 0, /* tp_hash */
4747 0, /* tp_call */
4748 0, /* tp_str */
4749 PyObject_GenericGetAttr, /* tp_getattro */
4750 0, /* tp_setattro */
4751 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004752 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4753 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 sock_doc, /* tp_doc */
4755 0, /* tp_traverse */
4756 0, /* tp_clear */
4757 0, /* tp_richcompare */
4758 0, /* tp_weaklistoffset */
4759 0, /* tp_iter */
4760 0, /* tp_iternext */
4761 sock_methods, /* tp_methods */
4762 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004763 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 0, /* tp_base */
4765 0, /* tp_dict */
4766 0, /* tp_descr_get */
4767 0, /* tp_descr_set */
4768 0, /* tp_dictoffset */
4769 sock_initobj, /* tp_init */
4770 PyType_GenericAlloc, /* tp_alloc */
4771 sock_new, /* tp_new */
4772 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004773 0, /* tp_is_gc */
4774 0, /* tp_bases */
4775 0, /* tp_mro */
4776 0, /* tp_cache */
4777 0, /* tp_subclasses */
4778 0, /* tp_weaklist */
4779 0, /* tp_del */
4780 0, /* tp_version_tag */
4781 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004782};
4783
Guido van Rossum30a685f1991-06-27 15:51:29 +00004784
Guido van Rossum81194471991-07-27 21:42:02 +00004785/* Python interface to gethostname(). */
4786
4787/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004788static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004789socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004790{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004791#ifdef MS_WINDOWS
4792 /* Don't use winsock's gethostname, as this returns the ANSI
4793 version of the hostname, whereas we need a Unicode string.
4794 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004795 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004796 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004797 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004798 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004799
4800 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004801 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004802
4803 if (GetLastError() != ERROR_MORE_DATA)
4804 return PyErr_SetFromWindowsErr(0);
4805
4806 if (size == 0)
4807 return PyUnicode_New(0, 0);
4808
4809 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4810 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004811 name = PyMem_New(wchar_t, size);
4812 if (!name) {
4813 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004814 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004815 }
Victor Stinner74168972011-11-17 01:11:36 +01004816 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4817 name,
4818 &size))
4819 {
4820 PyMem_Free(name);
4821 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004822 }
Victor Stinner74168972011-11-17 01:11:36 +01004823
4824 result = PyUnicode_FromWideChar(name, size);
4825 PyMem_Free(name);
4826 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004827#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 char buf[1024];
4829 int res;
4830 Py_BEGIN_ALLOW_THREADS
4831 res = gethostname(buf, (int) sizeof buf - 1);
4832 Py_END_ALLOW_THREADS
4833 if (res < 0)
4834 return set_error();
4835 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004836 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004837#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004838}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004840PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004841"gethostname() -> string\n\
4842\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004843Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004844
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004845#ifdef HAVE_SETHOSTNAME
4846PyDoc_STRVAR(sethostname_doc,
4847"sethostname(name)\n\n\
4848Sets the hostname to name.");
4849
4850static PyObject *
4851socket_sethostname(PyObject *self, PyObject *args)
4852{
4853 PyObject *hnobj;
4854 Py_buffer buf;
4855 int res, flag = 0;
4856
Christian Heimesd2774c72013-06-19 02:06:29 +02004857#ifdef _AIX
4858/* issue #18259, not declared in any useful header file */
4859extern int sethostname(const char *, size_t);
4860#endif
4861
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004862 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4863 PyErr_Clear();
4864 if (!PyArg_ParseTuple(args, "O&:sethostname",
4865 PyUnicode_FSConverter, &hnobj))
4866 return NULL;
4867 flag = 1;
4868 }
4869 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4870 if (!res) {
4871 res = sethostname(buf.buf, buf.len);
4872 PyBuffer_Release(&buf);
4873 }
4874 if (flag)
4875 Py_DECREF(hnobj);
4876 if (res)
4877 return set_error();
4878 Py_RETURN_NONE;
4879}
4880#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004881
Guido van Rossum30a685f1991-06-27 15:51:29 +00004882/* Python interface to gethostbyname(name). */
4883
4884/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004886socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 char *name;
4889 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004890 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004891
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004892 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893 return NULL;
4894 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004895 goto finally;
4896 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4897finally:
4898 PyMem_Free(name);
4899 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004900}
4901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004902PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004903"gethostbyname(host) -> address\n\
4904\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004905Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004906
4907
Victor Stinner72400302016-01-28 15:41:01 +01004908static PyObject*
4909sock_decode_hostname(const char *name)
4910{
4911#ifdef MS_WINDOWS
4912 /* Issue #26227: gethostbyaddr() returns a string encoded
4913 * to the ANSI code page */
4914 return PyUnicode_DecodeFSDefault(name);
4915#else
4916 /* Decode from UTF-8 */
4917 return PyUnicode_FromString(name);
4918#endif
4919}
4920
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004921/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4922
4923static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004924gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 char **pch;
4927 PyObject *rtn_tuple = (PyObject *)NULL;
4928 PyObject *name_list = (PyObject *)NULL;
4929 PyObject *addr_list = (PyObject *)NULL;
4930 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004931 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 if (h == NULL) {
4934 /* Let's get real error message to return */
4935 set_herror(h_errno);
4936 return NULL;
4937 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 if (h->h_addrtype != af) {
4940 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004941 errno = EAFNOSUPPORT;
4942 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 return NULL;
4944 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 case AF_INET:
4949 if (alen < sizeof(struct sockaddr_in))
4950 return NULL;
4951 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004952
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004953#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 case AF_INET6:
4955 if (alen < sizeof(struct sockaddr_in6))
4956 return NULL;
4957 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004958#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 if ((name_list = PyList_New(0)) == NULL)
4963 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 if ((addr_list = PyList_New(0)) == NULL)
4966 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 /* SF #1511317: h_aliases can be NULL */
4969 if (h->h_aliases) {
4970 for (pch = h->h_aliases; *pch != NULL; pch++) {
4971 int status;
4972 tmp = PyUnicode_FromString(*pch);
4973 if (tmp == NULL)
4974 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 status = PyList_Append(name_list, tmp);
4977 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 if (status)
4980 goto err;
4981 }
4982 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4985 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 case AF_INET:
4990 {
4991 struct sockaddr_in sin;
4992 memset(&sin, 0, sizeof(sin));
4993 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004994#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4998 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 if (pch == h->h_addr_list && alen >= sizeof(sin))
5001 memcpy((char *) addr, &sin, sizeof(sin));
5002 break;
5003 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005004
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005005#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 case AF_INET6:
5007 {
5008 struct sockaddr_in6 sin6;
5009 memset(&sin6, 0, sizeof(sin6));
5010 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005011#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5015 tmp = makeipaddr((struct sockaddr *)&sin6,
5016 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5019 memcpy((char *) addr, &sin6, sizeof(sin6));
5020 break;
5021 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005022#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005025 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 "unsupported address family");
5027 return NULL;
5028 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 if (tmp == NULL)
5031 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 status = PyList_Append(addr_list, tmp);
5034 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 if (status)
5037 goto err;
5038 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005039
Victor Stinner72400302016-01-28 15:41:01 +01005040 name = sock_decode_hostname(h->h_name);
5041 if (name == NULL)
5042 goto err;
5043 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005044
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005045 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 Py_XDECREF(name_list);
5047 Py_XDECREF(addr_list);
5048 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005049}
5050
5051
5052/* Python interface to gethostbyname_ex(name). */
5053
5054/*ARGSUSED*/
5055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005056socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 char *name;
5059 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005060 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005061 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005062 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005063#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005065#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005067#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 char buf[16384];
5069 int buf_len = (sizeof buf) - 1;
5070 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005071#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005072#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005074#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005075#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005076
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005077 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005079 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005080 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005082#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005083#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005084 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005086#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005088#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 memset((void *) &data, '\0', sizeof(data));
5090 result = gethostbyname_r(name, &hp_allocated, &data);
5091 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005092#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005093#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005094#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005096#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005098#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 Py_END_ALLOW_THREADS
5100 /* Some C libraries would require addr.__ss_family instead of
5101 addr.ss_family.
5102 Therefore, we cast the sockaddr_storage into sockaddr to
5103 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005104 sa = SAS2SA(&addr);
5105 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005107#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005109#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005110finally:
5111 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005113}
5114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005115PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005116"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5117\n\
5118Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005119for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005120
5121
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005122/* Python interface to gethostbyaddr(IP). */
5123
5124/*ARGSUSED*/
5125static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005126socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005127{
Charles-François Natali8b759652011-12-23 16:44:51 +01005128 sock_addr_t addr;
5129 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 char *ip_num;
5131 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005132 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005133#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005135#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005137#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 /* glibcs up to 2.10 assume that the buf argument to
5139 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5140 does not ensure. The attribute below instructs the compiler
5141 to maintain this alignment. */
5142 char buf[16384] Py_ALIGNED(8);
5143 int buf_len = (sizeof buf) - 1;
5144 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005145#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005146#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005148#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005149#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 char *ap;
5151 int al;
5152 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005153
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005154 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 return NULL;
5156 af = AF_UNSPEC;
5157 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005158 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 af = sa->sa_family;
5160 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005161 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 switch (af) {
5163 case AF_INET:
5164 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5165 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5166 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005167#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 case AF_INET6:
5169 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5170 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5171 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005174 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005175 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 }
5177 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005178#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005179#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005180 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 &hp_allocated, buf, buf_len,
5182 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005183#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 h = gethostbyaddr_r(ap, al, af,
5185 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005186#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 memset((void *) &data, '\0', sizeof(data));
5188 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5189 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005190#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005191#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005192#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005196#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005198 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005199#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005201#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005202finally:
5203 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005205}
5206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005207PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005208"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5209\n\
5210Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005211for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005212
Guido van Rossum30a685f1991-06-27 15:51:29 +00005213
5214/* Python interface to getservbyname(name).
5215 This only returns the port number, since the other info is already
5216 known or not useful (like the list of aliases). */
5217
5218/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005220socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 char *name, *proto=NULL;
5223 struct servent *sp;
5224 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5225 return NULL;
5226 Py_BEGIN_ALLOW_THREADS
5227 sp = getservbyname(name, proto);
5228 Py_END_ALLOW_THREADS
5229 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005230 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 return NULL;
5232 }
5233 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005234}
5235
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005236PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005237"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005238\n\
5239Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005240The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5241otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005242
Guido van Rossum30a685f1991-06-27 15:51:29 +00005243
Barry Warsaw11b91a02004-06-28 00:50:43 +00005244/* Python interface to getservbyport(port).
5245 This only returns the service name, since the other info is already
5246 known or not useful (like the list of aliases). */
5247
5248/*ARGSUSED*/
5249static PyObject *
5250socket_getservbyport(PyObject *self, PyObject *args)
5251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 int port;
5253 char *proto=NULL;
5254 struct servent *sp;
5255 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5256 return NULL;
5257 if (port < 0 || port > 0xffff) {
5258 PyErr_SetString(
5259 PyExc_OverflowError,
5260 "getservbyport: port must be 0-65535.");
5261 return NULL;
5262 }
5263 Py_BEGIN_ALLOW_THREADS
5264 sp = getservbyport(htons((short)port), proto);
5265 Py_END_ALLOW_THREADS
5266 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005267 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 return NULL;
5269 }
5270 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005271}
5272
5273PyDoc_STRVAR(getservbyport_doc,
5274"getservbyport(port[, protocolname]) -> string\n\
5275\n\
5276Return the service name from a port number and protocol name.\n\
5277The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5278otherwise any protocol will match.");
5279
Guido van Rossum3901d851996-12-19 16:35:04 +00005280/* Python interface to getprotobyname(name).
5281 This only returns the protocol number, since the other info is
5282 already known or not useful (like the list of aliases). */
5283
5284/*ARGSUSED*/
5285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005286socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 char *name;
5289 struct protoent *sp;
5290 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5291 return NULL;
5292 Py_BEGIN_ALLOW_THREADS
5293 sp = getprotobyname(name);
5294 Py_END_ALLOW_THREADS
5295 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005296 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 return NULL;
5298 }
5299 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005300}
5301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005302PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005303"getprotobyname(name) -> integer\n\
5304\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005305Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005306
Guido van Rossum3901d851996-12-19 16:35:04 +00005307
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005308#ifndef NO_DUP
5309/* dup() function for socket fds */
5310
5311static PyObject *
5312socket_dup(PyObject *self, PyObject *fdobj)
5313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 SOCKET_T fd, newfd;
5315 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005316#ifdef MS_WINDOWS
5317 WSAPROTOCOL_INFO info;
5318#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 fd = PyLong_AsSocket_t(fdobj);
5321 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5322 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005323
Victor Stinnerdaf45552013-08-28 00:53:59 +02005324#ifdef MS_WINDOWS
5325 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5326 return set_error();
5327
5328 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5329 FROM_PROTOCOL_INFO,
5330 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 if (newfd == INVALID_SOCKET)
5332 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005333
Victor Stinnerdaf45552013-08-28 00:53:59 +02005334 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5335 closesocket(newfd);
5336 PyErr_SetFromWindowsErr(0);
5337 return NULL;
5338 }
5339#else
5340 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5341 newfd = _Py_dup(fd);
5342 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005343 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005344#endif
5345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 newfdobj = PyLong_FromSocket_t(newfd);
5347 if (newfdobj == NULL)
5348 SOCKETCLOSE(newfd);
5349 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005350}
5351
5352PyDoc_STRVAR(dup_doc,
5353"dup(integer) -> integer\n\
5354\n\
5355Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5356sockets; on some platforms os.dup() won't work for socket file descriptors.");
5357#endif
5358
5359
Dave Cole331708b2004-08-09 04:51:41 +00005360#ifdef HAVE_SOCKETPAIR
5361/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005362 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005363 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005364
5365/*ARGSUSED*/
5366static PyObject *
5367socket_socketpair(PyObject *self, PyObject *args)
5368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 PySocketSockObject *s0 = NULL, *s1 = NULL;
5370 SOCKET_T sv[2];
5371 int family, type = SOCK_STREAM, proto = 0;
5372 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005373#ifdef SOCK_CLOEXEC
5374 int *atomic_flag_works = &sock_cloexec_works;
5375#else
5376 int *atomic_flag_works = NULL;
5377#endif
5378 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005379
5380#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005382#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5386 &family, &type, &proto))
5387 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005390 Py_BEGIN_ALLOW_THREADS
5391#ifdef SOCK_CLOEXEC
5392 if (sock_cloexec_works != 0) {
5393 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5394 if (sock_cloexec_works == -1) {
5395 if (ret >= 0) {
5396 sock_cloexec_works = 1;
5397 }
5398 else if (errno == EINVAL) {
5399 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5400 sock_cloexec_works = 0;
5401 ret = socketpair(family, type, proto, sv);
5402 }
5403 }
5404 }
5405 else
5406#endif
5407 {
5408 ret = socketpair(family, type, proto, sv);
5409 }
5410 Py_END_ALLOW_THREADS
5411
5412 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005414
5415 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5416 goto finally;
5417 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5418 goto finally;
5419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 s0 = new_sockobject(sv[0], family, type, proto);
5421 if (s0 == NULL)
5422 goto finally;
5423 s1 = new_sockobject(sv[1], family, type, proto);
5424 if (s1 == NULL)
5425 goto finally;
5426 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005427
5428finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 if (res == NULL) {
5430 if (s0 == NULL)
5431 SOCKETCLOSE(sv[0]);
5432 if (s1 == NULL)
5433 SOCKETCLOSE(sv[1]);
5434 }
5435 Py_XDECREF(s0);
5436 Py_XDECREF(s1);
5437 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005438}
5439
5440PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005441"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005442\n\
5443Create a pair of socket objects from the sockets returned by the platform\n\
5444socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005445The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005446AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005447
5448#endif /* HAVE_SOCKETPAIR */
5449
5450
Guido van Rossum006bf911996-06-12 04:04:55 +00005451static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005452socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5457 return NULL;
5458 }
5459 if (x1 < 0) {
5460 PyErr_SetString(PyExc_OverflowError,
5461 "can't convert negative number to unsigned long");
5462 return NULL;
5463 }
5464 x2 = (unsigned int)ntohs((unsigned short)x1);
5465 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005466}
5467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005468PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005469"ntohs(integer) -> integer\n\
5470\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005471Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005472
5473
Guido van Rossum006bf911996-06-12 04:04:55 +00005474static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005475socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 if (PyLong_Check(arg)) {
5480 x = PyLong_AsUnsignedLong(arg);
5481 if (x == (unsigned long) -1 && PyErr_Occurred())
5482 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005483#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 {
5485 unsigned long y;
5486 /* only want the trailing 32 bits */
5487 y = x & 0xFFFFFFFFUL;
5488 if (y ^ x)
5489 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005490 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 x = y;
5492 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 }
5495 else
5496 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005497 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005500}
5501
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005502PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005503"ntohl(integer) -> integer\n\
5504\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005505Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005506
5507
Guido van Rossum006bf911996-06-12 04:04:55 +00005508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005509socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5514 return NULL;
5515 }
5516 if (x1 < 0) {
5517 PyErr_SetString(PyExc_OverflowError,
5518 "can't convert negative number to unsigned long");
5519 return NULL;
5520 }
5521 x2 = (unsigned int)htons((unsigned short)x1);
5522 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005523}
5524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005525PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005526"htons(integer) -> integer\n\
5527\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005528Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005529
5530
Guido van Rossum006bf911996-06-12 04:04:55 +00005531static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005532socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 if (PyLong_Check(arg)) {
5537 x = PyLong_AsUnsignedLong(arg);
5538 if (x == (unsigned long) -1 && PyErr_Occurred())
5539 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005540#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 {
5542 unsigned long y;
5543 /* only want the trailing 32 bits */
5544 y = x & 0xFFFFFFFFUL;
5545 if (y ^ x)
5546 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005547 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 x = y;
5549 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 }
5552 else
5553 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005554 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 Py_TYPE(arg)->tp_name);
5556 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005557}
5558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005559PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005560"htonl(integer) -> integer\n\
5561\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005562Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005563
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005564/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005565
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005566PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005567"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005568\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005569Convert 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 +00005570binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005571
5572static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005573socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005574{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005575#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005577#endif
5578
5579#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005580#if (SIZEOF_INT != 4)
5581#error "Not sure if in_addr_t exists and int is not 32-bits."
5582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 /* Have to use inet_addr() instead */
5584 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5589 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005590
Tim Peters1df9fdd2003-02-13 03:13:40 +00005591
5592#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005593
5594#ifdef USE_INET_ATON_WEAKLINK
5595 if (inet_aton != NULL) {
5596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 if (inet_aton(ip_addr, &buf))
5598 return PyBytes_FromStringAndSize((char *)(&buf),
5599 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005600
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005601 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 "illegal IP address string passed to inet_aton");
5603 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005604
Thomas Wouters477c8d52006-05-27 19:21:47 +00005605#ifdef USE_INET_ATON_WEAKLINK
5606 } else {
5607#endif
5608
5609#endif
5610
5611#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 /* special-case this address as inet_addr might return INADDR_NONE
5614 * for this */
5615 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005616 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005622 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 "illegal IP address string passed to inet_aton");
5624 return NULL;
5625 }
5626 }
5627 return PyBytes_FromStringAndSize((char *) &packed_addr,
5628 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005629
5630#ifdef USE_INET_ATON_WEAKLINK
5631 }
5632#endif
5633
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005634#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005635}
5636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005637PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005638"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005639\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005640Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005641
5642static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005643socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005644{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005645 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005647
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005648 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 return NULL;
5650 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005651
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005652 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005653 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005655 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 return NULL;
5657 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005658
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005659 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5660 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005663}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005664
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005665#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005666
5667PyDoc_STRVAR(inet_pton_doc,
5668"inet_pton(af, ip) -> packed IP address string\n\
5669\n\
5670Convert an IP address from string format to a packed string suitable\n\
5671for use with low-level network functions.");
5672
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005673#endif
5674
5675#ifdef HAVE_INET_PTON
5676
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005677static PyObject *
5678socket_inet_pton(PyObject *self, PyObject *args)
5679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 int af;
5681 char* ip;
5682 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005683#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005684 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5689 return NULL;
5690 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005691
Martin v. Löwis04697e82004-06-02 12:35:29 +00005692#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005694 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 "can't use AF_INET6, IPv6 is disabled");
5696 return NULL;
5697 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005698#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 retval = inet_pton(af, ip, packed);
5701 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005702 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 return NULL;
5704 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005705 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 "illegal IP address string passed to inet_pton");
5707 return NULL;
5708 } else if (af == AF_INET) {
5709 return PyBytes_FromStringAndSize(packed,
5710 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005711#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 } else if (af == AF_INET6) {
5713 return PyBytes_FromStringAndSize(packed,
5714 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005717 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 return NULL;
5719 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005720}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005721#elif defined(MS_WINDOWS)
5722
5723static PyObject *
5724socket_inet_pton(PyObject *self, PyObject *args)
5725{
5726 int af;
5727 char* ip;
5728 struct sockaddr_in6 addr;
5729 INT ret, size;
5730
5731 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5732 return NULL;
5733 }
5734
Victor Stinnere990c6e2013-11-16 00:18:58 +01005735 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005736 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5737
5738 if (ret) {
5739 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5740 return NULL;
5741 } else if(af == AF_INET) {
5742 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005743 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005744 sizeof(addr4->sin_addr));
5745 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005746 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005747 sizeof(addr.sin6_addr));
5748 } else {
5749 PyErr_SetString(PyExc_OSError, "unknown address family");
5750 return NULL;
5751 }
5752}
5753
5754#endif
5755
5756#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005757
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005758PyDoc_STRVAR(inet_ntop_doc,
5759"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5760\n\
5761Convert a packed IP address of the given family to string format.");
5762
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005763#endif
5764
5765
5766#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005767static PyObject *
5768socket_inet_ntop(PyObject *self, PyObject *args)
5769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005771 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005773#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005774 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005775#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005777#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5780 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005781
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005782 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 return NULL;
5784 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005787 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 PyErr_SetString(PyExc_ValueError,
5789 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005790 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 return NULL;
5792 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005793#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005795 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 PyErr_SetString(PyExc_ValueError,
5797 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005798 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 return NULL;
5800 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 } else {
5803 PyErr_Format(PyExc_ValueError,
5804 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005805 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 return NULL;
5807 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005808
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005809 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5810 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005812 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 return NULL;
5814 } else {
5815 return PyUnicode_FromString(retval);
5816 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005817}
5818
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005819#elif defined(MS_WINDOWS)
5820
5821static PyObject *
5822socket_inet_ntop(PyObject *self, PyObject *args)
5823{
5824 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005825 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005826 struct sockaddr_in6 addr;
5827 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005828#ifdef ENABLE_IPV6
5829 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5830#else
5831 char ip[INET_ADDRSTRLEN + 1];
5832#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005833
5834 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5835 memset((void *) &ip[0], '\0', sizeof(ip));
5836
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005837 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005838 return NULL;
5839 }
5840
5841 if (af == AF_INET) {
5842 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5843
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005844 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005845 PyErr_SetString(PyExc_ValueError,
5846 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005847 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005848 return NULL;
5849 }
5850 memset(addr4, 0, sizeof(struct sockaddr_in));
5851 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005852 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005853 addrlen = sizeof(struct sockaddr_in);
5854 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005855 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005856 PyErr_SetString(PyExc_ValueError,
5857 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005858 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005859 return NULL;
5860 }
5861
5862 memset(&addr, 0, sizeof(addr));
5863 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005864 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005865 addrlen = sizeof(addr);
5866 } else {
5867 PyErr_Format(PyExc_ValueError,
5868 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005869 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005870 return NULL;
5871 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005872 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005873
5874 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005875 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005876 ip, &retlen);
5877
5878 if (ret) {
5879 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5880 return NULL;
5881 } else {
5882 return PyUnicode_FromString(ip);
5883 }
5884}
5885
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005886#endif /* HAVE_INET_PTON */
5887
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005888/* Python interface to getaddrinfo(host, port). */
5889
5890/*ARGSUSED*/
5891static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005892socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005893{
Victor Stinner77af1722011-05-26 14:05:59 +02005894 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005895 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 struct addrinfo hints, *res;
5897 struct addrinfo *res0 = NULL;
5898 PyObject *hobj = NULL;
5899 PyObject *pobj = (PyObject *)NULL;
5900 char pbuf[30];
5901 char *hptr, *pptr;
5902 int family, socktype, protocol, flags;
5903 int error;
5904 PyObject *all = (PyObject *)NULL;
5905 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005906
Georg Brandl6083a4b2013-10-14 06:51:46 +02005907 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005909 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005910 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 &protocol, &flags)) {
5912 return NULL;
5913 }
5914 if (hobj == Py_None) {
5915 hptr = NULL;
5916 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005917 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 if (!idna)
5919 return NULL;
5920 assert(PyBytes_Check(idna));
5921 hptr = PyBytes_AS_STRING(idna);
5922 } else if (PyBytes_Check(hobj)) {
5923 hptr = PyBytes_AsString(hobj);
5924 } else {
5925 PyErr_SetString(PyExc_TypeError,
5926 "getaddrinfo() argument 1 must be string or None");
5927 return NULL;
5928 }
5929 if (PyLong_CheckExact(pobj)) {
5930 long value = PyLong_AsLong(pobj);
5931 if (value == -1 && PyErr_Occurred())
5932 goto err;
5933 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5934 pptr = pbuf;
5935 } else if (PyUnicode_Check(pobj)) {
5936 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005937 if (pptr == NULL)
5938 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005940 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 } else if (pobj == Py_None) {
5942 pptr = (char *)NULL;
5943 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005944 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 goto err;
5946 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005947#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005948 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5949 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005950 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5951 * This workaround avoids a segfault in libsystem.
5952 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005953 pptr = "00";
5954 }
5955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 memset(&hints, 0, sizeof(hints));
5957 hints.ai_family = family;
5958 hints.ai_socktype = socktype;
5959 hints.ai_protocol = protocol;
5960 hints.ai_flags = flags;
5961 Py_BEGIN_ALLOW_THREADS
5962 ACQUIRE_GETADDRINFO_LOCK
5963 error = getaddrinfo(hptr, pptr, &hints, &res0);
5964 Py_END_ALLOW_THREADS
5965 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5966 if (error) {
5967 set_gaierror(error);
5968 goto err;
5969 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005970
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005971 all = PyList_New(0);
5972 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 goto err;
5974 for (res = res0; res; res = res->ai_next) {
5975 PyObject *single;
5976 PyObject *addr =
5977 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5978 if (addr == NULL)
5979 goto err;
5980 single = Py_BuildValue("iiisO", res->ai_family,
5981 res->ai_socktype, res->ai_protocol,
5982 res->ai_canonname ? res->ai_canonname : "",
5983 addr);
5984 Py_DECREF(addr);
5985 if (single == NULL)
5986 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 if (PyList_Append(all, single))
5989 goto err;
5990 Py_XDECREF(single);
5991 }
5992 Py_XDECREF(idna);
5993 if (res0)
5994 freeaddrinfo(res0);
5995 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005996 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 Py_XDECREF(all);
5998 Py_XDECREF(idna);
5999 if (res0)
6000 freeaddrinfo(res0);
6001 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006002}
6003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006004PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006005"getaddrinfo(host, port [, family, type, proto, flags])\n\
6006 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006007\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006008Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006009
6010/* Python interface to getnameinfo(sa, flags). */
6011
6012/*ARGSUSED*/
6013static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006014socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 PyObject *sa = (PyObject *)NULL;
6017 int flags;
6018 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006019 int port;
6020 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6022 struct addrinfo hints, *res = NULL;
6023 int error;
6024 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006025 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 flags = flowinfo = scope_id = 0;
6028 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6029 return NULL;
6030 if (!PyTuple_Check(sa)) {
6031 PyErr_SetString(PyExc_TypeError,
6032 "getnameinfo() argument 1 must be a tuple");
6033 return NULL;
6034 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006035 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 &hostp, &port, &flowinfo, &scope_id))
6037 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006038 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006039 PyErr_SetString(PyExc_OverflowError,
6040 "getsockaddrarg: flowinfo must be 0-1048575.");
6041 return NULL;
6042 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6044 memset(&hints, 0, sizeof(hints));
6045 hints.ai_family = AF_UNSPEC;
6046 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006047 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 Py_BEGIN_ALLOW_THREADS
6049 ACQUIRE_GETADDRINFO_LOCK
6050 error = getaddrinfo(hostp, pbuf, &hints, &res);
6051 Py_END_ALLOW_THREADS
6052 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6053 if (error) {
6054 set_gaierror(error);
6055 goto fail;
6056 }
6057 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006058 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 "sockaddr resolved to multiple addresses");
6060 goto fail;
6061 }
6062 switch (res->ai_family) {
6063 case AF_INET:
6064 {
6065 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006066 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 "IPv4 sockaddr must be 2 tuple");
6068 goto fail;
6069 }
6070 break;
6071 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006072#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 case AF_INET6:
6074 {
6075 struct sockaddr_in6 *sin6;
6076 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006077 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 sin6->sin6_scope_id = scope_id;
6079 break;
6080 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006083 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6085 if (error) {
6086 set_gaierror(error);
6087 goto fail;
6088 }
Victor Stinner72400302016-01-28 15:41:01 +01006089
6090 name = sock_decode_hostname(hbuf);
6091 if (name == NULL)
6092 goto fail;
6093 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006094
6095fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 if (res)
6097 freeaddrinfo(res);
6098 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006099}
6100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006101PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006102"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006103\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006104Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006105
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006106
6107/* Python API to getting and setting the default timeout value. */
6108
6109static PyObject *
6110socket_getdefaulttimeout(PyObject *self)
6111{
Victor Stinner71694d52015-03-28 01:18:54 +01006112 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 Py_INCREF(Py_None);
6114 return Py_None;
6115 }
Victor Stinner71694d52015-03-28 01:18:54 +01006116 else {
6117 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6118 return PyFloat_FromDouble(seconds);
6119 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006120}
6121
6122PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006123"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006124\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006125Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006126A value of None indicates that new socket objects have no timeout.\n\
6127When the socket module is first imported, the default is None.");
6128
6129static PyObject *
6130socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6131{
Victor Stinner71694d52015-03-28 01:18:54 +01006132 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006133
Victor Stinner71694d52015-03-28 01:18:54 +01006134 if (socket_parse_timeout(&timeout, arg) < 0)
6135 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 Py_INCREF(Py_None);
6140 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006141}
6142
6143PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006144"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006145\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006146Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006147A value of None indicates that new socket objects have no timeout.\n\
6148When the socket module is first imported, the default is None.");
6149
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006150#ifdef HAVE_IF_NAMEINDEX
6151/* Python API for getting interface indices and names */
6152
6153static PyObject *
6154socket_if_nameindex(PyObject *self, PyObject *arg)
6155{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006156 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006157 int i;
6158 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006159
Charles-François Natali60713592011-05-20 16:55:06 +02006160 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006161 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006162 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006163 return NULL;
6164 }
6165
6166 list = PyList_New(0);
6167 if (list == NULL) {
6168 if_freenameindex(ni);
6169 return NULL;
6170 }
6171
Charles-François Natali60713592011-05-20 16:55:06 +02006172 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6173 PyObject *ni_tuple = Py_BuildValue("IO&",
6174 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006175
6176 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6177 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006178 Py_DECREF(list);
6179 if_freenameindex(ni);
6180 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006181 }
6182 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006183 }
6184
6185 if_freenameindex(ni);
6186 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006187}
6188
6189PyDoc_STRVAR(if_nameindex_doc,
6190"if_nameindex()\n\
6191\n\
6192Returns a list of network interface information (index, name) tuples.");
6193
Charles-François Natali60713592011-05-20 16:55:06 +02006194static PyObject *
6195socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006196{
Charles-François Natali60713592011-05-20 16:55:06 +02006197 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006198 unsigned long index;
6199
Charles-François Natali60713592011-05-20 16:55:06 +02006200 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6201 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006202 return NULL;
6203
Charles-François Natali60713592011-05-20 16:55:06 +02006204 index = if_nametoindex(PyBytes_AS_STRING(oname));
6205 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006206 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006207 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006208 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006209 return NULL;
6210 }
6211
6212 return PyLong_FromUnsignedLong(index);
6213}
6214
6215PyDoc_STRVAR(if_nametoindex_doc,
6216"if_nametoindex(if_name)\n\
6217\n\
6218Returns the interface index corresponding to the interface name if_name.");
6219
Charles-François Natali60713592011-05-20 16:55:06 +02006220static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006221socket_if_indextoname(PyObject *self, PyObject *arg)
6222{
Charles-François Natali60713592011-05-20 16:55:06 +02006223 unsigned long index;
6224 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006225
Charles-François Natali60713592011-05-20 16:55:06 +02006226 index = PyLong_AsUnsignedLong(arg);
6227 if (index == (unsigned long) -1)
6228 return NULL;
6229
6230 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006231 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006232 return NULL;
6233 }
6234
Charles-François Natali60713592011-05-20 16:55:06 +02006235 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236}
6237
6238PyDoc_STRVAR(if_indextoname_doc,
6239"if_indextoname(if_index)\n\
6240\n\
6241Returns the interface name corresponding to the interface index if_index.");
6242
6243#endif /* HAVE_IF_NAMEINDEX */
6244
6245
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006246#ifdef CMSG_LEN
6247/* Python interface to CMSG_LEN(length). */
6248
6249static PyObject *
6250socket_CMSG_LEN(PyObject *self, PyObject *args)
6251{
6252 Py_ssize_t length;
6253 size_t result;
6254
6255 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6256 return NULL;
6257 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6258 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6259 return NULL;
6260 }
6261 return PyLong_FromSize_t(result);
6262}
6263
6264PyDoc_STRVAR(CMSG_LEN_doc,
6265"CMSG_LEN(length) -> control message length\n\
6266\n\
6267Return the total length, without trailing padding, of an ancillary\n\
6268data item with associated data of the given length. This value can\n\
6269often be used as the buffer size for recvmsg() to receive a single\n\
6270item of ancillary data, but RFC 3542 requires portable applications to\n\
6271use CMSG_SPACE() and thus include space for padding, even when the\n\
6272item will be the last in the buffer. Raises OverflowError if length\n\
6273is outside the permissible range of values.");
6274
6275
6276#ifdef CMSG_SPACE
6277/* Python interface to CMSG_SPACE(length). */
6278
6279static PyObject *
6280socket_CMSG_SPACE(PyObject *self, PyObject *args)
6281{
6282 Py_ssize_t length;
6283 size_t result;
6284
6285 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6286 return NULL;
6287 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6288 PyErr_SetString(PyExc_OverflowError,
6289 "CMSG_SPACE() argument out of range");
6290 return NULL;
6291 }
6292 return PyLong_FromSize_t(result);
6293}
6294
6295PyDoc_STRVAR(CMSG_SPACE_doc,
6296"CMSG_SPACE(length) -> buffer size\n\
6297\n\
6298Return the buffer size needed for recvmsg() to receive an ancillary\n\
6299data item with associated data of the given length, along with any\n\
6300trailing padding. The buffer space needed to receive multiple items\n\
6301is the sum of the CMSG_SPACE() values for their associated data\n\
6302lengths. Raises OverflowError if length is outside the permissible\n\
6303range of values.");
6304#endif /* CMSG_SPACE */
6305#endif /* CMSG_LEN */
6306
6307
Guido van Rossum30a685f1991-06-27 15:51:29 +00006308/* List of functions exported by this module. */
6309
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006310static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 {"gethostbyname", socket_gethostbyname,
6312 METH_VARARGS, gethostbyname_doc},
6313 {"gethostbyname_ex", socket_gethostbyname_ex,
6314 METH_VARARGS, ghbn_ex_doc},
6315 {"gethostbyaddr", socket_gethostbyaddr,
6316 METH_VARARGS, gethostbyaddr_doc},
6317 {"gethostname", socket_gethostname,
6318 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006319#ifdef HAVE_SETHOSTNAME
6320 {"sethostname", socket_sethostname,
6321 METH_VARARGS, sethostname_doc},
6322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 {"getservbyname", socket_getservbyname,
6324 METH_VARARGS, getservbyname_doc},
6325 {"getservbyport", socket_getservbyport,
6326 METH_VARARGS, getservbyport_doc},
6327 {"getprotobyname", socket_getprotobyname,
6328 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006329#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 {"dup", socket_dup,
6331 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006332#endif
Dave Cole331708b2004-08-09 04:51:41 +00006333#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 {"socketpair", socket_socketpair,
6335 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 {"ntohs", socket_ntohs,
6338 METH_VARARGS, ntohs_doc},
6339 {"ntohl", socket_ntohl,
6340 METH_O, ntohl_doc},
6341 {"htons", socket_htons,
6342 METH_VARARGS, htons_doc},
6343 {"htonl", socket_htonl,
6344 METH_O, htonl_doc},
6345 {"inet_aton", socket_inet_aton,
6346 METH_VARARGS, inet_aton_doc},
6347 {"inet_ntoa", socket_inet_ntoa,
6348 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006349#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 {"inet_pton", socket_inet_pton,
6351 METH_VARARGS, inet_pton_doc},
6352 {"inet_ntop", socket_inet_ntop,
6353 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006354#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006355 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6356 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 {"getnameinfo", socket_getnameinfo,
6358 METH_VARARGS, getnameinfo_doc},
6359 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6360 METH_NOARGS, getdefaulttimeout_doc},
6361 {"setdefaulttimeout", socket_setdefaulttimeout,
6362 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006363#ifdef HAVE_IF_NAMEINDEX
6364 {"if_nameindex", socket_if_nameindex,
6365 METH_NOARGS, if_nameindex_doc},
6366 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006367 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006368 {"if_indextoname", socket_if_indextoname,
6369 METH_O, if_indextoname_doc},
6370#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006371#ifdef CMSG_LEN
6372 {"CMSG_LEN", socket_CMSG_LEN,
6373 METH_VARARGS, CMSG_LEN_doc},
6374#ifdef CMSG_SPACE
6375 {"CMSG_SPACE", socket_CMSG_SPACE,
6376 METH_VARARGS, CMSG_SPACE_doc},
6377#endif
6378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006380};
6381
Guido van Rossum30a685f1991-06-27 15:51:29 +00006382
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006383#ifdef MS_WINDOWS
6384#define OS_INIT_DEFINED
6385
6386/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006387
6388static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006389os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006392}
6393
6394static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006395os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 WSADATA WSAData;
6398 int ret;
6399 ret = WSAStartup(0x0101, &WSAData);
6400 switch (ret) {
6401 case 0: /* No error */
6402 Py_AtExit(os_cleanup);
6403 return 1; /* Success */
6404 case WSASYSNOTREADY:
6405 PyErr_SetString(PyExc_ImportError,
6406 "WSAStartup failed: network not ready");
6407 break;
6408 case WSAVERNOTSUPPORTED:
6409 case WSAEINVAL:
6410 PyErr_SetString(
6411 PyExc_ImportError,
6412 "WSAStartup failed: requested version not supported");
6413 break;
6414 default:
6415 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6416 break;
6417 }
6418 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006419}
6420
Guido van Rossum8d665e61996-06-26 18:22:49 +00006421#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006422
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006423
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006424
6425#ifndef OS_INIT_DEFINED
6426static int
6427os_init(void)
6428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006430}
6431#endif
6432
6433
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006434/* C API table - always add new things to the end for binary
6435 compatibility. */
6436static
6437PySocketModule_APIObject PySocketModuleAPI =
6438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006440 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006442};
6443
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006445/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006447 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006448 "socket.py" which implements some additional functionality.
6449 The import of "_socket" may fail with an ImportError exception if
6450 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006451 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006452 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006453*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006455PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006456"Implementation module for socket operations.\n\
6457\n\
6458See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006459
Martin v. Löwis1a214512008-06-11 05:26:20 +00006460static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModuleDef_HEAD_INIT,
6462 PySocket_MODULE_NAME,
6463 socket_doc,
6464 -1,
6465 socket_methods,
6466 NULL,
6467 NULL,
6468 NULL,
6469 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006470};
6471
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006472PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006473PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 if (!os_init())
6478 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006479
Victor Stinnerdaf45552013-08-28 00:53:59 +02006480#ifdef MS_WINDOWS
6481 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006482#if defined(_MSC_VER) && _MSC_VER >= 1800
6483 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6484#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006485 DWORD version = GetVersion();
6486 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6487 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6488 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006489 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6490#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006491 }
6492#endif
6493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 Py_TYPE(&sock_type) = &PyType_Type;
6495 m = PyModule_Create(&socketmodule);
6496 if (m == NULL)
6497 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006498
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006499 Py_INCREF(PyExc_OSError);
6500 PySocketModuleAPI.error = PyExc_OSError;
6501 Py_INCREF(PyExc_OSError);
6502 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006504 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 if (socket_herror == NULL)
6506 return NULL;
6507 Py_INCREF(socket_herror);
6508 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006509 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510 NULL);
6511 if (socket_gaierror == NULL)
6512 return NULL;
6513 Py_INCREF(socket_gaierror);
6514 PyModule_AddObject(m, "gaierror", socket_gaierror);
6515 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006516 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 if (socket_timeout == NULL)
6518 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006519 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 Py_INCREF(socket_timeout);
6521 PyModule_AddObject(m, "timeout", socket_timeout);
6522 Py_INCREF((PyObject *)&sock_type);
6523 if (PyModule_AddObject(m, "SocketType",
6524 (PyObject *)&sock_type) != 0)
6525 return NULL;
6526 Py_INCREF((PyObject *)&sock_type);
6527 if (PyModule_AddObject(m, "socket",
6528 (PyObject *)&sock_type) != 0)
6529 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006530
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006531#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006533#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 Py_INCREF(has_ipv6);
6537 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 /* Export C API */
6540 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6541 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6542 ) != 0)
6543 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006546#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006548#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006550#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006551 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006552#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006553#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006556#endif
6557#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006559#endif
6560#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006563#endif
6564#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006567#endif
6568#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006571#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006572#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006575#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006576#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006579#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006580#ifdef HAVE_SOCKADDR_ALG
6581 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6582#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006583#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006585 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006586#endif
6587#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006589#endif
6590#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006593#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006594#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006597#endif
6598#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006601#endif
6602#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006605#endif
6606#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006609#endif
6610#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, AF_NETLINK);
6613 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006614#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006616#endif
6617#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006619#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6621 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006622#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006624#endif
6625#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006627#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006628#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006630#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006631#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006633#endif
6634#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006636#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006638#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006640#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006641#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006643#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006644#ifdef NETLINK_CRYPTO
6645 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6646#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006647#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006648#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006651#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006652#ifdef AF_LINK
6653 PyModule_AddIntMacro(m, AF_LINK);
6654#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006655#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006658#endif
6659#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006662#endif
6663#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006666#endif
6667#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#endif
6671#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006674#endif
6675#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006678#endif
6679#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006682#endif
6683#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006686#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006687
Hye-Shik Chang81268602004-02-02 06:05:24 +00006688#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6690 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6691 PyModule_AddIntMacro(m, BTPROTO_HCI);
6692 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006693#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006695#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006696#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006697#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006699#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6701 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006702#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6705 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006706#endif
6707
Charles-François Natali47413c12011-10-06 19:47:44 +02006708#ifdef AF_CAN
6709 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006711#endif
6712#ifdef PF_CAN
6713 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006715#endif
6716
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006717/* Reliable Datagram Sockets */
6718#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006720#endif
6721#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006723#endif
6724
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006725/* Kernel event messages */
6726#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006728#endif
6729#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006731#endif
6732
Antoine Pitroub156a462010-10-27 20:13:57 +00006733#ifdef AF_PACKET
6734 PyModule_AddIntMacro(m, AF_PACKET);
6735#endif
6736#ifdef PF_PACKET
6737 PyModule_AddIntMacro(m, PF_PACKET);
6738#endif
6739#ifdef PACKET_HOST
6740 PyModule_AddIntMacro(m, PACKET_HOST);
6741#endif
6742#ifdef PACKET_BROADCAST
6743 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6744#endif
6745#ifdef PACKET_MULTICAST
6746 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6747#endif
6748#ifdef PACKET_OTHERHOST
6749 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6750#endif
6751#ifdef PACKET_OUTGOING
6752 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6753#endif
6754#ifdef PACKET_LOOPBACK
6755 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6756#endif
6757#ifdef PACKET_FASTROUTE
6758 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006759#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006760
Christian Heimes043d6f62008-01-07 17:19:16 +00006761#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6766 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6767 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006768
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6770 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6771 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, SOL_TIPC);
6775 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6776 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6777 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6778 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006779
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6781 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6782 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6783 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6787 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006788#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006791#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6793 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6794 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6795 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6796 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6797 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006798#endif
6799
Christian Heimesdffa3942016-09-05 23:54:41 +02006800#ifdef HAVE_SOCKADDR_ALG
6801 /* Socket options */
6802 PyModule_AddIntMacro(m, ALG_SET_KEY);
6803 PyModule_AddIntMacro(m, ALG_SET_IV);
6804 PyModule_AddIntMacro(m, ALG_SET_OP);
6805 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6806 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6807 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6808
6809 /* Operations */
6810 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6811 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6812 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6813 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6814#endif
6815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, SOCK_STREAM);
6818 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006819/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006820#ifdef SOCK_RAW
6821 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006823#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006825#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006827#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006828#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006830#endif
6831#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006833#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006843#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006844#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006846#endif
6847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006851#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006865#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006866#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006869#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006897#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006898#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006900#endif
6901#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006903#endif
6904#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006906#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006907#ifdef SO_PASSSEC
6908 PyModule_AddIntMacro(m, SO_PASSSEC);
6909#endif
6910#ifdef SO_PEERSEC
6911 PyModule_AddIntMacro(m, SO_PEERSEC);
6912#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006913#ifdef SO_BINDTODEVICE
6914 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6915#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006916#ifdef SO_PRIORITY
6917 PyModule_AddIntMacro(m, SO_PRIORITY);
6918#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006919#ifdef SO_MARK
6920 PyModule_AddIntMacro(m, SO_MARK);
6921#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006922#ifdef SO_DOMAIN
6923 PyModule_AddIntMacro(m, SO_DOMAIN);
6924#endif
6925#ifdef SO_PROTOCOL
6926 PyModule_AddIntMacro(m, SO_PROTOCOL);
6927#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 /* Maximum number of connections for "listen" */
6930#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006934#endif
6935
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006936 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006937#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006939#endif
6940#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006942#endif
6943#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006945#endif
6946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947 /* Flags for send, recv */
6948#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006978#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#endif
6981#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006983#endif
6984#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006986#endif
6987#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#endif
6990#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006992#endif
6993#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006995#endif
6996#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006998#endif
6999#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007001#endif
7002#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007004#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007005#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007007#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 /* Protocol level and numbers, usable for [gs]etsockopt */
7010#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007014 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007015#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007016 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007035#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007038#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007040#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007042#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007043#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007045#endif
7046#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7048 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007049#endif
7050#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7052 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7053 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007054
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7056 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7057 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007058#endif
7059#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7061 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7062 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7063 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007064#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007065#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7066 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7067#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007068#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007070 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7071 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7072 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7073 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7074 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7075 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7076 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7077 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7078 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7079 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7080 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7081 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7082#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007083#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007085#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007086#ifdef HAVE_SOCKADDR_ALG
7087 PyModule_AddIntMacro(m, SOL_ALG);
7088#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007089#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007091#endif
7092#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007094#endif
7095#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007097#endif
7098#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007100#endif
7101#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007103#endif
7104#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007135#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007137#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007140#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007148#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007169#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007210#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007211#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007216#endif
7217/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007220#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
7226
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007227#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007229#endif
7230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231 /* Some port configuration */
7232#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007234#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
7242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243 /* Some reserved IP v.4 addresses */
7244#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007246#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007251#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007256#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef INADDR_ALLHOSTS_GROUP
7265 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7266 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007267#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007277#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007279#endif
7280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281 /* IPv4 [gs]etsockopt options */
7282#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007329#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007330#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007332#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7335#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007354#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007358#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007359 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007360#endif
7361#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007363#endif
7364#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007366#endif
7367#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007369#endif
7370#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007372#endif
7373#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007375#endif
7376#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007378#endif
7379#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007381#endif
7382#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007384#endif
7385#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007387#endif
7388#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007390#endif
7391#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007393#endif
7394#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007396#endif
7397#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007399#endif
7400#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007402#endif
7403#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007405#endif
7406#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007408#endif
7409#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007411#endif
7412#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007414#endif
7415#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007417#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419 /* TCP options */
7420#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007441#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007455#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007456#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007458#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460 /* IPX options */
7461#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007463#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007464
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007465/* Reliable Datagram Sockets */
7466#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007468#endif
7469#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007471#endif
7472#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007474#endif
7475#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007477#endif
7478#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007480#endif
7481#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007483#endif
7484#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007486#endif
7487#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007489#endif
7490#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007492#endif
7493#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007495#endif
7496#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007498#endif
7499#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007501#endif
7502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007504#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007506#endif
7507#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007509#endif
7510#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007512#endif
7513#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007515#endif
7516#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007518#endif
7519#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007521#endif
7522#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007524#endif
7525#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007527#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007528#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007530#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007531#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007533#endif
7534#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007536#endif
7537#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007539#endif
7540#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007542#endif
7543#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007545#endif
7546#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007548#endif
7549#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007551#endif
7552#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007554#endif
7555#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007557#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007558#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007560#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007561#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007563#endif
7564#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007566#endif
7567#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007569#endif
7570#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007572#endif
7573#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007575#endif
7576#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007578#endif
7579#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007581#endif
7582#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007584#endif
7585#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#endif
7588#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007602#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007604#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007605 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007608#endif
7609#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007611#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007613#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007614 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007615#endif
7616#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007618#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007620#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007622#endif
7623
Christian Heimesfaf2f632008-01-06 16:59:19 +00007624#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007626 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7627#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007628 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007629#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007630 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007631 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7632#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007633 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007634#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007635 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007637 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638 PyObject *tmp;
7639 tmp = PyLong_FromUnsignedLong(codes[i]);
7640 if (tmp == NULL)
7641 return NULL;
7642 PyModule_AddObject(m, names[i], tmp);
7643 }
7644 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, RCVALL_OFF);
7646 PyModule_AddIntMacro(m, RCVALL_ON);
7647 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007648#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007650#endif
7651#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007653#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007654#endif /* _MSTCPIP_ */
7655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007657#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007658 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007660 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007661}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007662
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007663
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007664#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007665#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007666
7667/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007668/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007669
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007670int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007671inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007673 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007674#if (SIZEOF_INT != 4)
7675#error "Not sure if in_addr_t exists and int is not 32-bits."
7676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677 unsigned int packed_addr;
7678 packed_addr = inet_addr(src);
7679 if (packed_addr == INADDR_NONE)
7680 return 0;
7681 memcpy(dst, &packed_addr, 4);
7682 return 1;
7683 }
7684 /* Should set errno to EAFNOSUPPORT */
7685 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007686}
7687
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007688const char *
7689inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 if (af == AF_INET) {
7692 struct in_addr packed_addr;
7693 if (size < 16)
7694 /* Should set errno to ENOSPC. */
7695 return NULL;
7696 memcpy(&packed_addr, src, sizeof(packed_addr));
7697 return strncpy(dst, inet_ntoa(packed_addr), size);
7698 }
7699 /* Should set errno to EAFNOSUPPORT */
7700 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007701}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007702
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007703#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007704#endif