blob: dd8bfb02965f307ce2b6a0032047fed9891825a6 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if !defined(WITH_THREAD)
167# undef HAVE_GETHOSTBYNAME_R
168#endif
169
170#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000172#endif
173
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100175# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# define HAVE_GETHOSTBYNAME_R_3_ARG
177# elif defined(__sun) || defined(__sgi)
178# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700179# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000180/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# else
182# undef HAVE_GETHOSTBYNAME_R
183# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000184#endif
185
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000186#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
187 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000189#endif
190
Ned Deilye1d4e582016-02-23 22:05:29 +1100191/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000192#ifdef HAVE_SYS_PARAM_H
193#include <sys/param.h>
194#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000195/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100196 (this includes the getaddrinfo emulation) protect access with a lock.
197
198 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
199 a mix of code including an unsafe implementation from an old BSD's
200 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
201 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100202 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100203
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
205 http://www.openbsd.org/plus54.html
206
207 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
208
209http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100210 */
211#if defined(WITH_THREAD) && ( \
212 (defined(__APPLE__) && \
213 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000214 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100215 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
216 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100217 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000218#define USE_GETADDRINFO_LOCK
219#endif
220
221#ifdef USE_GETADDRINFO_LOCK
222#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
223#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
224#else
225#define ACQUIRE_GETADDRINFO_LOCK
226#define RELEASE_GETADDRINFO_LOCK
227#endif
228
229#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000231#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000233#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234# include <types.h>
235# include <io.h>
236# include <sys/ioctl.h>
237# include <utils.h>
238# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000239#endif
240
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100241#ifdef __APPLE__
242# include <sys/ioctl.h>
243#endif
244
245
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000247/* make sure that the reentrant (gethostbyaddr_r etc)
248 functions are declared correctly if compiling with
249 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000253#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000256#undef _XOPEN_SOURCE
257#include <sys/socket.h>
258#include <sys/types.h>
259#include <netinet/in.h>
260#ifdef _SS_ALIGNSIZE
261#define HAVE_GETADDRINFO 1
262#define HAVE_GETNAMEINFO 1
263#endif
264
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000265#define HAVE_INET_PTON
266#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000267#endif
268
Thomas Wouters477c8d52006-05-27 19:21:47 +0000269/* Irix 6.5 fails to define this variable at all. This is needed
270 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000271 are just busted. Same thing for Solaris. */
272#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000273#define INET_ADDRSTRLEN 16
274#endif
275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000278#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700281#ifdef HAVE_SYS_SOCKET_H
282#include <sys/socket.h>
283#endif
284
285#ifdef HAVE_NET_IF_H
286#include <net/if.h>
287#endif
288
Christian Heimesdffa3942016-09-05 23:54:41 +0200289#ifdef HAVE_SOCKADDR_ALG
290#include <linux/if_alg.h>
291#ifndef AF_ALG
292#define AF_ALG 38
293#endif
294#ifndef SOL_ALG
295#define SOL_ALG 279
296#endif
297
298/* Linux 3.19 */
299#ifndef ALG_SET_AEAD_ASSOCLEN
300#define ALG_SET_AEAD_ASSOCLEN 4
301#endif
302#ifndef ALG_SET_AEAD_AUTHSIZE
303#define ALG_SET_AEAD_AUTHSIZE 5
304#endif
305/* Linux 4.8 */
306#ifndef ALG_SET_PUBKEY
307#define ALG_SET_PUBKEY 6
308#endif
309
310#ifndef ALG_OP_SIGN
311#define ALG_OP_SIGN 2
312#endif
313#ifndef ALG_OP_VERIFY
314#define ALG_OP_VERIFY 3
315#endif
316
317#endif /* HAVE_SOCKADDR_ALG */
318
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000319/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000320#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000321#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000322
323/* Addressing includes */
324
Guido van Rossum6f489d91996-06-28 20:15:15 +0000325#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000326
327/* Non-MS WINDOWS includes */
328# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000329# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000330
Guido van Rossum9376b741999-09-15 22:01:40 +0000331/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000332# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000333
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000334# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000335
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000336#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000337
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000338/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339# ifdef HAVE_FCNTL_H
340# include <fcntl.h>
341# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000342
Steve Dower65e4cb12014-11-22 12:54:57 -0800343#if defined(_MSC_VER) && _MSC_VER >= 1800
344/* Provides the IsWindows7SP1OrGreater() function */
345#include <VersionHelpers.h>
346#endif
347
Jeremy Hylton22308652001-02-02 03:23:09 +0000348#endif
349
Skip Montanaro7befb992004-02-10 16:50:21 +0000350#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000351
Neal Norwitz39d22e52002-11-02 19:55:21 +0000352#ifndef O_NONBLOCK
353# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000354#endif
355
Trent Micka708d6e2004-09-07 17:48:26 +0000356/* include Python's addrinfo.h unless it causes trouble */
357#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
358 /* Do not include addinfo.h on some newer IRIX versions.
359 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
360 * for example, but not by 6.5.10.
361 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000362#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000363 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
364 * EAI_* constants are defined in (the already included) ws2tcpip.h.
365 */
366#else
367# include "addrinfo.h"
368#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000369
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000370#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000371#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000372int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000373const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000374#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000375#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000376
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000377#ifdef __APPLE__
378/* On OS X, getaddrinfo returns no error indication of lookup
379 failure, so we must use the emulation instead of the libinfo
380 implementation. Unfortunately, performing an autoconf test
381 for this bug would require DNS access for the machine performing
382 the configuration, which is not acceptable. Therefore, we
383 determine the bug just by checking for __APPLE__. If this bug
384 gets ever fixed, perhaps checking for sys/version.h would be
385 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000386#ifndef HAVE_GETNAMEINFO
387/* This bug seems to be fixed in Jaguar. Ths easiest way I could
388 Find to check for Jaguar is that it has getnameinfo(), which
389 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000390#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000391#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000392
393#ifdef HAVE_INET_ATON
394#define USE_INET_ATON_WEAKLINK
395#endif
396
Jack Jansen84262fb2002-07-02 14:40:42 +0000397#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000398
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000399/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000400#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000401/* avoid clashes with the C library definition of the symbol. */
402#define getaddrinfo fake_getaddrinfo
403#define gai_strerror fake_gai_strerror
404#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000405#include "getaddrinfo.c"
406#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000407#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000408#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000409#include "getnameinfo.c"
410#endif
411
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000412#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000413#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000414#endif
415
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000416#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000417#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000418#define EAFNOSUPPORT WSAEAFNOSUPPORT
419#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000420#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000421
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000422#ifndef SOCKETCLOSE
423#define SOCKETCLOSE close
424#endif
425
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000426#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define USE_BLUETOOTH 1
428#if defined(__FreeBSD__)
429#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
430#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000431#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000432#define SOL_HCI SOL_HCI_RAW
433#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000434#define sockaddr_l2 sockaddr_l2cap
435#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000437#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
438#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000439#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000440#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000441#define sockaddr_l2 sockaddr_bt
442#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000443#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000444#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000445#define SOL_HCI BTPROTO_HCI
446#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000447#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
448#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000449#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000450#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000451#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000452#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
453#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000454#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000455#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
456#endif
457#endif
458
Charles-François Natali8b759652011-12-23 16:44:51 +0100459/* Convert "sock_addr_t *" to "struct sockaddr *". */
460#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461
Martin v. Löwise9416172003-05-03 10:12:45 +0000462/*
463 * Constants for getnameinfo()
464 */
465#if !defined(NI_MAXHOST)
466#define NI_MAXHOST 1025
467#endif
468#if !defined(NI_MAXSERV)
469#define NI_MAXSERV 32
470#endif
471
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000472#ifndef INVALID_SOCKET /* MS defines this */
473#define INVALID_SOCKET (-1)
474#endif
475
Charles-François Natali0cc86852013-09-13 19:53:08 +0200476#ifndef INADDR_NONE
477#define INADDR_NONE (-1)
478#endif
479
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000480/* XXX There's a problem here: *static* functions are not supposed to have
481 a Py prefix (or use CapitalizedWords). Later... */
482
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483/* Global variable holding the exception type for errors detected
484 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000485static PyObject *socket_herror;
486static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000487static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488
Tim Peters643a7fc2002-02-17 04:13:21 +0000489/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000490 The sock_type variable contains pointers to various functions,
491 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000492 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000493static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000494
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000495#if defined(HAVE_POLL_H)
496#include <poll.h>
497#elif defined(HAVE_SYS_POLL_H)
498#include <sys/poll.h>
499#endif
500
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000501/* Largest value to try to store in a socklen_t (used when handling
502 ancillary data). POSIX requires socklen_t to hold at least
503 (2**31)-1 and recommends against storing larger values, but
504 socklen_t was originally int in the BSD interface, so to be on the
505 safe side we use the smaller of (2**31)-1 and INT_MAX. */
506#if INT_MAX > 0x7fffffff
507#define SOCKLEN_T_LIMIT 0x7fffffff
508#else
509#define SOCKLEN_T_LIMIT INT_MAX
510#endif
511
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200512#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000513/* Instead of select(), we'll use poll() since poll() works on any fd. */
514#define IS_SELECTABLE(s) 1
515/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000516#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200517/* If there's no timeout left, we don't have to call select, so it's a safe,
518 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100519#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000520#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000521
522static PyObject*
523select_error(void)
524{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200525 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000527}
528
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000529#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000530#ifndef WSAEAGAIN
531#define WSAEAGAIN WSAEWOULDBLOCK
532#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000533#define CHECK_ERRNO(expected) \
534 (WSAGetLastError() == WSA ## expected)
535#else
536#define CHECK_ERRNO(expected) \
537 (errno == expected)
538#endif
539
Victor Stinnerdaf45552013-08-28 00:53:59 +0200540#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200541# define GET_SOCK_ERROR WSAGetLastError()
542# define SET_SOCK_ERROR(err) WSASetLastError(err)
543# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
544# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
545#else
546# define GET_SOCK_ERROR errno
547# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
548# define SOCK_TIMEOUT_ERR EWOULDBLOCK
549# define SOCK_INPROGRESS_ERR EINPROGRESS
550#endif
551
552
553#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200554/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
555static int support_wsa_no_inherit = -1;
556#endif
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* Convenience function to raise an error according to errno
559 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560
Guido van Rossum73624e91994-10-10 17:59:00 +0000561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000562set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000564#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 int err_no = WSAGetLastError();
566 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
567 recognizes the error codes used by both GetLastError() and
568 WSAGetLastError */
569 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200570 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000571#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000572
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200573 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574}
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000578set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581
582#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (v != NULL) {
588 PyErr_SetObject(socket_herror, v);
589 Py_DECREF(v);
590 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593}
594
595
596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600
Martin v. Löwis272cb402002-03-01 08:31:07 +0000601#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 /* EAI_SYSTEM is not available on Windows XP. */
603 if (error == EAI_SYSTEM)
604 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000605#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000607#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (v != NULL) {
613 PyErr_SetObject(socket_gaierror, v);
614 Py_DECREF(v);
615 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618}
619
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000620/* Function to perform the setting of socket blocking mode
621 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622static int
623internal_setblocking(PySocketSockObject *s, int block)
624{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200625#ifdef MS_WINDOWS
626 u_long arg;
627#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100628#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100629 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100630 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000632#ifdef SOCK_NONBLOCK
633 if (block)
634 s->sock_type &= (~SOCK_NONBLOCK);
635 else
636 s->sock_type |= SOCK_NONBLOCK;
637#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000640#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100641#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200643 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
644 goto error;
Victor Stinner9a954832013-12-04 00:41:24 +0100645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200647 if (delay_flag == -1)
648 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100650 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 else
Victor Stinner9a954832013-12-04 00:41:24 +0100652 new_delay_flag = delay_flag | O_NONBLOCK;
653 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200654 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
655 goto error;
Victor Stinner9a954832013-12-04 00:41:24 +0100656#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200658 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200659 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
660 goto error;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000661#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200664 return 0;
665 error:
666#ifndef MS_WINDOWS
667 PyErr_SetFromErrno(PyExc_OSError);
668#else
669 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
670#endif
671 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672}
673
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000674static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200675internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
676 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100679#ifdef HAVE_POLL
680 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200681 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100682#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200684 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100685#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000686
Victor Stinnerb7df3142015-03-27 22:59:32 +0100687#ifdef WITH_THREAD
688 /* must be called with the GIL held */
689 assert(PyGILState_Check());
690#endif
691
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200693 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200696 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Prefer poll, if available, since you can poll() any fd
700 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000701#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100702 pollfd.fd = s->sock_fd;
703 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200704 if (connect) {
705 /* On Windows, the socket becomes writable on connection success,
706 but a connection failure is notified as an error. On POSIX, the
707 socket becomes writable on connection success or on connection
708 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200709 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200710 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Victor Stinner71694d52015-03-28 01:18:54 +0100712 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200713 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200714 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Victor Stinner71694d52015-03-28 01:18:54 +0100716 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200717 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100718 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000719#else
Victor Stinnerced11742015-04-09 10:27:25 +0200720 if (interval >= 0) {
721 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
722 tvp = &tv;
723 }
724 else
725 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000726
Victor Stinner71694d52015-03-28 01:18:54 +0100727 FD_ZERO(&fds);
728 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200729 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 if (connect) {
731 /* On Windows, the socket becomes writable on connection success,
732 but a connection failure is notified as an error. On POSIX, the
733 socket becomes writable on connection success or on connection
734 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200735 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200736 }
Victor Stinner71694d52015-03-28 01:18:54 +0100737
738 /* See if the socket is ready */
739 Py_BEGIN_ALLOW_THREADS;
740 if (writing)
741 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200742 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100743 else
744 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200745 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100746 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000747#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 if (n < 0)
750 return -1;
751 if (n == 0)
752 return 1;
753 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000754}
755
Victor Stinner31bf2d52015-04-01 21:57:09 +0200756/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000757
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 On error, raise an exception and return -1 if err is set, or fill err and
759 return -1 otherwise. If a signal was received and the signal handler raised
760 an exception, return -1, and set err to -1 if err is set.
761
762 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100763
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 If the socket has a timeout, wait until the socket is ready before calling
765 the function: wait until the socket is writable if writing is nonzero, wait
766 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100767
Victor Stinner81c41db2015-04-02 11:50:57 +0200768 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200769 the function, except if the signal handler raised an exception (PEP 475).
770
771 When the function is retried, recompute the timeout using a monotonic clock.
772
Victor Stinner81c41db2015-04-02 11:50:57 +0200773 sock_call_ex() must be called with the GIL held. The socket function is
774 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200775static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200776sock_call_ex(PySocketSockObject *s,
777 int writing,
778 int (*sock_func) (PySocketSockObject *s, void *data),
779 void *data,
780 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200781 int *err,
782 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200783{
Victor Stinner8912d142015-04-06 23:16:34 +0200784 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 _PyTime_t deadline = 0;
786 int deadline_initialized = 0;
787 int res;
788
Victor Stinner92f01132015-10-11 09:54:42 +0200789#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790 /* sock_call() must be called with the GIL held. */
791 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200792#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200793
794 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 /* For connect(), poll even for blocking socket. The connection
798 runs asynchronously. */
799 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200801 _PyTime_t interval;
802
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 if (deadline_initialized) {
804 /* recompute the timeout */
805 interval = deadline - _PyTime_GetMonotonicClock();
806 }
807 else {
808 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200809 deadline = _PyTime_GetMonotonicClock() + timeout;
810 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812
Victor Stinner10550cd2015-04-03 13:22:27 +0200813 if (interval >= 0)
814 res = internal_select(s, writing, interval, connect);
815 else
816 res = 1;
817 }
818 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200819 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200820 }
821
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 if (err)
824 *err = GET_SOCK_ERROR;
825
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826 if (CHECK_ERRNO(EINTR)) {
827 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 if (PyErr_CheckSignals()) {
829 if (err)
830 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200832 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833
834 /* retry select() */
835 continue;
836 }
837
838 /* select() failed */
839 s->errorhandler();
840 return -1;
841 }
842
843 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200844 if (err)
845 *err = SOCK_TIMEOUT_ERR;
846 else
847 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848 return -1;
849 }
850
851 /* the socket is ready */
852 }
853
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 /* inner loop to retry sock_func() when sock_func() is interrupted
855 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856 while (1) {
857 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859 Py_END_ALLOW_THREADS
860
861 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200862 /* sock_func() succeeded */
863 if (err)
864 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200865 return 0;
866 }
867
Victor Stinner81c41db2015-04-02 11:50:57 +0200868 if (err)
869 *err = GET_SOCK_ERROR;
870
Victor Stinner31bf2d52015-04-01 21:57:09 +0200871 if (!CHECK_ERRNO(EINTR))
872 break;
873
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 /* sock_func() was interrupted by a signal */
875 if (PyErr_CheckSignals()) {
876 if (err)
877 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200878 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200879 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200880
Victor Stinner81c41db2015-04-02 11:50:57 +0200881 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200882 }
883
884 if (s->sock_timeout > 0
885 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887
888 For example, select() could indicate a socket is ready for
889 reading, but the data then discarded by the OS because of a
890 wrong checksum.
891
892 Loop on select() to recheck for socket readyness. */
893 continue;
894 }
895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 /* sock_func() failed */
897 if (!err)
898 s->errorhandler();
899 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000900 return -1;
901 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000903
Victor Stinner81c41db2015-04-02 11:50:57 +0200904static int
905sock_call(PySocketSockObject *s,
906 int writing,
907 int (*func) (PySocketSockObject *s, void *data),
908 void *data)
909{
Victor Stinner8912d142015-04-06 23:16:34 +0200910 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200911}
912
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000913
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000914/* Initialize a new socket object. */
915
Victor Stinner88ed6402015-04-09 10:23:12 +0200916/* Default timeout for new sockets */
917static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000918
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200919static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000920init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 s->sock_fd = fd;
924 s->sock_family = family;
925 s->sock_type = type;
926 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000929#ifdef SOCK_NONBLOCK
930 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100931 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000932 else
933#endif
934 {
935 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200936 if (defaulttimeout >= 0) {
937 if (internal_setblocking(s, 0) == -1) {
938 return -1;
939 }
940 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000941 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200942 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000943}
944
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946/* Create a new socket object.
947 This just creates the object and initializes it.
948 If the creation fails, return NULL and set an exception (implicit
949 in NEWOBJ()). */
950
Guido van Rossum73624e91994-10-10 17:59:00 +0000951static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000952new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PySocketSockObject *s;
955 s = (PySocketSockObject *)
956 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200957 if (s == NULL)
958 return NULL;
959 if (init_sockobject(s, fd, family, type, proto) == -1) {
960 Py_DECREF(s);
961 return NULL;
962 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964}
965
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966
Guido van Rossum48a680c2001-03-02 06:34:14 +0000967/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000968 thread to be in gethostbyname or getaddrinfo */
969#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200970static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000971#endif
972
973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974/* Convert a string specifying a host name or one of a few symbolic
975 names to a numeric IP address. This usually calls gethostbyname()
976 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978 an error occurred; then an exception is raised. */
979
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000980static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200981setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 struct addrinfo hints, *res;
984 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
987 if (name[0] == '\0') {
988 int siz;
989 memset(&hints, 0, sizeof(hints));
990 hints.ai_family = af;
991 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
992 hints.ai_flags = AI_PASSIVE;
993 Py_BEGIN_ALLOW_THREADS
994 ACQUIRE_GETADDRINFO_LOCK
995 error = getaddrinfo(NULL, "0", &hints, &res);
996 Py_END_ALLOW_THREADS
997 /* We assume that those thread-unsafe getaddrinfo() versions
998 *are* safe regarding their return value, ie. that a
999 subsequent call to getaddrinfo() does not destroy the
1000 outcome of the first call. */
1001 RELEASE_GETADDRINFO_LOCK
1002 if (error) {
1003 set_gaierror(error);
1004 return -1;
1005 }
1006 switch (res->ai_family) {
1007 case AF_INET:
1008 siz = 4;
1009 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001010#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case AF_INET6:
1012 siz = 16;
1013 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 default:
1016 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001017 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 "unsupported address family");
1019 return -1;
1020 }
1021 if (res->ai_next) {
1022 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001023 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 "wildcard resolved to multiple address");
1025 return -1;
1026 }
1027 if (res->ai_addrlen < addr_ret_size)
1028 addr_ret_size = res->ai_addrlen;
1029 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1030 freeaddrinfo(res);
1031 return siz;
1032 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001033 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001034 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001035 if (strcmp(name, "255.255.255.255") == 0 ||
1036 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 struct sockaddr_in *sin;
1038 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001039 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 "address family mismatched");
1041 return -1;
1042 }
1043 sin = (struct sockaddr_in *)addr_ret;
1044 memset((void *) sin, '\0', sizeof(*sin));
1045 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001046#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 sin->sin_addr.s_addr = INADDR_BROADCAST;
1050 return sizeof(sin->sin_addr);
1051 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001052
1053 /* avoid a name resolution in case of numeric address */
1054#ifdef HAVE_INET_PTON
1055 /* check for an IPv4 address */
1056 if (af == AF_UNSPEC || af == AF_INET) {
1057 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1058 memset(sin, 0, sizeof(*sin));
1059 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1060 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001061#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001062 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001063#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001064 return 4;
1065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001067#ifdef ENABLE_IPV6
1068 /* check for an IPv6 address - if the address contains a scope ID, we
1069 * fallback to getaddrinfo(), which can handle translation from interface
1070 * name to interface index */
1071 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1072 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1073 memset(sin, 0, sizeof(*sin));
1074 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1075 sin->sin6_family = AF_INET6;
1076#ifdef HAVE_SOCKADDR_SA_LEN
1077 sin->sin6_len = sizeof(*sin);
1078#endif
1079 return 16;
1080 }
1081 }
1082#endif /* ENABLE_IPV6 */
1083#else /* HAVE_INET_PTON */
1084 /* check for an IPv4 address */
1085 if (af == AF_INET || af == AF_UNSPEC) {
1086 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1087 memset(sin, 0, sizeof(*sin));
1088 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1089 sin->sin_family = AF_INET;
1090#ifdef HAVE_SOCKADDR_SA_LEN
1091 sin->sin_len = sizeof(*sin);
1092#endif
1093 return 4;
1094 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001095 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001096#endif /* HAVE_INET_PTON */
1097
1098 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 memset(&hints, 0, sizeof(hints));
1100 hints.ai_family = af;
1101 Py_BEGIN_ALLOW_THREADS
1102 ACQUIRE_GETADDRINFO_LOCK
1103 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001104#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 if (error == EAI_NONAME && af == AF_UNSPEC) {
1106 /* On Tru64 V5.1, numeric-to-addr conversion fails
1107 if no address family is given. Assume IPv4 for now.*/
1108 hints.ai_family = AF_INET;
1109 error = getaddrinfo(name, NULL, &hints, &res);
1110 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 Py_END_ALLOW_THREADS
1113 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1114 if (error) {
1115 set_gaierror(error);
1116 return -1;
1117 }
1118 if (res->ai_addrlen < addr_ret_size)
1119 addr_ret_size = res->ai_addrlen;
1120 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1121 freeaddrinfo(res);
1122 switch (addr_ret->sa_family) {
1123 case AF_INET:
1124 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001125#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case AF_INET6:
1127 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 return -1;
1132 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001133}
1134
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136/* Create a string object representing an IP address.
1137 This is always a string of the form 'dd.dd.dd.dd' (with variable
1138 size numbers). */
1139
Guido van Rossum73624e91994-10-10 17:59:00 +00001140static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001141makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 char buf[NI_MAXHOST];
1144 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1147 NI_NUMERICHOST);
1148 if (error) {
1149 set_gaierror(error);
1150 return NULL;
1151 }
1152 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153}
1154
1155
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001156#ifdef USE_BLUETOOTH
1157/* Convert a string representation of a Bluetooth address into a numeric
1158 address. Returns the length (6), or raises an exception and returns -1 if
1159 an error occurred. */
1160
1161static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001162setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 unsigned int b0, b1, b2, b3, b4, b5;
1165 char ch;
1166 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1169 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1170 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1171 bdaddr->b[0] = b0;
1172 bdaddr->b[1] = b1;
1173 bdaddr->b[2] = b2;
1174 bdaddr->b[3] = b3;
1175 bdaddr->b[4] = b4;
1176 bdaddr->b[5] = b5;
1177 return 6;
1178 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001179 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return -1;
1181 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001182}
1183
1184/* Create a string representation of the Bluetooth address. This is always a
1185 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1186 value (zero padded if necessary). */
1187
1188static PyObject *
1189makebdaddr(bdaddr_t *bdaddr)
1190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1194 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1195 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1196 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001197}
1198#endif
1199
1200
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201/* Create an object representing the given socket address,
1202 suitable for passing it back to bind(), connect() etc.
1203 The family field of the sockaddr structure is inspected
1204 to determine what kind of address it really is. */
1205
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001206/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001207static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001208makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (addrlen == 0) {
1211 /* No address -- may be recvfrom() from known socket */
1212 Py_INCREF(Py_None);
1213 return Py_None;
1214 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 case AF_INET:
1219 {
1220 struct sockaddr_in *a;
1221 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1222 PyObject *ret = NULL;
1223 if (addrobj) {
1224 a = (struct sockaddr_in *)addr;
1225 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1226 Py_DECREF(addrobj);
1227 }
1228 return ret;
1229 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001231#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 case AF_UNIX:
1233 {
1234 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001235#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1237 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001238 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 }
1240 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001241#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 {
1243 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001244 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 }
1246 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001247#endif /* AF_UNIX */
1248
Martin v. Löwis11017b12006-01-14 18:12:57 +00001249#if defined(AF_NETLINK)
1250 case AF_NETLINK:
1251 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1253 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001254 }
1255#endif /* AF_NETLINK */
1256
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001257#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case AF_INET6:
1259 {
1260 struct sockaddr_in6 *a;
1261 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1262 PyObject *ret = NULL;
1263 if (addrobj) {
1264 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001265 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 addrobj,
1267 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001268 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 a->sin6_scope_id);
1270 Py_DECREF(addrobj);
1271 }
1272 return ret;
1273 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001274#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001275
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 case AF_BLUETOOTH:
1278 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 case BTPROTO_L2CAP:
1281 {
1282 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1283 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1284 PyObject *ret = NULL;
1285 if (addrobj) {
1286 ret = Py_BuildValue("Oi",
1287 addrobj,
1288 _BT_L2_MEMB(a, psm));
1289 Py_DECREF(addrobj);
1290 }
1291 return ret;
1292 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case BTPROTO_RFCOMM:
1295 {
1296 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1297 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1298 PyObject *ret = NULL;
1299 if (addrobj) {
1300 ret = Py_BuildValue("Oi",
1301 addrobj,
1302 _BT_RC_MEMB(a, channel));
1303 Py_DECREF(addrobj);
1304 }
1305 return ret;
1306 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case BTPROTO_HCI:
1309 {
1310 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001311#if defined(__NetBSD__) || defined(__DragonFly__)
1312 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 PyObject *ret = NULL;
1315 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1316 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001319
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001320#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case BTPROTO_SCO:
1322 {
1323 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1324 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1325 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001326#endif
1327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 default:
1329 PyErr_SetString(PyExc_ValueError,
1330 "Unknown Bluetooth protocol");
1331 return NULL;
1332 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001333#endif
1334
Antoine Pitroub156a462010-10-27 20:13:57 +00001335#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_PACKET:
1337 {
1338 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1339 char *ifname = "";
1340 struct ifreq ifr;
1341 /* need to look up interface name give index */
1342 if (a->sll_ifindex) {
1343 ifr.ifr_ifindex = a->sll_ifindex;
1344 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1345 ifname = ifr.ifr_name;
1346 }
1347 return Py_BuildValue("shbhy#",
1348 ifname,
1349 ntohs(a->sll_protocol),
1350 a->sll_pkttype,
1351 a->sll_hatype,
1352 a->sll_addr,
1353 a->sll_halen);
1354 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001355#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001356
Christian Heimes043d6f62008-01-07 17:19:16 +00001357#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case AF_TIPC:
1359 {
1360 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1361 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1362 return Py_BuildValue("IIIII",
1363 a->addrtype,
1364 a->addr.nameseq.type,
1365 a->addr.nameseq.lower,
1366 a->addr.nameseq.upper,
1367 a->scope);
1368 } else if (a->addrtype == TIPC_ADDR_NAME) {
1369 return Py_BuildValue("IIIII",
1370 a->addrtype,
1371 a->addr.name.name.type,
1372 a->addr.name.name.instance,
1373 a->addr.name.name.instance,
1374 a->scope);
1375 } else if (a->addrtype == TIPC_ADDR_ID) {
1376 return Py_BuildValue("IIIII",
1377 a->addrtype,
1378 a->addr.id.node,
1379 a->addr.id.ref,
1380 0,
1381 a->scope);
1382 } else {
1383 PyErr_SetString(PyExc_ValueError,
1384 "Invalid address type");
1385 return NULL;
1386 }
1387 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001388#endif
1389
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001390#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001391 case AF_CAN:
1392 {
1393 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1394 char *ifname = "";
1395 struct ifreq ifr;
1396 /* need to look up interface name given index */
1397 if (a->can_ifindex) {
1398 ifr.ifr_ifindex = a->can_ifindex;
1399 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1400 ifname = ifr.ifr_name;
1401 }
1402
1403 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1404 ifname,
1405 a->can_family);
1406 }
1407#endif
1408
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001409#ifdef PF_SYSTEM
1410 case PF_SYSTEM:
1411 switch(proto) {
1412#ifdef SYSPROTO_CONTROL
1413 case SYSPROTO_CONTROL:
1414 {
1415 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1416 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1417 }
1418#endif
1419 default:
1420 PyErr_SetString(PyExc_ValueError,
1421 "Invalid address type");
1422 return 0;
1423 }
1424#endif
1425
Christian Heimesdffa3942016-09-05 23:54:41 +02001426#ifdef HAVE_SOCKADDR_ALG
1427 case AF_ALG:
1428 {
1429 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1430 return Py_BuildValue("s#s#HH",
1431 a->salg_type,
1432 strnlen((const char*)a->salg_type,
1433 sizeof(a->salg_type)),
1434 a->salg_name,
1435 strnlen((const char*)a->salg_name,
1436 sizeof(a->salg_name)),
1437 a->salg_feat,
1438 a->salg_mask);
1439 }
1440#endif
1441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 default:
1445 /* If we don't know the address family, don't raise an
1446 exception -- return it as an (int, bytes) tuple. */
1447 return Py_BuildValue("iy#",
1448 addr->sa_family,
1449 addr->sa_data,
1450 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001453}
1454
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1456 (in particular, numeric IP addresses). */
1457struct maybe_idna {
1458 PyObject *obj;
1459 char *buf;
1460};
1461
1462static void
1463idna_cleanup(struct maybe_idna *data)
1464{
1465 Py_CLEAR(data->obj);
1466}
1467
1468static int
1469idna_converter(PyObject *obj, struct maybe_idna *data)
1470{
1471 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001472 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001473 if (obj == NULL) {
1474 idna_cleanup(data);
1475 return 1;
1476 }
1477 data->obj = NULL;
1478 len = -1;
1479 if (PyBytes_Check(obj)) {
1480 data->buf = PyBytes_AsString(obj);
1481 len = PyBytes_Size(obj);
1482 }
1483 else if (PyByteArray_Check(obj)) {
1484 data->buf = PyByteArray_AsString(obj);
1485 len = PyByteArray_Size(obj);
1486 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001487 else if (PyUnicode_Check(obj)) {
1488 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1489 data->buf = PyUnicode_DATA(obj);
1490 len = PyUnicode_GET_LENGTH(obj);
1491 }
1492 else {
1493 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1494 if (!obj2) {
1495 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1496 return 0;
1497 }
1498 assert(PyBytes_Check(obj2));
1499 data->obj = obj2;
1500 data->buf = PyBytes_AS_STRING(obj2);
1501 len = PyBytes_GET_SIZE(obj2);
1502 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001503 }
1504 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001505 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1506 obj->ob_type->tp_name);
1507 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001508 }
1509 if (strlen(data->buf) != len) {
1510 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001511 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001512 return 0;
1513 }
1514 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001515}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001516
1517/* Parse a socket address argument according to the socket object's
1518 address family. Return 1 if the address was in the proper format,
1519 0 of not. The address is returned through addr_ret, its length
1520 through len_ret. */
1521
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001527
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001528#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case AF_UNIX:
1530 {
1531 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001532 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001533 int retval = 0;
1534
1535 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1536 allow embedded nulls on Linux. */
1537 if (PyUnicode_Check(args)) {
1538 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1539 return 0;
1540 }
1541 else
1542 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001543 if (!PyArg_Parse(args, "y*", &path)) {
1544 Py_DECREF(args);
1545 return retval;
1546 }
1547 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001550#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001551 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001554 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001556 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 }
1558 }
1559 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 {
1562 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001563 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001564 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001566 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001568 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 }
1570 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001571 memcpy(addr->sun_path, path.buf, path.len);
1572 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001573 retval = 1;
1574 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001575 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001576 Py_DECREF(args);
1577 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001579#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580
Martin v. Löwis11017b12006-01-14 18:12:57 +00001581#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 case AF_NETLINK:
1583 {
1584 struct sockaddr_nl* addr;
1585 int pid, groups;
1586 addr = (struct sockaddr_nl *)addr_ret;
1587 if (!PyTuple_Check(args)) {
1588 PyErr_Format(
1589 PyExc_TypeError,
1590 "getsockaddrarg: "
1591 "AF_NETLINK address must be tuple, not %.500s",
1592 Py_TYPE(args)->tp_name);
1593 return 0;
1594 }
1595 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1596 return 0;
1597 addr->nl_family = AF_NETLINK;
1598 addr->nl_pid = pid;
1599 addr->nl_groups = groups;
1600 *len_ret = sizeof(*addr);
1601 return 1;
1602 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001603#endif
1604
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001605#ifdef AF_RDS
1606 case AF_RDS:
1607 /* RDS sockets use sockaddr_in: fall-through */
1608#endif
1609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 case AF_INET:
1611 {
1612 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001613 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 int port, result;
1615 if (!PyTuple_Check(args)) {
1616 PyErr_Format(
1617 PyExc_TypeError,
1618 "getsockaddrarg: "
1619 "AF_INET address must be tuple, not %.500s",
1620 Py_TYPE(args)->tp_name);
1621 return 0;
1622 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1624 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 return 0;
1626 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001627 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001629 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 if (result < 0)
1631 return 0;
1632 if (port < 0 || port > 0xffff) {
1633 PyErr_SetString(
1634 PyExc_OverflowError,
1635 "getsockaddrarg: port must be 0-65535.");
1636 return 0;
1637 }
1638 addr->sin_family = AF_INET;
1639 addr->sin_port = htons((short)port);
1640 *len_ret = sizeof *addr;
1641 return 1;
1642 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001643
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001644#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 case AF_INET6:
1646 {
1647 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001648 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001649 int port, result;
1650 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 flowinfo = scope_id = 0;
1652 if (!PyTuple_Check(args)) {
1653 PyErr_Format(
1654 PyExc_TypeError,
1655 "getsockaddrarg: "
1656 "AF_INET6 address must be tuple, not %.500s",
1657 Py_TYPE(args)->tp_name);
1658 return 0;
1659 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001660 if (!PyArg_ParseTuple(args, "O&i|II",
1661 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 &scope_id)) {
1663 return 0;
1664 }
1665 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001666 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001668 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (result < 0)
1670 return 0;
1671 if (port < 0 || port > 0xffff) {
1672 PyErr_SetString(
1673 PyExc_OverflowError,
1674 "getsockaddrarg: port must be 0-65535.");
1675 return 0;
1676 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001677 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001678 PyErr_SetString(
1679 PyExc_OverflowError,
1680 "getsockaddrarg: flowinfo must be 0-1048575.");
1681 return 0;
1682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 addr->sin6_family = s->sock_family;
1684 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001685 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 addr->sin6_scope_id = scope_id;
1687 *len_ret = sizeof *addr;
1688 return 1;
1689 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001690#endif
1691
Hye-Shik Chang81268602004-02-02 06:05:24 +00001692#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 case AF_BLUETOOTH:
1694 {
1695 switch (s->sock_proto) {
1696 case BTPROTO_L2CAP:
1697 {
1698 struct sockaddr_l2 *addr;
1699 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 addr = (struct sockaddr_l2 *)addr_ret;
1702 memset(addr, 0, sizeof(struct sockaddr_l2));
1703 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1704 if (!PyArg_ParseTuple(args, "si", &straddr,
1705 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001706 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 "wrong format");
1708 return 0;
1709 }
1710 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1711 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 *len_ret = sizeof *addr;
1714 return 1;
1715 }
1716 case BTPROTO_RFCOMM:
1717 {
1718 struct sockaddr_rc *addr;
1719 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 addr = (struct sockaddr_rc *)addr_ret;
1722 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1723 if (!PyArg_ParseTuple(args, "si", &straddr,
1724 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 "wrong format");
1727 return 0;
1728 }
1729 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1730 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 *len_ret = sizeof *addr;
1733 return 1;
1734 }
1735 case BTPROTO_HCI:
1736 {
1737 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001738#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001739 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001740
Alexander Belopolskye239d232010-12-08 23:31:48 +00001741 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001742 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001743 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001744 "wrong format");
1745 return 0;
1746 }
1747 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1748 return 0;
1749#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1751 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001752 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 "wrong format");
1754 return 0;
1755 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 *len_ret = sizeof *addr;
1758 return 1;
1759 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001760#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 case BTPROTO_SCO:
1762 {
1763 struct sockaddr_sco *addr;
1764 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 addr = (struct sockaddr_sco *)addr_ret;
1767 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1768 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001769 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 "wrong format");
1771 return 0;
1772 }
1773 straddr = PyBytes_AS_STRING(args);
1774 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1775 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 *len_ret = sizeof *addr;
1778 return 1;
1779 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001782 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 0;
1784 }
1785 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001786#endif
1787
Antoine Pitroub156a462010-10-27 20:13:57 +00001788#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 case AF_PACKET:
1790 {
1791 struct sockaddr_ll* addr;
1792 struct ifreq ifr;
1793 char *interfaceName;
1794 int protoNumber;
1795 int hatype = 0;
1796 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001797 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 if (!PyTuple_Check(args)) {
1800 PyErr_Format(
1801 PyExc_TypeError,
1802 "getsockaddrarg: "
1803 "AF_PACKET address must be tuple, not %.500s",
1804 Py_TYPE(args)->tp_name);
1805 return 0;
1806 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001807 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001809 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 return 0;
1811 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1812 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1813 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1814 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 return 0;
1817 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 if (haddr.buf && haddr.len > 8) {
1819 PyErr_SetString(PyExc_ValueError,
1820 "Hardware address must be 8 bytes or less");
1821 PyBuffer_Release(&haddr);
1822 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 }
1824 if (protoNumber < 0 || protoNumber > 0xffff) {
1825 PyErr_SetString(
1826 PyExc_OverflowError,
1827 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001828 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 return 0;
1830 }
1831 addr = (struct sockaddr_ll*)addr_ret;
1832 addr->sll_family = AF_PACKET;
1833 addr->sll_protocol = htons((short)protoNumber);
1834 addr->sll_ifindex = ifr.ifr_ifindex;
1835 addr->sll_pkttype = pkttype;
1836 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001837 if (haddr.buf) {
1838 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1839 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001841 else
1842 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001844 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 return 1;
1846 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001847#endif
1848
Christian Heimes043d6f62008-01-07 17:19:16 +00001849#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 case AF_TIPC:
1851 {
1852 unsigned int atype, v1, v2, v3;
1853 unsigned int scope = TIPC_CLUSTER_SCOPE;
1854 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (!PyTuple_Check(args)) {
1857 PyErr_Format(
1858 PyExc_TypeError,
1859 "getsockaddrarg: "
1860 "AF_TIPC address must be tuple, not %.500s",
1861 Py_TYPE(args)->tp_name);
1862 return 0;
1863 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 if (!PyArg_ParseTuple(args,
1866 "IIII|I;Invalid TIPC address format",
1867 &atype, &v1, &v2, &v3, &scope))
1868 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 addr = (struct sockaddr_tipc *) addr_ret;
1871 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 addr->family = AF_TIPC;
1874 addr->scope = scope;
1875 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (atype == TIPC_ADDR_NAMESEQ) {
1878 addr->addr.nameseq.type = v1;
1879 addr->addr.nameseq.lower = v2;
1880 addr->addr.nameseq.upper = v3;
1881 } else if (atype == TIPC_ADDR_NAME) {
1882 addr->addr.name.name.type = v1;
1883 addr->addr.name.name.instance = v2;
1884 } else if (atype == TIPC_ADDR_ID) {
1885 addr->addr.id.node = v1;
1886 addr->addr.id.ref = v2;
1887 } else {
1888 /* Shouldn't happen */
1889 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1890 return 0;
1891 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return 1;
1896 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001897#endif
1898
Vinay Sajiped6783f2014-03-21 11:44:32 +00001899#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001900 case AF_CAN:
1901 switch (s->sock_proto) {
1902 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001903 /* fall-through */
1904 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001905 {
1906 struct sockaddr_can *addr;
1907 PyObject *interfaceName;
1908 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001909 Py_ssize_t len;
1910
Benjamin Peterson18b71912013-05-16 15:29:44 -05001911 addr = (struct sockaddr_can *)addr_ret;
1912
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1914 &interfaceName))
1915 return 0;
1916
1917 len = PyBytes_GET_SIZE(interfaceName);
1918
1919 if (len == 0) {
1920 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001921 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001922 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1923 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1925 s->errorhandler();
1926 Py_DECREF(interfaceName);
1927 return 0;
1928 }
1929 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001930 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001931 "AF_CAN interface name too long");
1932 Py_DECREF(interfaceName);
1933 return 0;
1934 }
1935
1936 addr->can_family = AF_CAN;
1937 addr->can_ifindex = ifr.ifr_ifindex;
1938
1939 *len_ret = sizeof(*addr);
1940 Py_DECREF(interfaceName);
1941 return 1;
1942 }
1943 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001944 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001945 "getsockaddrarg: unsupported CAN protocol");
1946 return 0;
1947 }
1948#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001949
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001950#ifdef PF_SYSTEM
1951 case PF_SYSTEM:
1952 switch (s->sock_proto) {
1953#ifdef SYSPROTO_CONTROL
1954 case SYSPROTO_CONTROL:
1955 {
1956 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001957
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001958 addr = (struct sockaddr_ctl *)addr_ret;
1959 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001960 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001961
1962 if (PyUnicode_Check(args)) {
1963 struct ctl_info info;
1964 PyObject *ctl_name;
1965
1966 if (!PyArg_Parse(args, "O&",
1967 PyUnicode_FSConverter, &ctl_name)) {
1968 return 0;
1969 }
1970
Victor Stinnerf50e1872015-03-20 11:32:24 +01001971 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001972 PyErr_SetString(PyExc_ValueError,
1973 "provided string is too long");
1974 Py_DECREF(ctl_name);
1975 return 0;
1976 }
1977 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1978 sizeof(info.ctl_name));
1979 Py_DECREF(ctl_name);
1980
1981 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1982 PyErr_SetString(PyExc_OSError,
1983 "cannot find kernel control with provided name");
1984 return 0;
1985 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001986
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001987 addr->sc_id = info.ctl_id;
1988 addr->sc_unit = 0;
1989 } else if (!PyArg_ParseTuple(args, "II",
1990 &(addr->sc_id), &(addr->sc_unit))) {
1991 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1992 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001993
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001994 return 0;
1995 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001996
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001997 *len_ret = sizeof(*addr);
1998 return 1;
1999 }
2000#endif
2001 default:
2002 PyErr_SetString(PyExc_OSError,
2003 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2004 return 0;
2005 }
2006#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002007#ifdef HAVE_SOCKADDR_ALG
2008 case AF_ALG:
2009 {
2010 struct sockaddr_alg *sa;
2011 char *type;
2012 char *name;
2013 sa = (struct sockaddr_alg *)addr_ret;
2014
2015 memset(sa, 0, sizeof(*sa));
2016 sa->salg_family = AF_ALG;
2017
2018 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2019 &type, &name, &sa->salg_feat, &sa->salg_mask))
2020 return 0;
2021 /* sockaddr_alg has fixed-sized char arrays for type and name */
2022 if (strlen(type) > sizeof(sa->salg_type)) {
2023 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2024 return 0;
2025 }
2026 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2027 if (strlen(name) > sizeof(sa->salg_name)) {
2028 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2029 return 0;
2030 }
2031 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2032
2033 *len_ret = sizeof(*sa);
2034 return 1;
2035 }
2036#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002041 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002045}
2046
Guido van Rossum30a685f1991-06-27 15:51:29 +00002047
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002049 Return 1 if the family is known, 0 otherwise. The length is returned
2050 through len_ret. */
2051
2052static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002053getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002056
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002057#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 case AF_UNIX:
2059 {
2060 *len_ret = sizeof (struct sockaddr_un);
2061 return 1;
2062 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002063#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00002064#if defined(AF_NETLINK)
2065 case AF_NETLINK:
2066 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 *len_ret = sizeof (struct sockaddr_nl);
2068 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00002069 }
2070#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002071
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002072#ifdef AF_RDS
2073 case AF_RDS:
2074 /* RDS sockets use sockaddr_in: fall-through */
2075#endif
2076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 case AF_INET:
2078 {
2079 *len_ret = sizeof (struct sockaddr_in);
2080 return 1;
2081 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002082
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002083#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 case AF_INET6:
2085 {
2086 *len_ret = sizeof (struct sockaddr_in6);
2087 return 1;
2088 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002089#endif
2090
Hye-Shik Chang81268602004-02-02 06:05:24 +00002091#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 case AF_BLUETOOTH:
2093 {
2094 switch(s->sock_proto)
2095 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 case BTPROTO_L2CAP:
2098 *len_ret = sizeof (struct sockaddr_l2);
2099 return 1;
2100 case BTPROTO_RFCOMM:
2101 *len_ret = sizeof (struct sockaddr_rc);
2102 return 1;
2103 case BTPROTO_HCI:
2104 *len_ret = sizeof (struct sockaddr_hci);
2105 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002106#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 case BTPROTO_SCO:
2108 *len_ret = sizeof (struct sockaddr_sco);
2109 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002112 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 "unknown BT protocol");
2114 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 }
2117 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002118#endif
2119
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002120#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 case AF_PACKET:
2122 {
2123 *len_ret = sizeof (struct sockaddr_ll);
2124 return 1;
2125 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002126#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002127
Christian Heimes043d6f62008-01-07 17:19:16 +00002128#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 case AF_TIPC:
2130 {
2131 *len_ret = sizeof (struct sockaddr_tipc);
2132 return 1;
2133 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002134#endif
2135
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002136#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002137 case AF_CAN:
2138 {
2139 *len_ret = sizeof (struct sockaddr_can);
2140 return 1;
2141 }
2142#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002143
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002144#ifdef PF_SYSTEM
2145 case PF_SYSTEM:
2146 switch(s->sock_proto) {
2147#ifdef SYSPROTO_CONTROL
2148 case SYSPROTO_CONTROL:
2149 *len_ret = sizeof (struct sockaddr_ctl);
2150 return 1;
2151#endif
2152 default:
2153 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2154 "unknown PF_SYSTEM protocol");
2155 return 0;
2156 }
2157#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002158#ifdef HAVE_SOCKADDR_ALG
2159 case AF_ALG:
2160 {
2161 *len_ret = sizeof (struct sockaddr_alg);
2162 return 1;
2163 }
2164#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002169 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002173}
2174
2175
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002176/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2177 Currently, these methods are only compiled if the RFC 2292/3542
2178 CMSG_LEN() macro is available. Older systems seem to have used
2179 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2180 it may be possible to define CMSG_LEN() that way if it's not
2181 provided. Some architectures might need extra padding after the
2182 cmsghdr, however, and CMSG_LEN() would have to take account of
2183 this. */
2184#ifdef CMSG_LEN
2185/* If length is in range, set *result to CMSG_LEN(length) and return
2186 true; otherwise, return false. */
2187static int
2188get_CMSG_LEN(size_t length, size_t *result)
2189{
2190 size_t tmp;
2191
2192 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2193 return 0;
2194 tmp = CMSG_LEN(length);
2195 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2196 return 0;
2197 *result = tmp;
2198 return 1;
2199}
2200
2201#ifdef CMSG_SPACE
2202/* If length is in range, set *result to CMSG_SPACE(length) and return
2203 true; otherwise, return false. */
2204static int
2205get_CMSG_SPACE(size_t length, size_t *result)
2206{
2207 size_t tmp;
2208
2209 /* Use CMSG_SPACE(1) here in order to take account of the padding
2210 necessary before *and* after the data. */
2211 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2212 return 0;
2213 tmp = CMSG_SPACE(length);
2214 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2215 return 0;
2216 *result = tmp;
2217 return 1;
2218}
2219#endif
2220
2221/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2222 pointer in msg->msg_control with at least "space" bytes after it,
2223 and its cmsg_len member inside the buffer. */
2224static int
2225cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2226{
2227 size_t cmsg_offset;
2228 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2229 sizeof(cmsgh->cmsg_len));
2230
Charles-François Natali466517d2011-08-28 18:23:43 +02002231 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002232 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002233 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002234 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2235 annoying under OS X as it's unsigned there and so it triggers a
2236 tautological comparison warning under Clang when compared against 0.
2237 Since the check is valid on other platforms, silence the warning under
2238 Clang. */
2239 #ifdef __clang__
2240 #pragma clang diagnostic push
2241 #pragma clang diagnostic ignored "-Wtautological-compare"
2242 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002243 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002244 #pragma GCC diagnostic push
2245 #pragma GCC diagnostic ignored "-Wtype-limits"
2246 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002247 if (msg->msg_controllen < 0)
2248 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002249 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002250 #pragma GCC diagnostic pop
2251 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002252 #ifdef __clang__
2253 #pragma clang diagnostic pop
2254 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002255 if (space < cmsg_len_end)
2256 space = cmsg_len_end;
2257 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2258 return (cmsg_offset <= (size_t)-1 - space &&
2259 cmsg_offset + space <= msg->msg_controllen);
2260}
2261
2262/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2263 *space to number of bytes following it in the buffer and return
2264 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2265 msg->msg_controllen are valid. */
2266static int
2267get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2268{
2269 size_t data_offset;
2270 char *data_ptr;
2271
2272 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2273 return 0;
2274 data_offset = data_ptr - (char *)msg->msg_control;
2275 if (data_offset > msg->msg_controllen)
2276 return 0;
2277 *space = msg->msg_controllen - data_offset;
2278 return 1;
2279}
2280
2281/* If cmsgh is invalid or not contained in the buffer pointed to by
2282 msg->msg_control, return -1. If cmsgh is valid and its associated
2283 data is entirely contained in the buffer, set *data_len to the
2284 length of the associated data and return 0. If only part of the
2285 associated data is contained in the buffer but cmsgh is otherwise
2286 valid, set *data_len to the length contained in the buffer and
2287 return 1. */
2288static int
2289get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2290{
2291 size_t space, cmsg_data_len;
2292
2293 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2294 cmsgh->cmsg_len < CMSG_LEN(0))
2295 return -1;
2296 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2297 if (!get_cmsg_data_space(msg, cmsgh, &space))
2298 return -1;
2299 if (space >= cmsg_data_len) {
2300 *data_len = cmsg_data_len;
2301 return 0;
2302 }
2303 *data_len = space;
2304 return 1;
2305}
2306#endif /* CMSG_LEN */
2307
2308
Victor Stinner31bf2d52015-04-01 21:57:09 +02002309struct sock_accept {
2310 socklen_t *addrlen;
2311 sock_addr_t *addrbuf;
2312 SOCKET_T result;
2313};
2314
2315#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2316/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2317static int accept4_works = -1;
2318#endif
2319
2320static int
2321sock_accept_impl(PySocketSockObject *s, void *data)
2322{
2323 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002324 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2325 socklen_t *paddrlen = ctx->addrlen;
2326#ifdef HAVE_SOCKADDR_ALG
2327 /* AF_ALG does not support accept() with addr and raises
2328 * ECONNABORTED instead. */
2329 if (s->sock_family == AF_ALG) {
2330 addr = NULL;
2331 paddrlen = NULL;
2332 *ctx->addrlen = 0;
2333 }
2334#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002335
2336#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2337 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002338 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002339 SOCK_CLOEXEC);
2340 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2341 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2342 accept4_works = (errno != ENOSYS);
2343 }
2344 }
2345 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002346 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002347#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002348 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002349#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002350
2351#ifdef MS_WINDOWS
2352 return (ctx->result != INVALID_SOCKET);
2353#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002354 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002355#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002356}
2357
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002358/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002359
Guido van Rossum73624e91994-10-10 17:59:00 +00002360static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002361sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002364 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 socklen_t addrlen;
2366 PyObject *sock = NULL;
2367 PyObject *addr = NULL;
2368 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002369 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 if (!getsockaddrlen(s, &addrlen))
2372 return NULL;
2373 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 if (!IS_SELECTABLE(s))
2376 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002377
Victor Stinner31bf2d52015-04-01 21:57:09 +02002378 ctx.addrlen = &addrlen;
2379 ctx.addrbuf = &addrbuf;
2380 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002382 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002383
Victor Stinnerdaf45552013-08-28 00:53:59 +02002384#ifdef MS_WINDOWS
2385 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2386 PyErr_SetFromWindowsErr(0);
2387 SOCKETCLOSE(newfd);
2388 goto finally;
2389 }
2390#else
2391
2392#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2393 if (!accept4_works)
2394#endif
2395 {
2396 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2397 SOCKETCLOSE(newfd);
2398 goto finally;
2399 }
2400 }
2401#endif
2402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 sock = PyLong_FromSocket_t(newfd);
2404 if (sock == NULL) {
2405 SOCKETCLOSE(newfd);
2406 goto finally;
2407 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2410 addrlen, s->sock_proto);
2411 if (addr == NULL)
2412 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002415
Guido van Rossum67f7a382002-06-06 21:08:16 +00002416finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 Py_XDECREF(sock);
2418 Py_XDECREF(addr);
2419 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002420}
2421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002422PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002423"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002424\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002425Wait for an incoming connection. Return a new socket file descriptor\n\
2426representing the connection, and the address of the client.\n\
2427For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002428
Guido van Rossum11ba0942002-06-13 15:07:44 +00002429/* s.setblocking(flag) method. Argument:
2430 False -- non-blocking mode; same as settimeout(0)
2431 True -- blocking mode; same as settimeout(None)
2432*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002433
Guido van Rossum73624e91994-10-10 17:59:00 +00002434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002435sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002436{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002437 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 block = PyLong_AsLong(arg);
2440 if (block == -1 && PyErr_Occurred())
2441 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002442
Victor Stinner9001d802015-04-06 23:06:01 +02002443 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002444 if (internal_setblocking(s, block) == -1) {
2445 return NULL;
2446 }
2447 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002448}
Guido van Rossume4485b01994-09-07 14:32:49 +00002449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002450PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002451"setblocking(flag)\n\
2452\n\
2453Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002454setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002456
Victor Stinner71694d52015-03-28 01:18:54 +01002457static int
2458socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2459{
2460#ifdef MS_WINDOWS
2461 struct timeval tv;
2462#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002463#ifndef HAVE_POLL
2464 _PyTime_t ms;
2465#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002466 int overflow = 0;
2467
2468 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002469 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002470 return 0;
2471 }
2472
Victor Stinner869e1772015-03-30 03:49:14 +02002473 if (_PyTime_FromSecondsObject(timeout,
2474 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002475 return -1;
2476
2477 if (*timeout < 0) {
2478 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2479 return -1;
2480 }
2481
2482#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002483 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002484#endif
2485#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002486 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2487 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002488#endif
2489 if (overflow) {
2490 PyErr_SetString(PyExc_OverflowError,
2491 "timeout doesn't fit into C timeval");
2492 return -1;
2493 }
2494
2495 return 0;
2496}
2497
Guido van Rossum11ba0942002-06-13 15:07:44 +00002498/* s.settimeout(timeout) method. Argument:
2499 None -- no timeout, blocking mode; same as setblocking(True)
2500 0.0 -- non-blocking mode; same as setblocking(False)
2501 > 0 -- timeout mode; operations time out after timeout seconds
2502 < 0 -- illegal; raises an exception
2503*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002504static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002505sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506{
Victor Stinner71694d52015-03-28 01:18:54 +01002507 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508
Victor Stinner71694d52015-03-28 01:18:54 +01002509 if (socket_parse_timeout(&timeout, arg) < 0)
2510 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002513 if (internal_setblocking(s, timeout < 0) == -1) {
2514 return NULL;
2515 }
2516 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002517}
2518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002520"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002522Set a timeout on socket operations. 'timeout' can be a float,\n\
2523giving in seconds, or None. Setting a timeout of None disables\n\
2524the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002527/* s.gettimeout() method.
2528 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002530sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002531{
Victor Stinner71694d52015-03-28 01:18:54 +01002532 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 Py_INCREF(Py_None);
2534 return Py_None;
2535 }
Victor Stinner71694d52015-03-28 01:18:54 +01002536 else {
2537 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2538 return PyFloat_FromDouble(seconds);
2539 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002540}
2541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002542PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002543"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002544\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002545Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002546operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002547operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002548
Guido van Rossumaee08791992-09-08 09:05:33 +00002549/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002550 With an integer third argument, sets an integer optval with optlen=4.
2551 With None as third argument and an integer fourth argument, set
2552 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002553 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002554 use optional built-in module 'struct' to encode the string.
2555*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002556
Guido van Rossum73624e91994-10-10 17:59:00 +00002557static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002558sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 int level;
2561 int optname;
2562 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002563 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002565 unsigned int optlen;
2566 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002567
Christian Heimesdffa3942016-09-05 23:54:41 +02002568 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 if (PyArg_ParseTuple(args, "iii:setsockopt",
2570 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002571 res = setsockopt(s->sock_fd, level, optname,
2572 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002573 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002575
2576 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002577 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002578 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2579 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2580 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002581 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002582 NULL, (socklen_t)optlen);
2583 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002585
2586 PyErr_Clear();
2587 /* setsockopt(level, opt, buffer) */
2588 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2589 &level, &optname, &optval))
2590 return NULL;
2591
2592#ifdef MS_WINDOWS
2593 if (optval.len > INT_MAX) {
2594 PyBuffer_Release(&optval);
2595 PyErr_Format(PyExc_OverflowError,
2596 "socket option is larger than %i bytes",
2597 INT_MAX);
2598 return NULL;
2599 }
2600 res = setsockopt(s->sock_fd, level, optname,
2601 optval.buf, (int)optval.len);
2602#else
2603 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2604#endif
2605 PyBuffer_Release(&optval);
2606
2607done:
Victor Stinnercc739322016-03-23 21:35:29 +01002608 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002610 }
2611
2612 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002613}
2614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002615PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002616"setsockopt(level, option, value: int)\n\
2617setsockopt(level, option, value: buffer)\n\
2618setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002619\n\
2620Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002621The value argument can either be an integer, a string buffer, or \n\
2622None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002623
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002624
Guido van Rossumaee08791992-09-08 09:05:33 +00002625/* s.getsockopt() method.
2626 With two arguments, retrieves an integer option.
2627 With a third integer argument, retrieves a string buffer of that size;
2628 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002629
Guido van Rossum73624e91994-10-10 17:59:00 +00002630static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002631sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 int level;
2634 int optname;
2635 int res;
2636 PyObject *buf;
2637 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2640 &level, &optname, &buflen))
2641 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 if (buflen == 0) {
2644 int flag = 0;
2645 socklen_t flagsize = sizeof flag;
2646 res = getsockopt(s->sock_fd, level, optname,
2647 (void *)&flag, &flagsize);
2648 if (res < 0)
2649 return s->errorhandler();
2650 return PyLong_FromLong(flag);
2651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002653 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 "getsockopt buflen out of range");
2655 return NULL;
2656 }
2657 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2658 if (buf == NULL)
2659 return NULL;
2660 res = getsockopt(s->sock_fd, level, optname,
2661 (void *)PyBytes_AS_STRING(buf), &buflen);
2662 if (res < 0) {
2663 Py_DECREF(buf);
2664 return s->errorhandler();
2665 }
2666 _PyBytes_Resize(&buf, buflen);
2667 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002668}
2669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002670PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002671"getsockopt(level, option[, buffersize]) -> value\n\
2672\n\
2673Get a socket option. See the Unix manual for level and option.\n\
2674If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002675string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002676
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002677
Fred Drake728819a2000-07-01 03:40:12 +00002678/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002679
Guido van Rossum73624e91994-10-10 17:59:00 +00002680static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002681sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 sock_addr_t addrbuf;
2684 int addrlen;
2685 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2688 return NULL;
2689 Py_BEGIN_ALLOW_THREADS
2690 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2691 Py_END_ALLOW_THREADS
2692 if (res < 0)
2693 return s->errorhandler();
2694 Py_INCREF(Py_None);
2695 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696}
2697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699"bind(address)\n\
2700\n\
2701Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002702pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002703sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002704
Guido van Rossum30a685f1991-06-27 15:51:29 +00002705
2706/* s.close() method.
2707 Set the file descriptor to -1 so operations tried subsequently
2708 will surely fail. */
2709
Guido van Rossum73624e91994-10-10 17:59:00 +00002710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002714 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002715
Victor Stinner19a8e842016-03-21 16:36:48 +01002716 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002717 if (fd != INVALID_SOCKET) {
2718 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002719
2720 /* We do not want to retry upon EINTR: see
2721 http://lwn.net/Articles/576478/ and
2722 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2723 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002725 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002727 if (res < 0) {
2728 return s->errorhandler();
2729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 }
2731 Py_INCREF(Py_None);
2732 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002733}
2734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002735PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002736"close()\n\
2737\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002740static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002741sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002742{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002743 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002744 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002745 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002746}
2747
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002748PyDoc_STRVAR(detach_doc,
2749"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002750\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002751Close the socket object without closing the underlying file descriptor.\n\
2752The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002753can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002754
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002755static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002756sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002757{
Victor Stinner81c41db2015-04-02 11:50:57 +02002758 int err;
2759 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002760
Victor Stinner81c41db2015-04-02 11:50:57 +02002761 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2762 /* getsockopt() failed */
2763 return 0;
2764 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002765
Victor Stinner81c41db2015-04-02 11:50:57 +02002766 if (err == EISCONN)
2767 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002768 if (err != 0) {
2769 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2770 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002771 return 0;
2772 }
2773 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002774}
2775
2776static int
2777internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2778 int raise)
2779{
2780 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002781
2782 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002784 Py_END_ALLOW_THREADS
2785
Victor Stinner70a46f62015-03-31 22:03:59 +02002786 if (!res) {
2787 /* connect() succeeded, the socket is connected */
2788 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002790
Victor Stinner81c41db2015-04-02 11:50:57 +02002791 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002792
Victor Stinner81c41db2015-04-02 11:50:57 +02002793 /* save error, PyErr_CheckSignals() can replace it */
2794 err = GET_SOCK_ERROR;
2795 if (CHECK_ERRNO(EINTR)) {
2796 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002797 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002798
2799 /* Issue #23618: when connect() fails with EINTR, the connection is
2800 running asynchronously.
2801
2802 If the socket is blocking or has a timeout, wait until the
2803 connection completes, fails or timed out using select(), and then
2804 get the connection status using getsockopt(SO_ERROR).
2805
2806 If the socket is non-blocking, raise InterruptedError. The caller is
2807 responsible to wait until the connection completes, fails or timed
2808 out (it's the case in asyncio for example). */
2809 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2810 }
2811 else {
2812 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2813 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002814 }
2815
Victor Stinner81c41db2015-04-02 11:50:57 +02002816 if (!wait_connect) {
2817 if (raise) {
2818 /* restore error, maybe replaced by PyErr_CheckSignals() */
2819 SET_SOCK_ERROR(err);
2820 s->errorhandler();
2821 return -1;
2822 }
2823 else
2824 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002825 }
2826
Victor Stinner81c41db2015-04-02 11:50:57 +02002827 if (raise) {
2828 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002829 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2830 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002831 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002832 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002833 else {
2834 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002835 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2836 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002837 return err;
2838 }
2839 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002840}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002841
Fred Drake728819a2000-07-01 03:40:12 +00002842/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002843
Guido van Rossum73624e91994-10-10 17:59:00 +00002844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002845sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 sock_addr_t addrbuf;
2848 int addrlen;
2849 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2852 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002853
Victor Stinner81c41db2015-04-02 11:50:57 +02002854 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002855 if (res < 0)
2856 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002857
Victor Stinneree699e92015-03-31 21:28:42 +02002858 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002859}
2860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002861PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002862"connect(address)\n\
2863\n\
2864Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002865is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002866
Guido van Rossum30a685f1991-06-27 15:51:29 +00002867
Fred Drake728819a2000-07-01 03:40:12 +00002868/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002869
2870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002871sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 sock_addr_t addrbuf;
2874 int addrlen;
2875 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2878 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002879
Victor Stinner81c41db2015-04-02 11:50:57 +02002880 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002881 if (res < 0)
2882 return NULL;
2883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002885}
2886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002888"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002889\n\
2890This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002891instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002892
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002893
Guido van Rossumed233a51992-06-23 09:07:03 +00002894/* s.fileno() method */
2895
Guido van Rossum73624e91994-10-10 17:59:00 +00002896static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002897sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002900}
2901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002902PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002903"fileno() -> integer\n\
2904\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002905Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002906
Guido van Rossumed233a51992-06-23 09:07:03 +00002907
Guido van Rossumc89705d1992-11-26 08:54:07 +00002908/* s.getsockname() method */
2909
Guido van Rossum73624e91994-10-10 17:59:00 +00002910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002911sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 sock_addr_t addrbuf;
2914 int res;
2915 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 if (!getsockaddrlen(s, &addrlen))
2918 return NULL;
2919 memset(&addrbuf, 0, addrlen);
2920 Py_BEGIN_ALLOW_THREADS
2921 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2922 Py_END_ALLOW_THREADS
2923 if (res < 0)
2924 return s->errorhandler();
2925 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2926 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002927}
2928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002929PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002930"getsockname() -> address info\n\
2931\n\
2932Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002933info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002934
Guido van Rossumc89705d1992-11-26 08:54:07 +00002935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002937/* s.getpeername() method */
2938
Guido van Rossum73624e91994-10-10 17:59:00 +00002939static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002940sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 sock_addr_t addrbuf;
2943 int res;
2944 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 if (!getsockaddrlen(s, &addrlen))
2947 return NULL;
2948 memset(&addrbuf, 0, addrlen);
2949 Py_BEGIN_ALLOW_THREADS
2950 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2951 Py_END_ALLOW_THREADS
2952 if (res < 0)
2953 return s->errorhandler();
2954 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2955 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002956}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002958PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002959"getpeername() -> address info\n\
2960\n\
2961Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963
Guido van Rossumb6775db1994-08-01 11:34:53 +00002964#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002965
2966
Guido van Rossum30a685f1991-06-27 15:51:29 +00002967/* s.listen(n) method */
2968
Guido van Rossum73624e91994-10-10 17:59:00 +00002969static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002970sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002971{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002972 /* We try to choose a default backlog high enough to avoid connection drops
2973 * for common workloads, yet not too high to limit resource usage. */
2974 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002976
Charles-François Natali644b8f52014-05-22 19:45:39 +01002977 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002981 /* To avoid problems on systems that don't allow a negative backlog
2982 * (which doesn't make sense anyway) we force a minimum value of 0. */
2983 if (backlog < 0)
2984 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 res = listen(s->sock_fd, backlog);
2986 Py_END_ALLOW_THREADS
2987 if (res < 0)
2988 return s->errorhandler();
2989 Py_INCREF(Py_None);
2990 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002991}
2992
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002993PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002994"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002995\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002996Enable a server to accept connections. If backlog is specified, it must be\n\
2997at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002998unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002999connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000
Victor Stinner31bf2d52015-04-01 21:57:09 +02003001struct sock_recv {
3002 char *cbuf;
3003 Py_ssize_t len;
3004 int flags;
3005 Py_ssize_t result;
3006};
3007
3008static int
3009sock_recv_impl(PySocketSockObject *s, void *data)
3010{
3011 struct sock_recv *ctx = data;
3012
3013#ifdef MS_WINDOWS
3014 if (ctx->len > INT_MAX)
3015 ctx->len = INT_MAX;
3016 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3017#else
3018 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3019#endif
3020 return (ctx->result >= 0);
3021}
3022
Guido van Rossum82a5c661998-07-07 20:45:43 +00003023
Thomas Wouters477c8d52006-05-27 19:21:47 +00003024/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003025 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003026 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003027 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003028 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003029 * also possible that we return a number of bytes smaller than the request
3030 * bytes.
3031 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003032
Antoine Pitrou19467d22010-08-17 19:33:30 +00003033static Py_ssize_t
3034sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003035{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003036 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 if (!IS_SELECTABLE(s)) {
3039 select_error();
3040 return -1;
3041 }
3042 if (len == 0) {
3043 /* If 0 bytes were requested, do nothing. */
3044 return 0;
3045 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003046
Victor Stinner31bf2d52015-04-01 21:57:09 +02003047 ctx.cbuf = cbuf;
3048 ctx.len = len;
3049 ctx.flags = flags;
3050 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003052
3053 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003054}
3055
Guido van Rossum48a680c2001-03-02 06:34:14 +00003056
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003057/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003058
Guido van Rossum73624e91994-10-10 17:59:00 +00003059static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003060sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003061{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003062 Py_ssize_t recvlen, outlen;
3063 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003064 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003065
Antoine Pitrou19467d22010-08-17 19:33:30 +00003066 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 if (recvlen < 0) {
3070 PyErr_SetString(PyExc_ValueError,
3071 "negative buffersize in recv");
3072 return NULL;
3073 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 /* Allocate a new string. */
3076 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3077 if (buf == NULL)
3078 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 /* Call the guts */
3081 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3082 if (outlen < 0) {
3083 /* An error occurred, release the string and return an
3084 error. */
3085 Py_DECREF(buf);
3086 return NULL;
3087 }
3088 if (outlen != recvlen) {
3089 /* We did not read as many bytes as we anticipated, resize the
3090 string if possible and be successful. */
3091 _PyBytes_Resize(&buf, outlen);
3092 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003095}
3096
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003097PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003098"recv(buffersize[, flags]) -> data\n\
3099\n\
3100Receive up to buffersize bytes from the socket. For the optional flags\n\
3101argument, see the Unix manual. When no data is available, block until\n\
3102at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003103the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003104
Guido van Rossum30a685f1991-06-27 15:51:29 +00003105
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003106/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003107
Thomas Wouters477c8d52006-05-27 19:21:47 +00003108static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003109sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003112
Antoine Pitrou19467d22010-08-17 19:33:30 +00003113 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 Py_buffer pbuf;
3115 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003116 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003119 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 &pbuf, &recvlen, &flags))
3121 return NULL;
3122 buf = pbuf.buf;
3123 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 if (recvlen < 0) {
3126 PyBuffer_Release(&pbuf);
3127 PyErr_SetString(PyExc_ValueError,
3128 "negative buffersize in recv_into");
3129 return NULL;
3130 }
3131 if (recvlen == 0) {
3132 /* If nbytes was not specified, use the buffer's length */
3133 recvlen = buflen;
3134 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 /* Check if the buffer is large enough */
3137 if (buflen < recvlen) {
3138 PyBuffer_Release(&pbuf);
3139 PyErr_SetString(PyExc_ValueError,
3140 "buffer too small for requested bytes");
3141 return NULL;
3142 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 /* Call the guts */
3145 readlen = sock_recv_guts(s, buf, recvlen, flags);
3146 if (readlen < 0) {
3147 /* Return an error. */
3148 PyBuffer_Release(&pbuf);
3149 return NULL;
3150 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 PyBuffer_Release(&pbuf);
3153 /* Return the number of bytes read. Note that we do not do anything
3154 special here in the case that readlen < recvlen. */
3155 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156}
3157
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003158PyDoc_STRVAR(recv_into_doc,
3159"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003160\n\
3161A version of recv() that stores its data into a buffer rather than creating \n\
3162a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3163is not specified (or 0), receive up to the size available in the given buffer.\n\
3164\n\
3165See recv() for documentation about the flags.");
3166
Victor Stinner31bf2d52015-04-01 21:57:09 +02003167struct sock_recvfrom {
3168 char* cbuf;
3169 Py_ssize_t len;
3170 int flags;
3171 socklen_t *addrlen;
3172 sock_addr_t *addrbuf;
3173 Py_ssize_t result;
3174};
3175
3176static int
3177sock_recvfrom_impl(PySocketSockObject *s, void *data)
3178{
3179 struct sock_recvfrom *ctx = data;
3180
3181 memset(ctx->addrbuf, 0, *ctx->addrlen);
3182
3183#ifdef MS_WINDOWS
3184 if (ctx->len > INT_MAX)
3185 ctx->len = INT_MAX;
3186 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3187 SAS2SA(ctx->addrbuf), ctx->addrlen);
3188#else
3189 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3190 SAS2SA(ctx->addrbuf), ctx->addrlen);
3191#endif
3192 return (ctx->result >= 0);
3193}
3194
Thomas Wouters477c8d52006-05-27 19:21:47 +00003195
3196/*
Christian Heimes99170a52007-12-19 02:07:34 +00003197 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3198 * into a char buffer. If you have any inc/def ref to do to the objects that
3199 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003200 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003201 * that it is also possible that we return a number of bytes smaller than the
3202 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003203 *
3204 * 'addr' is a return value for the address object. Note that you must decref
3205 * it yourself.
3206 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003207static Py_ssize_t
3208sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003213 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 if (!getsockaddrlen(s, &addrlen))
3218 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 if (!IS_SELECTABLE(s)) {
3221 select_error();
3222 return -1;
3223 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003224
Victor Stinner31bf2d52015-04-01 21:57:09 +02003225 ctx.cbuf = cbuf;
3226 ctx.len = len;
3227 ctx.flags = flags;
3228 ctx.addrbuf = &addrbuf;
3229 ctx.addrlen = &addrlen;
3230 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003232
Victor Stinner31bf2d52015-04-01 21:57:09 +02003233 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3234 s->sock_proto);
3235 if (*addr == NULL)
3236 return -1;
3237
3238 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003239}
3240
3241/* s.recvfrom(nbytes [,flags]) method */
3242
3243static PyObject *
3244sock_recvfrom(PySocketSockObject *s, PyObject *args)
3245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 PyObject *buf = NULL;
3247 PyObject *addr = NULL;
3248 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003249 int flags = 0;
3250 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003251
Antoine Pitrou19467d22010-08-17 19:33:30 +00003252 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 if (recvlen < 0) {
3256 PyErr_SetString(PyExc_ValueError,
3257 "negative buffersize in recvfrom");
3258 return NULL;
3259 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3262 if (buf == NULL)
3263 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3266 recvlen, flags, &addr);
3267 if (outlen < 0) {
3268 goto finally;
3269 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 if (outlen != recvlen) {
3272 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003273 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003275 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 goto finally;
3277 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003280
3281finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 Py_XDECREF(buf);
3283 Py_XDECREF(addr);
3284 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003285}
3286
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003287PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003288"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3289\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003290Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003291
Thomas Wouters477c8d52006-05-27 19:21:47 +00003292
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003293/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003294
3295static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003296sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003299
Antoine Pitrou19467d22010-08-17 19:33:30 +00003300 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 Py_buffer pbuf;
3302 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003303 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003306
Antoine Pitrou19467d22010-08-17 19:33:30 +00003307 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 kwlist, &pbuf,
3309 &recvlen, &flags))
3310 return NULL;
3311 buf = pbuf.buf;
3312 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 if (recvlen < 0) {
3315 PyBuffer_Release(&pbuf);
3316 PyErr_SetString(PyExc_ValueError,
3317 "negative buffersize in recvfrom_into");
3318 return NULL;
3319 }
3320 if (recvlen == 0) {
3321 /* If nbytes was not specified, use the buffer's length */
3322 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003323 } else if (recvlen > buflen) {
3324 PyBuffer_Release(&pbuf);
3325 PyErr_SetString(PyExc_ValueError,
3326 "nbytes is greater than the length of the buffer");
3327 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3331 if (readlen < 0) {
3332 PyBuffer_Release(&pbuf);
3333 /* Return an error */
3334 Py_XDECREF(addr);
3335 return NULL;
3336 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 PyBuffer_Release(&pbuf);
3339 /* Return the number of bytes read and the address. Note that we do
3340 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003341 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003342}
3343
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003344PyDoc_STRVAR(recvfrom_into_doc,
3345"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003346\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003347Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003348
Victor Stinner35bee932015-04-02 12:28:07 +02003349/* The sendmsg() and recvmsg[_into]() methods require a working
3350 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3351#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003352struct sock_recvmsg {
3353 struct msghdr *msg;
3354 int flags;
3355 ssize_t result;
3356};
3357
3358static int
3359sock_recvmsg_impl(PySocketSockObject *s, void *data)
3360{
3361 struct sock_recvmsg *ctx = data;
3362
3363 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3364 return (ctx->result >= 0);
3365}
3366
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003367/*
3368 * Call recvmsg() with the supplied iovec structures, flags, and
3369 * ancillary data buffer size (controllen). Returns the tuple return
3370 * value for recvmsg() or recvmsg_into(), with the first item provided
3371 * by the supplied makeval() function. makeval() will be called with
3372 * the length read and makeval_data as arguments, and must return a
3373 * new reference (which will be decrefed if there is a subsequent
3374 * error). On error, closes any file descriptors received via
3375 * SCM_RIGHTS.
3376 */
3377static PyObject *
3378sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3379 int flags, Py_ssize_t controllen,
3380 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3381{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003382 sock_addr_t addrbuf;
3383 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003384 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003385 PyObject *cmsg_list = NULL, *retval = NULL;
3386 void *controlbuf = NULL;
3387 struct cmsghdr *cmsgh;
3388 size_t cmsgdatalen = 0;
3389 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003390 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003391
3392 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3393 ignored" when the socket is connected (Linux fills them in
3394 anyway for AF_UNIX sockets at least). Normally msg_namelen
3395 seems to be set to 0 if there's no address, but try to
3396 initialize msg_name to something that won't be mistaken for a
3397 real address if that doesn't happen. */
3398 if (!getsockaddrlen(s, &addrbuflen))
3399 return NULL;
3400 memset(&addrbuf, 0, addrbuflen);
3401 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3402
3403 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3404 PyErr_SetString(PyExc_ValueError,
3405 "invalid ancillary data buffer length");
3406 return NULL;
3407 }
3408 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3409 return PyErr_NoMemory();
3410
3411 /* Make the system call. */
3412 if (!IS_SELECTABLE(s)) {
3413 select_error();
3414 goto finally;
3415 }
3416
Victor Stinner31bf2d52015-04-01 21:57:09 +02003417 msg.msg_name = SAS2SA(&addrbuf);
3418 msg.msg_namelen = addrbuflen;
3419 msg.msg_iov = iov;
3420 msg.msg_iovlen = iovlen;
3421 msg.msg_control = controlbuf;
3422 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003423
Victor Stinner31bf2d52015-04-01 21:57:09 +02003424 ctx.msg = &msg;
3425 ctx.flags = flags;
3426 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003427 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428
3429 /* Make list of (level, type, data) tuples from control messages. */
3430 if ((cmsg_list = PyList_New(0)) == NULL)
3431 goto err_closefds;
3432 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3433 implementations didn't do so. */
3434 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3435 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3436 PyObject *bytes, *tuple;
3437 int tmp;
3438
3439 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3440 if (cmsg_status != 0) {
3441 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3442 "received malformed or improperly-truncated "
3443 "ancillary data", 1) == -1)
3444 goto err_closefds;
3445 }
3446 if (cmsg_status < 0)
3447 break;
3448 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003449 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450 goto err_closefds;
3451 }
3452
3453 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3454 cmsgdatalen);
3455 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3456 (int)cmsgh->cmsg_type, bytes);
3457 if (tuple == NULL)
3458 goto err_closefds;
3459 tmp = PyList_Append(cmsg_list, tuple);
3460 Py_DECREF(tuple);
3461 if (tmp != 0)
3462 goto err_closefds;
3463
3464 if (cmsg_status != 0)
3465 break;
3466 }
3467
3468 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003469 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003470 cmsg_list,
3471 (int)msg.msg_flags,
3472 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3473 ((msg.msg_namelen > addrbuflen) ?
3474 addrbuflen : msg.msg_namelen),
3475 s->sock_proto));
3476 if (retval == NULL)
3477 goto err_closefds;
3478
3479finally:
3480 Py_XDECREF(cmsg_list);
3481 PyMem_Free(controlbuf);
3482 return retval;
3483
3484err_closefds:
3485#ifdef SCM_RIGHTS
3486 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3487 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3488 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3489 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3490 if (cmsg_status < 0)
3491 break;
3492 if (cmsgh->cmsg_level == SOL_SOCKET &&
3493 cmsgh->cmsg_type == SCM_RIGHTS) {
3494 size_t numfds;
3495 int *fdp;
3496
3497 numfds = cmsgdatalen / sizeof(int);
3498 fdp = (int *)CMSG_DATA(cmsgh);
3499 while (numfds-- > 0)
3500 close(*fdp++);
3501 }
3502 if (cmsg_status != 0)
3503 break;
3504 }
3505#endif /* SCM_RIGHTS */
3506 goto finally;
3507}
3508
3509
3510static PyObject *
3511makeval_recvmsg(ssize_t received, void *data)
3512{
3513 PyObject **buf = data;
3514
3515 if (received < PyBytes_GET_SIZE(*buf))
3516 _PyBytes_Resize(buf, received);
3517 Py_XINCREF(*buf);
3518 return *buf;
3519}
3520
3521/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3522
3523static PyObject *
3524sock_recvmsg(PySocketSockObject *s, PyObject *args)
3525{
3526 Py_ssize_t bufsize, ancbufsize = 0;
3527 int flags = 0;
3528 struct iovec iov;
3529 PyObject *buf = NULL, *retval = NULL;
3530
3531 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3532 return NULL;
3533
3534 if (bufsize < 0) {
3535 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3536 return NULL;
3537 }
3538 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3539 return NULL;
3540 iov.iov_base = PyBytes_AS_STRING(buf);
3541 iov.iov_len = bufsize;
3542
3543 /* Note that we're passing a pointer to *our pointer* to the bytes
3544 object here (&buf); makeval_recvmsg() may incref the object, or
3545 deallocate it and set our pointer to NULL. */
3546 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3547 &makeval_recvmsg, &buf);
3548 Py_XDECREF(buf);
3549 return retval;
3550}
3551
3552PyDoc_STRVAR(recvmsg_doc,
3553"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3554\n\
3555Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3556socket. The ancbufsize argument sets the size in bytes of the\n\
3557internal buffer used to receive the ancillary data; it defaults to 0,\n\
3558meaning that no ancillary data will be received. Appropriate buffer\n\
3559sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3560CMSG_LEN(), and items which do not fit into the buffer might be\n\
3561truncated or discarded. The flags argument defaults to 0 and has the\n\
3562same meaning as for recv().\n\
3563\n\
3564The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3565The data item is a bytes object holding the non-ancillary data\n\
3566received. The ancdata item is a list of zero or more tuples\n\
3567(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3568(control messages) received: cmsg_level and cmsg_type are integers\n\
3569specifying the protocol level and protocol-specific type respectively,\n\
3570and cmsg_data is a bytes object holding the associated data. The\n\
3571msg_flags item is the bitwise OR of various flags indicating\n\
3572conditions on the received message; see your system documentation for\n\
3573details. If the receiving socket is unconnected, address is the\n\
3574address of the sending socket, if available; otherwise, its value is\n\
3575unspecified.\n\
3576\n\
3577If recvmsg() raises an exception after the system call returns, it\n\
3578will first attempt to close any file descriptors received via the\n\
3579SCM_RIGHTS mechanism.");
3580
3581
3582static PyObject *
3583makeval_recvmsg_into(ssize_t received, void *data)
3584{
3585 return PyLong_FromSsize_t(received);
3586}
3587
3588/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3589
3590static PyObject *
3591sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3592{
3593 Py_ssize_t ancbufsize = 0;
3594 int flags = 0;
3595 struct iovec *iovs = NULL;
3596 Py_ssize_t i, nitems, nbufs = 0;
3597 Py_buffer *bufs = NULL;
3598 PyObject *buffers_arg, *fast, *retval = NULL;
3599
3600 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3601 &buffers_arg, &ancbufsize, &flags))
3602 return NULL;
3603
3604 if ((fast = PySequence_Fast(buffers_arg,
3605 "recvmsg_into() argument 1 must be an "
3606 "iterable")) == NULL)
3607 return NULL;
3608 nitems = PySequence_Fast_GET_SIZE(fast);
3609 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003610 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 goto finally;
3612 }
3613
3614 /* Fill in an iovec for each item, and save the Py_buffer
3615 structs to release afterwards. */
3616 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3617 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3618 PyErr_NoMemory();
3619 goto finally;
3620 }
3621 for (; nbufs < nitems; nbufs++) {
3622 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3623 "w*;recvmsg_into() argument 1 must be an iterable "
3624 "of single-segment read-write buffers",
3625 &bufs[nbufs]))
3626 goto finally;
3627 iovs[nbufs].iov_base = bufs[nbufs].buf;
3628 iovs[nbufs].iov_len = bufs[nbufs].len;
3629 }
3630
3631 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3632 &makeval_recvmsg_into, NULL);
3633finally:
3634 for (i = 0; i < nbufs; i++)
3635 PyBuffer_Release(&bufs[i]);
3636 PyMem_Free(bufs);
3637 PyMem_Free(iovs);
3638 Py_DECREF(fast);
3639 return retval;
3640}
3641
3642PyDoc_STRVAR(recvmsg_into_doc,
3643"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3644\n\
3645Receive normal data and ancillary data from the socket, scattering the\n\
3646non-ancillary data into a series of buffers. The buffers argument\n\
3647must be an iterable of objects that export writable buffers\n\
3648(e.g. bytearray objects); these will be filled with successive chunks\n\
3649of the non-ancillary data until it has all been written or there are\n\
3650no more buffers. The ancbufsize argument sets the size in bytes of\n\
3651the internal buffer used to receive the ancillary data; it defaults to\n\
36520, meaning that no ancillary data will be received. Appropriate\n\
3653buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3654or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3655truncated or discarded. The flags argument defaults to 0 and has the\n\
3656same meaning as for recv().\n\
3657\n\
3658The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3659The nbytes item is the total number of bytes of non-ancillary data\n\
3660written into the buffers. The ancdata item is a list of zero or more\n\
3661tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3662data (control messages) received: cmsg_level and cmsg_type are\n\
3663integers specifying the protocol level and protocol-specific type\n\
3664respectively, and cmsg_data is a bytes object holding the associated\n\
3665data. The msg_flags item is the bitwise OR of various flags\n\
3666indicating conditions on the received message; see your system\n\
3667documentation for details. If the receiving socket is unconnected,\n\
3668address is the address of the sending socket, if available; otherwise,\n\
3669its value is unspecified.\n\
3670\n\
3671If recvmsg_into() raises an exception after the system call returns,\n\
3672it will first attempt to close any file descriptors received via the\n\
3673SCM_RIGHTS mechanism.");
3674#endif /* CMSG_LEN */
3675
3676
Victor Stinner31bf2d52015-04-01 21:57:09 +02003677struct sock_send {
3678 char *buf;
3679 Py_ssize_t len;
3680 int flags;
3681 Py_ssize_t result;
3682};
3683
3684static int
3685sock_send_impl(PySocketSockObject *s, void *data)
3686{
3687 struct sock_send *ctx = data;
3688
3689#ifdef MS_WINDOWS
3690 if (ctx->len > INT_MAX)
3691 ctx->len = INT_MAX;
3692 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3693#else
3694 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3695#endif
3696 return (ctx->result >= 0);
3697}
3698
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003699/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003700
Guido van Rossum73624e91994-10-10 17:59:00 +00003701static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003702sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003703{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003704 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003706 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3709 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 if (!IS_SELECTABLE(s)) {
3712 PyBuffer_Release(&pbuf);
3713 return select_error();
3714 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003715 ctx.buf = pbuf.buf;
3716 ctx.len = pbuf.len;
3717 ctx.flags = flags;
3718 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003719 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 return NULL;
3721 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003722 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003723
3724 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003725}
3726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003727PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003728"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003729\n\
3730Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003731argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003732sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003733
3734
3735/* s.sendall(data [,flags]) method */
3736
3737static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003738sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003741 Py_ssize_t len, n;
3742 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003744 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003745 int has_timeout = (s->sock_timeout > 0);
3746 _PyTime_t interval = s->sock_timeout;
3747 _PyTime_t deadline = 0;
3748 int deadline_initialized = 0;
3749 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3752 return NULL;
3753 buf = pbuf.buf;
3754 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 if (!IS_SELECTABLE(s)) {
3757 PyBuffer_Release(&pbuf);
3758 return select_error();
3759 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003762 if (has_timeout) {
3763 if (deadline_initialized) {
3764 /* recompute the timeout */
3765 interval = deadline - _PyTime_GetMonotonicClock();
3766 }
3767 else {
3768 deadline_initialized = 1;
3769 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3770 }
3771
3772 if (interval <= 0) {
3773 PyErr_SetString(socket_timeout, "timed out");
3774 goto done;
3775 }
3776 }
3777
Victor Stinner02f32ab2015-04-01 22:53:26 +02003778 ctx.buf = buf;
3779 ctx.len = len;
3780 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003781 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3782 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003783 n = ctx.result;
3784 assert(n >= 0);
3785
3786 buf += n;
3787 len -= n;
3788
3789 /* We must run our signal handlers before looping again.
3790 send() can return a successful partial write when it is
3791 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003792 if (PyErr_CheckSignals())
3793 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003794 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003796
Victor Stinner8912d142015-04-06 23:16:34 +02003797 Py_INCREF(Py_None);
3798 res = Py_None;
3799
3800done:
3801 PyBuffer_Release(&pbuf);
3802 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003803}
3804
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003805PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003806"sendall(data[, flags])\n\
3807\n\
3808Send a data string to the socket. For the optional flags\n\
3809argument, see the Unix manual. This calls send() repeatedly\n\
3810until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003811to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003812
Guido van Rossum30a685f1991-06-27 15:51:29 +00003813
Victor Stinner31bf2d52015-04-01 21:57:09 +02003814struct sock_sendto {
3815 char *buf;
3816 Py_ssize_t len;
3817 int flags;
3818 int addrlen;
3819 sock_addr_t *addrbuf;
3820 Py_ssize_t result;
3821};
3822
3823static int
3824sock_sendto_impl(PySocketSockObject *s, void *data)
3825{
3826 struct sock_sendto *ctx = data;
3827
3828#ifdef MS_WINDOWS
3829 if (ctx->len > INT_MAX)
3830 ctx->len = INT_MAX;
3831 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3832 SAS2SA(ctx->addrbuf), ctx->addrlen);
3833#else
3834 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3835 SAS2SA(ctx->addrbuf), ctx->addrlen);
3836#endif
3837 return (ctx->result >= 0);
3838}
3839
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003840/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003841
Guido van Rossum73624e91994-10-10 17:59:00 +00003842static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003843sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 Py_buffer pbuf;
3846 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003847 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003849 int addrlen, flags;
3850 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003853 arglen = PyTuple_Size(args);
3854 switch (arglen) {
3855 case 2:
3856 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3857 break;
3858 case 3:
3859 PyArg_ParseTuple(args, "y*iO:sendto",
3860 &pbuf, &flags, &addro);
3861 break;
3862 default:
3863 PyErr_Format(PyExc_TypeError,
3864 "sendto() takes 2 or 3 arguments (%d given)",
3865 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003866 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003868 if (PyErr_Occurred())
3869 return NULL;
3870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 if (!IS_SELECTABLE(s)) {
3872 PyBuffer_Release(&pbuf);
3873 return select_error();
3874 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3877 PyBuffer_Release(&pbuf);
3878 return NULL;
3879 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003880
Victor Stinner31bf2d52015-04-01 21:57:09 +02003881 ctx.buf = pbuf.buf;
3882 ctx.len = pbuf.len;
3883 ctx.flags = flags;
3884 ctx.addrlen = addrlen;
3885 ctx.addrbuf = &addrbuf;
3886 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003887 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 return NULL;
3889 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003890 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003891
3892 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003893}
3894
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003895PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003896"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003897\n\
3898Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003899For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003900
Guido van Rossum30a685f1991-06-27 15:51:29 +00003901
Victor Stinner35bee932015-04-02 12:28:07 +02003902/* The sendmsg() and recvmsg[_into]() methods require a working
3903 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3904#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003905struct sock_sendmsg {
3906 struct msghdr *msg;
3907 int flags;
3908 ssize_t result;
3909};
3910
3911static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003912sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3913 struct msghdr *msg,
3914 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3915 Py_ssize_t ndataparts, ndatabufs = 0;
3916 int result = -1;
3917 struct iovec *iovs = NULL;
3918 PyObject *data_fast = NULL;
3919 Py_buffer *databufs = NULL;
3920
3921 /* Fill in an iovec for each message part, and save the Py_buffer
3922 structs to release afterwards. */
3923 if ((data_fast = PySequence_Fast(data_arg,
3924 "sendmsg() argument 1 must be an "
3925 "iterable")) == NULL)
3926 goto finally;
3927 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3928 if (ndataparts > INT_MAX) {
3929 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3930 goto finally;
3931 }
3932 msg->msg_iovlen = ndataparts;
3933 if (ndataparts > 0 &&
3934 ((msg->msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3935 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3936 PyErr_NoMemory();
3937 goto finally;
3938 }
3939 for (; ndatabufs < ndataparts; ndatabufs++) {
3940 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3941 "y*;sendmsg() argument 1 must be an iterable of "
3942 "bytes-like objects",
3943 &databufs[ndatabufs]))
3944 goto finally;
3945 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3946 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3947 }
3948 result = 0;
3949 finally:
3950 *databufsout = databufs;
3951 *ndatabufsout = ndatabufs;
3952 Py_XDECREF(data_fast);
3953 return result;
3954}
3955
3956static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003957sock_sendmsg_impl(PySocketSockObject *s, void *data)
3958{
3959 struct sock_sendmsg *ctx = data;
3960
3961 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3962 return (ctx->result >= 0);
3963}
3964
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003965/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3966
3967static PyObject *
3968sock_sendmsg(PySocketSockObject *s, PyObject *args)
3969{
Christian Heimesdffa3942016-09-05 23:54:41 +02003970 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003971 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003973 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974 struct cmsginfo {
3975 int level;
3976 int type;
3977 Py_buffer data;
3978 } *cmsgs = NULL;
3979 void *controlbuf = NULL;
3980 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003981 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003982 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003984 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985
3986 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3987 &data_arg, &cmsg_arg, &flags, &addr_arg))
3988 return NULL;
3989
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990 /* Parse destination address. */
3991 if (addr_arg != NULL && addr_arg != Py_None) {
3992 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3993 goto finally;
3994 msg.msg_name = &addrbuf;
3995 msg.msg_namelen = addrlen;
3996 }
3997
3998 /* Fill in an iovec for each message part, and save the Py_buffer
3999 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004000 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004001 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004002 }
4003
4004 if (cmsg_arg == NULL)
4005 ncmsgs = 0;
4006 else {
4007 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4008 "sendmsg() argument 2 must be an "
4009 "iterable")) == NULL)
4010 goto finally;
4011 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4012 }
4013
4014#ifndef CMSG_SPACE
4015 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004016 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004017 "sending multiple control messages is not supported "
4018 "on this system");
4019 goto finally;
4020 }
4021#endif
4022 /* Save level, type and Py_buffer for each control message,
4023 and calculate total size. */
4024 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4025 PyErr_NoMemory();
4026 goto finally;
4027 }
4028 controllen = controllen_last = 0;
4029 while (ncmsgbufs < ncmsgs) {
4030 size_t bufsize, space;
4031
4032 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4033 "(iiy*):[sendmsg() ancillary data items]",
4034 &cmsgs[ncmsgbufs].level,
4035 &cmsgs[ncmsgbufs].type,
4036 &cmsgs[ncmsgbufs].data))
4037 goto finally;
4038 bufsize = cmsgs[ncmsgbufs++].data.len;
4039
4040#ifdef CMSG_SPACE
4041 if (!get_CMSG_SPACE(bufsize, &space)) {
4042#else
4043 if (!get_CMSG_LEN(bufsize, &space)) {
4044#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004045 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004046 goto finally;
4047 }
4048 controllen += space;
4049 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004050 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004051 goto finally;
4052 }
4053 controllen_last = controllen;
4054 }
4055
4056 /* Construct ancillary data block from control message info. */
4057 if (ncmsgbufs > 0) {
4058 struct cmsghdr *cmsgh = NULL;
4059
4060 if ((msg.msg_control = controlbuf =
4061 PyMem_Malloc(controllen)) == NULL) {
4062 PyErr_NoMemory();
4063 goto finally;
4064 }
4065 msg.msg_controllen = controllen;
4066
4067 /* Need to zero out the buffer as a workaround for glibc's
4068 CMSG_NXTHDR() implementation. After getting the pointer to
4069 the next header, it checks its (uninitialized) cmsg_len
4070 member to see if the "message" fits in the buffer, and
4071 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004072 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004073 memset(controlbuf, 0, controllen);
4074
4075 for (i = 0; i < ncmsgbufs; i++) {
4076 size_t msg_len, data_len = cmsgs[i].data.len;
4077 int enough_space = 0;
4078
4079 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4080 if (cmsgh == NULL) {
4081 PyErr_Format(PyExc_RuntimeError,
4082 "unexpected NULL result from %s()",
4083 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4084 goto finally;
4085 }
4086 if (!get_CMSG_LEN(data_len, &msg_len)) {
4087 PyErr_SetString(PyExc_RuntimeError,
4088 "item size out of range for CMSG_LEN()");
4089 goto finally;
4090 }
4091 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4092 size_t space;
4093
4094 cmsgh->cmsg_len = msg_len;
4095 if (get_cmsg_data_space(&msg, cmsgh, &space))
4096 enough_space = (space >= data_len);
4097 }
4098 if (!enough_space) {
4099 PyErr_SetString(PyExc_RuntimeError,
4100 "ancillary data does not fit in calculated "
4101 "space");
4102 goto finally;
4103 }
4104 cmsgh->cmsg_level = cmsgs[i].level;
4105 cmsgh->cmsg_type = cmsgs[i].type;
4106 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4107 }
4108 }
4109
4110 /* Make the system call. */
4111 if (!IS_SELECTABLE(s)) {
4112 select_error();
4113 goto finally;
4114 }
4115
Victor Stinner31bf2d52015-04-01 21:57:09 +02004116 ctx.msg = &msg;
4117 ctx.flags = flags;
4118 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004120
4121 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004122
4123finally:
4124 PyMem_Free(controlbuf);
4125 for (i = 0; i < ncmsgbufs; i++)
4126 PyBuffer_Release(&cmsgs[i].data);
4127 PyMem_Free(cmsgs);
4128 Py_XDECREF(cmsg_fast);
4129 for (i = 0; i < ndatabufs; i++)
4130 PyBuffer_Release(&databufs[i]);
4131 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004132 return retval;
4133}
4134
4135PyDoc_STRVAR(sendmsg_doc,
4136"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4137\n\
4138Send normal and ancillary data to the socket, gathering the\n\
4139non-ancillary data from a series of buffers and concatenating it into\n\
4140a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004141data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004142The ancdata argument specifies the ancillary data (control messages)\n\
4143as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4144cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4145protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004146is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004147argument defaults to 0 and has the same meaning as for send(). If\n\
4148address is supplied and not None, it sets a destination address for\n\
4149the message. The return value is the number of bytes of non-ancillary\n\
4150data sent.");
4151#endif /* CMSG_LEN */
4152
Christian Heimesdffa3942016-09-05 23:54:41 +02004153#ifdef HAVE_SOCKADDR_ALG
4154static PyObject*
4155sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4156{
4157 PyObject *retval = NULL;
4158
4159 Py_ssize_t i, ndatabufs = 0;
4160 Py_buffer *databufs = NULL;
4161 PyObject *data_arg = NULL;
4162
4163 Py_buffer iv = {NULL, NULL};
4164
4165 PyObject *opobj = NULL;
4166 int op = -1;
4167
4168 PyObject *assoclenobj = NULL;
4169 int assoclen = -1;
4170
4171 unsigned int *uiptr;
4172 int flags = 0;
4173
4174 struct msghdr msg;
4175 struct cmsghdr *header = NULL;
4176 struct af_alg_iv *alg_iv = NULL;
4177 struct sock_sendmsg ctx;
4178 Py_ssize_t controllen;
4179 void *controlbuf = NULL;
4180 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4181
4182 if (self->sock_family != AF_ALG) {
4183 PyErr_SetString(PyExc_OSError,
4184 "algset is only supported for AF_ALG");
4185 return NULL;
4186 }
4187
4188 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4189 "|O$O!y*O!i:sendmsg_afalg", keywords,
4190 &data_arg,
4191 &PyLong_Type, &opobj, &iv,
4192 &PyLong_Type, &assoclenobj, &flags))
4193 return NULL;
4194
4195 /* op is a required, keyword-only argument >= 0 */
4196 if (opobj != NULL) {
4197 op = _PyLong_AsInt(opobj);
4198 }
4199 if (op < 0) {
4200 /* override exception from _PyLong_AsInt() */
4201 PyErr_SetString(PyExc_TypeError,
4202 "Invalid or missing argument 'op'");
4203 goto finally;
4204 }
4205 /* assoclen is optional but must be >= 0 */
4206 if (assoclenobj != NULL) {
4207 assoclen = _PyLong_AsInt(assoclenobj);
4208 if (assoclen == -1 && PyErr_Occurred()) {
4209 goto finally;
4210 }
4211 if (assoclen < 0) {
4212 PyErr_SetString(PyExc_TypeError,
4213 "assoclen must be positive");
4214 goto finally;
4215 }
4216 }
4217
4218 controllen = CMSG_SPACE(4);
4219 if (iv.buf != NULL) {
4220 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4221 }
4222 if (assoclen >= 0) {
4223 controllen += CMSG_SPACE(4);
4224 }
4225
4226 controlbuf = PyMem_Malloc(controllen);
4227 if (controlbuf == NULL) {
4228 return PyErr_NoMemory();
4229 }
4230 memset(controlbuf, 0, controllen);
4231
4232 memset(&msg, 0, sizeof(msg));
4233 msg.msg_controllen = controllen;
4234 msg.msg_control = controlbuf;
4235
4236 /* Fill in an iovec for each message part, and save the Py_buffer
4237 structs to release afterwards. */
4238 if (data_arg != NULL) {
4239 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4240 goto finally;
4241 }
4242 }
4243
4244 /* set operation to encrypt or decrypt */
4245 header = CMSG_FIRSTHDR(&msg);
4246 if (header == NULL) {
4247 PyErr_SetString(PyExc_RuntimeError,
4248 "unexpected NULL result from CMSG_FIRSTHDR");
4249 goto finally;
4250 }
4251 header->cmsg_level = SOL_ALG;
4252 header->cmsg_type = ALG_SET_OP;
4253 header->cmsg_len = CMSG_LEN(4);
4254 uiptr = (void*)CMSG_DATA(header);
4255 *uiptr = (unsigned int)op;
4256
4257 /* set initialization vector */
4258 if (iv.buf != NULL) {
4259 header = CMSG_NXTHDR(&msg, header);
4260 if (header == NULL) {
4261 PyErr_SetString(PyExc_RuntimeError,
4262 "unexpected NULL result from CMSG_NXTHDR(iv)");
4263 goto finally;
4264 }
4265 header->cmsg_level = SOL_ALG;
4266 header->cmsg_type = ALG_SET_IV;
4267 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4268 alg_iv = (void*)CMSG_DATA(header);
4269 alg_iv->ivlen = iv.len;
4270 memcpy(alg_iv->iv, iv.buf, iv.len);
4271 }
4272
4273 /* set length of associated data for AEAD */
4274 if (assoclen >= 0) {
4275 header = CMSG_NXTHDR(&msg, header);
4276 if (header == NULL) {
4277 PyErr_SetString(PyExc_RuntimeError,
4278 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4279 goto finally;
4280 }
4281 header->cmsg_level = SOL_ALG;
4282 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4283 header->cmsg_len = CMSG_LEN(4);
4284 uiptr = (void*)CMSG_DATA(header);
4285 *uiptr = (unsigned int)assoclen;
4286 }
4287
4288 ctx.msg = &msg;
4289 ctx.flags = flags;
4290 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0)
4291 goto finally;
4292
4293 retval = PyLong_FromSsize_t(ctx.result);
4294
4295 finally:
4296 PyMem_Free(controlbuf);
4297 if (iv.buf != NULL) {
4298 PyBuffer_Release(&iv);
4299 }
4300 for (i = 0; i < ndatabufs; i++)
4301 PyBuffer_Release(&databufs[i]);
4302 PyMem_Free(databufs);
4303 return retval;
4304}
4305
4306PyDoc_STRVAR(sendmsg_afalg_doc,
4307"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4308\n\
4309Set operation mode, IV and length of associated data for an AF_ALG\n\
4310operation socket.");
4311#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004312
Guido van Rossum30a685f1991-06-27 15:51:29 +00004313/* s.shutdown(how) method */
4314
Guido van Rossum73624e91994-10-10 17:59:00 +00004315static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004316sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004318 int how;
4319 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004320
Serhiy Storchaka78980432013-01-15 01:12:17 +02004321 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 if (how == -1 && PyErr_Occurred())
4323 return NULL;
4324 Py_BEGIN_ALLOW_THREADS
4325 res = shutdown(s->sock_fd, how);
4326 Py_END_ALLOW_THREADS
4327 if (res < 0)
4328 return s->errorhandler();
4329 Py_INCREF(Py_None);
4330 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004331}
4332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004333PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004334"shutdown(flag)\n\
4335\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004336Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4337of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004338
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004339#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004340static PyObject*
4341sock_ioctl(PySocketSockObject *s, PyObject *arg)
4342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 unsigned long cmd = SIO_RCVALL;
4344 PyObject *argO;
4345 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4348 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 switch (cmd) {
4351 case SIO_RCVALL: {
4352 unsigned int option = RCVALL_ON;
4353 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4354 return NULL;
4355 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4356 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4357 return set_error();
4358 }
4359 return PyLong_FromUnsignedLong(recv); }
4360 case SIO_KEEPALIVE_VALS: {
4361 struct tcp_keepalive ka;
4362 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4363 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4364 return NULL;
4365 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4366 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4367 return set_error();
4368 }
4369 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004370#if defined(SIO_LOOPBACK_FAST_PATH)
4371 case SIO_LOOPBACK_FAST_PATH: {
4372 unsigned int option;
4373 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4374 return NULL;
4375 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4376 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4377 return set_error();
4378 }
4379 return PyLong_FromUnsignedLong(recv); }
4380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 default:
4382 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4383 return NULL;
4384 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004385}
4386PyDoc_STRVAR(sock_ioctl_doc,
4387"ioctl(cmd, option) -> long\n\
4388\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004389Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4390SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004391SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4392SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004393#endif
4394
4395#if defined(MS_WINDOWS)
4396static PyObject*
4397sock_share(PySocketSockObject *s, PyObject *arg)
4398{
4399 WSAPROTOCOL_INFO info;
4400 DWORD processId;
4401 int result;
4402
4403 if (!PyArg_ParseTuple(arg, "I", &processId))
4404 return NULL;
4405
4406 Py_BEGIN_ALLOW_THREADS
4407 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4408 Py_END_ALLOW_THREADS
4409 if (result == SOCKET_ERROR)
4410 return set_error();
4411 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4412}
4413PyDoc_STRVAR(sock_share_doc,
4414"share(process_id) -> bytes\n\
4415\n\
4416Share the socket with another process. The target process id\n\
4417must be provided and the resulting bytes object passed to the target\n\
4418process. There the shared socket can be instantiated by calling\n\
4419socket.fromshare().");
4420
Christian Heimesfaf2f632008-01-06 16:59:19 +00004421
4422#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004423
4424/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004425
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004426static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4428 accept_doc},
4429 {"bind", (PyCFunction)sock_bind, METH_O,
4430 bind_doc},
4431 {"close", (PyCFunction)sock_close, METH_NOARGS,
4432 close_doc},
4433 {"connect", (PyCFunction)sock_connect, METH_O,
4434 connect_doc},
4435 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4436 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004437 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4438 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4440 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004441#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 {"getpeername", (PyCFunction)sock_getpeername,
4443 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 {"getsockname", (PyCFunction)sock_getsockname,
4446 METH_NOARGS, getsockname_doc},
4447 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4448 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004449#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4451 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004452#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004453#if defined(MS_WINDOWS)
4454 {"share", (PyCFunction)sock_share, METH_VARARGS,
4455 sock_share_doc},
4456#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004457 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 listen_doc},
4459 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4460 recv_doc},
4461 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4462 recv_into_doc},
4463 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4464 recvfrom_doc},
4465 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4466 recvfrom_into_doc},
4467 {"send", (PyCFunction)sock_send, METH_VARARGS,
4468 send_doc},
4469 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4470 sendall_doc},
4471 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4472 sendto_doc},
4473 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4474 setblocking_doc},
4475 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4476 settimeout_doc},
4477 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4478 gettimeout_doc},
4479 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4480 setsockopt_doc},
4481 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4482 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004483#ifdef CMSG_LEN
4484 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4485 recvmsg_doc},
4486 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4487 recvmsg_into_doc,},
4488 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4489 sendmsg_doc},
4490#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004491#ifdef HAVE_SOCKADDR_ALG
4492 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4493 sendmsg_afalg_doc},
4494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004496};
4497
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004498/* SockObject members */
4499static PyMemberDef sock_memberlist[] = {
4500 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4501 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4502 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004503 {0},
4504};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004505
Victor Stinner71694d52015-03-28 01:18:54 +01004506static PyGetSetDef sock_getsetlist[] = {
4507 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4508 {NULL} /* sentinel */
4509};
4510
Guido van Rossum73624e91994-10-10 17:59:00 +00004511/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004512 First close the file description. */
4513
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004514static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004515sock_finalize(PySocketSockObject *s)
4516{
4517 SOCKET_T fd;
4518 PyObject *error_type, *error_value, *error_traceback;
4519
4520 /* Save the current exception, if any. */
4521 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4522
Victor Stinnerd3afb622016-07-22 17:47:09 +02004523 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004524 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4525 /* Spurious errors can appear at shutdown */
4526 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4527 PyErr_WriteUnraisable((PyObject *)s);
4528 }
4529 }
4530
4531 /* Only close the socket *after* logging the ResourceWarning warning
4532 to allow the logger to call socket methods like
4533 socket.getsockname(). If the socket is closed before, socket
4534 methods fails with the EBADF error. */
4535 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004536 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004537
4538 /* We do not want to retry upon EINTR: see sock_close() */
4539 Py_BEGIN_ALLOW_THREADS
4540 (void) SOCKETCLOSE(fd);
4541 Py_END_ALLOW_THREADS
4542 }
4543
4544 /* Restore the saved exception. */
4545 PyErr_Restore(error_type, error_value, error_traceback);
4546}
4547
4548static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004549sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004550{
Victor Stinner19a8e842016-03-21 16:36:48 +01004551 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4552 return;
4553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004555}
4556
Guido van Rossum30a685f1991-06-27 15:51:29 +00004557
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004558static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004559sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004560{
Victor Stinnere254e532014-07-26 14:36:55 +02004561 long sock_fd;
4562 /* On Windows, this test is needed because SOCKET_T is unsigned */
4563 if (s->sock_fd == INVALID_SOCKET) {
4564 sock_fd = -1;
4565 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004566#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004567 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 /* this can occur on Win64, and actually there is a special
4569 ugly printf formatter for decimal pointer length integer
4570 printing, only bother if necessary*/
4571 PyErr_SetString(PyExc_OverflowError,
4572 "no printf formatter to display "
4573 "the socket descriptor in decimal");
4574 return NULL;
4575 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004576#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004577 else
4578 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 return PyUnicode_FromFormat(
4580 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004581 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 s->sock_type,
4583 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004584}
4585
4586
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004587/* Create a new, uninitialized socket object. */
4588
4589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004590sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 new = type->tp_alloc(type, 0);
4595 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004596 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004597 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 ((PySocketSockObject *)new)->errorhandler = &set_error;
4599 }
4600 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004601}
4602
4603
4604/* Initialize a new socket object. */
4605
Victor Stinnerdaf45552013-08-28 00:53:59 +02004606#ifdef SOCK_CLOEXEC
4607/* socket() and socketpair() fail with EINVAL on Linux kernel older
4608 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4609static int sock_cloexec_works = -1;
4610#endif
4611
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004612/*ARGSUSED*/
4613static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004614sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 PySocketSockObject *s = (PySocketSockObject *)self;
4617 PyObject *fdobj = NULL;
4618 SOCKET_T fd = INVALID_SOCKET;
4619 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4620 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004621#ifndef MS_WINDOWS
4622#ifdef SOCK_CLOEXEC
4623 int *atomic_flag_works = &sock_cloexec_works;
4624#else
4625 int *atomic_flag_works = NULL;
4626#endif
4627#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4630 "|iiiO:socket", keywords,
4631 &family, &type, &proto, &fdobj))
4632 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004635#ifdef MS_WINDOWS
4636 /* recreate a socket that was duplicated */
4637 if (PyBytes_Check(fdobj)) {
4638 WSAPROTOCOL_INFO info;
4639 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4640 PyErr_Format(PyExc_ValueError,
4641 "socket descriptor string has wrong size, "
4642 "should be %zu bytes.", sizeof(info));
4643 return -1;
4644 }
4645 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4646 Py_BEGIN_ALLOW_THREADS
4647 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4648 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4649 Py_END_ALLOW_THREADS
4650 if (fd == INVALID_SOCKET) {
4651 set_error();
4652 return -1;
4653 }
4654 family = info.iAddressFamily;
4655 type = info.iSocketType;
4656 proto = info.iProtocol;
4657 }
4658 else
4659#endif
4660 {
4661 fd = PyLong_AsSocket_t(fdobj);
4662 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4663 return -1;
4664 if (fd == INVALID_SOCKET) {
4665 PyErr_SetString(PyExc_ValueError,
4666 "can't use invalid socket value");
4667 return -1;
4668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 }
4670 }
4671 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004672#ifdef MS_WINDOWS
4673 /* Windows implementation */
4674#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4675#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4676#endif
4677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004679 if (support_wsa_no_inherit) {
4680 fd = WSASocket(family, type, proto,
4681 NULL, 0,
4682 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4683 if (fd == INVALID_SOCKET) {
4684 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4685 support_wsa_no_inherit = 0;
4686 fd = socket(family, type, proto);
4687 }
4688 }
4689 else {
4690 fd = socket(family, type, proto);
4691 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 if (fd == INVALID_SOCKET) {
4695 set_error();
4696 return -1;
4697 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004698
4699 if (!support_wsa_no_inherit) {
4700 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4701 closesocket(fd);
4702 PyErr_SetFromWindowsErr(0);
4703 return -1;
4704 }
4705 }
4706#else
4707 /* UNIX */
4708 Py_BEGIN_ALLOW_THREADS
4709#ifdef SOCK_CLOEXEC
4710 if (sock_cloexec_works != 0) {
4711 fd = socket(family, type | SOCK_CLOEXEC, proto);
4712 if (sock_cloexec_works == -1) {
4713 if (fd >= 0) {
4714 sock_cloexec_works = 1;
4715 }
4716 else if (errno == EINVAL) {
4717 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4718 sock_cloexec_works = 0;
4719 fd = socket(family, type, proto);
4720 }
4721 }
4722 }
4723 else
4724#endif
4725 {
4726 fd = socket(family, type, proto);
4727 }
4728 Py_END_ALLOW_THREADS
4729
4730 if (fd == INVALID_SOCKET) {
4731 set_error();
4732 return -1;
4733 }
4734
4735 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4736 SOCKETCLOSE(fd);
4737 return -1;
4738 }
4739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004741 if (init_sockobject(s, fd, family, type, proto) == -1) {
4742 SOCKETCLOSE(fd);
4743 return -1;
4744 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004747
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004748}
4749
4750
Guido van Rossumb6775db1994-08-01 11:34:53 +00004751/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004752
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004753static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4755 "_socket.socket", /* tp_name */
4756 sizeof(PySocketSockObject), /* tp_basicsize */
4757 0, /* tp_itemsize */
4758 (destructor)sock_dealloc, /* tp_dealloc */
4759 0, /* tp_print */
4760 0, /* tp_getattr */
4761 0, /* tp_setattr */
4762 0, /* tp_reserved */
4763 (reprfunc)sock_repr, /* tp_repr */
4764 0, /* tp_as_number */
4765 0, /* tp_as_sequence */
4766 0, /* tp_as_mapping */
4767 0, /* tp_hash */
4768 0, /* tp_call */
4769 0, /* tp_str */
4770 PyObject_GenericGetAttr, /* tp_getattro */
4771 0, /* tp_setattro */
4772 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004773 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4774 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 sock_doc, /* tp_doc */
4776 0, /* tp_traverse */
4777 0, /* tp_clear */
4778 0, /* tp_richcompare */
4779 0, /* tp_weaklistoffset */
4780 0, /* tp_iter */
4781 0, /* tp_iternext */
4782 sock_methods, /* tp_methods */
4783 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004784 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 0, /* tp_base */
4786 0, /* tp_dict */
4787 0, /* tp_descr_get */
4788 0, /* tp_descr_set */
4789 0, /* tp_dictoffset */
4790 sock_initobj, /* tp_init */
4791 PyType_GenericAlloc, /* tp_alloc */
4792 sock_new, /* tp_new */
4793 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004794 0, /* tp_is_gc */
4795 0, /* tp_bases */
4796 0, /* tp_mro */
4797 0, /* tp_cache */
4798 0, /* tp_subclasses */
4799 0, /* tp_weaklist */
4800 0, /* tp_del */
4801 0, /* tp_version_tag */
4802 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004803};
4804
Guido van Rossum30a685f1991-06-27 15:51:29 +00004805
Guido van Rossum81194471991-07-27 21:42:02 +00004806/* Python interface to gethostname(). */
4807
4808/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004809static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004810socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004811{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004812#ifdef MS_WINDOWS
4813 /* Don't use winsock's gethostname, as this returns the ANSI
4814 version of the hostname, whereas we need a Unicode string.
4815 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004816 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004817 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004818 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004819 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004820
4821 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004822 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004823
4824 if (GetLastError() != ERROR_MORE_DATA)
4825 return PyErr_SetFromWindowsErr(0);
4826
4827 if (size == 0)
4828 return PyUnicode_New(0, 0);
4829
4830 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4831 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004832 name = PyMem_New(wchar_t, size);
4833 if (!name) {
4834 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004835 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004836 }
Victor Stinner74168972011-11-17 01:11:36 +01004837 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4838 name,
4839 &size))
4840 {
4841 PyMem_Free(name);
4842 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004843 }
Victor Stinner74168972011-11-17 01:11:36 +01004844
4845 result = PyUnicode_FromWideChar(name, size);
4846 PyMem_Free(name);
4847 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004848#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 char buf[1024];
4850 int res;
4851 Py_BEGIN_ALLOW_THREADS
4852 res = gethostname(buf, (int) sizeof buf - 1);
4853 Py_END_ALLOW_THREADS
4854 if (res < 0)
4855 return set_error();
4856 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004857 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004858#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004859}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004861PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004862"gethostname() -> string\n\
4863\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004864Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004865
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004866#ifdef HAVE_SETHOSTNAME
4867PyDoc_STRVAR(sethostname_doc,
4868"sethostname(name)\n\n\
4869Sets the hostname to name.");
4870
4871static PyObject *
4872socket_sethostname(PyObject *self, PyObject *args)
4873{
4874 PyObject *hnobj;
4875 Py_buffer buf;
4876 int res, flag = 0;
4877
Christian Heimesd2774c72013-06-19 02:06:29 +02004878#ifdef _AIX
4879/* issue #18259, not declared in any useful header file */
4880extern int sethostname(const char *, size_t);
4881#endif
4882
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004883 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4884 PyErr_Clear();
4885 if (!PyArg_ParseTuple(args, "O&:sethostname",
4886 PyUnicode_FSConverter, &hnobj))
4887 return NULL;
4888 flag = 1;
4889 }
4890 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4891 if (!res) {
4892 res = sethostname(buf.buf, buf.len);
4893 PyBuffer_Release(&buf);
4894 }
4895 if (flag)
4896 Py_DECREF(hnobj);
4897 if (res)
4898 return set_error();
4899 Py_RETURN_NONE;
4900}
4901#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004902
Guido van Rossum30a685f1991-06-27 15:51:29 +00004903/* Python interface to gethostbyname(name). */
4904
4905/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004906static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004907socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 char *name;
4910 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004911 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004912
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004913 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 return NULL;
4915 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004916 goto finally;
4917 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4918finally:
4919 PyMem_Free(name);
4920 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004921}
4922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004923PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004924"gethostbyname(host) -> address\n\
4925\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004926Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004927
4928
Victor Stinner72400302016-01-28 15:41:01 +01004929static PyObject*
4930sock_decode_hostname(const char *name)
4931{
4932#ifdef MS_WINDOWS
4933 /* Issue #26227: gethostbyaddr() returns a string encoded
4934 * to the ANSI code page */
4935 return PyUnicode_DecodeFSDefault(name);
4936#else
4937 /* Decode from UTF-8 */
4938 return PyUnicode_FromString(name);
4939#endif
4940}
4941
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004942/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4943
4944static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004945gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 char **pch;
4948 PyObject *rtn_tuple = (PyObject *)NULL;
4949 PyObject *name_list = (PyObject *)NULL;
4950 PyObject *addr_list = (PyObject *)NULL;
4951 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004952 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 if (h == NULL) {
4955 /* Let's get real error message to return */
4956 set_herror(h_errno);
4957 return NULL;
4958 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 if (h->h_addrtype != af) {
4961 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004962 errno = EAFNOSUPPORT;
4963 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 return NULL;
4965 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 case AF_INET:
4970 if (alen < sizeof(struct sockaddr_in))
4971 return NULL;
4972 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004973
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004974#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 case AF_INET6:
4976 if (alen < sizeof(struct sockaddr_in6))
4977 return NULL;
4978 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004979#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 if ((name_list = PyList_New(0)) == NULL)
4984 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 if ((addr_list = PyList_New(0)) == NULL)
4987 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 /* SF #1511317: h_aliases can be NULL */
4990 if (h->h_aliases) {
4991 for (pch = h->h_aliases; *pch != NULL; pch++) {
4992 int status;
4993 tmp = PyUnicode_FromString(*pch);
4994 if (tmp == NULL)
4995 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 status = PyList_Append(name_list, tmp);
4998 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005000 if (status)
5001 goto err;
5002 }
5003 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5006 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 case AF_INET:
5011 {
5012 struct sockaddr_in sin;
5013 memset(&sin, 0, sizeof(sin));
5014 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005015#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5019 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 if (pch == h->h_addr_list && alen >= sizeof(sin))
5022 memcpy((char *) addr, &sin, sizeof(sin));
5023 break;
5024 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005025
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005026#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 case AF_INET6:
5028 {
5029 struct sockaddr_in6 sin6;
5030 memset(&sin6, 0, sizeof(sin6));
5031 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005032#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5036 tmp = makeipaddr((struct sockaddr *)&sin6,
5037 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5040 memcpy((char *) addr, &sin6, sizeof(sin6));
5041 break;
5042 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005043#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005046 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 "unsupported address family");
5048 return NULL;
5049 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 if (tmp == NULL)
5052 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 status = PyList_Append(addr_list, tmp);
5055 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 if (status)
5058 goto err;
5059 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005060
Victor Stinner72400302016-01-28 15:41:01 +01005061 name = sock_decode_hostname(h->h_name);
5062 if (name == NULL)
5063 goto err;
5064 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005065
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005066 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 Py_XDECREF(name_list);
5068 Py_XDECREF(addr_list);
5069 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005070}
5071
5072
5073/* Python interface to gethostbyname_ex(name). */
5074
5075/*ARGSUSED*/
5076static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005077socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005078{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 char *name;
5080 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005081 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005083 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005084#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005086#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005088#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 char buf[16384];
5090 int buf_len = (sizeof buf) - 1;
5091 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005092#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005093#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005095#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005096#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005097
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005098 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005100 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005101 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005103#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005104#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005105 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005107#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005109#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 memset((void *) &data, '\0', sizeof(data));
5111 result = gethostbyname_r(name, &hp_allocated, &data);
5112 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005113#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005114#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005115#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005119#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 Py_END_ALLOW_THREADS
5121 /* Some C libraries would require addr.__ss_family instead of
5122 addr.ss_family.
5123 Therefore, we cast the sockaddr_storage into sockaddr to
5124 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005125 sa = SAS2SA(&addr);
5126 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005128#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005130#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005131finally:
5132 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005134}
5135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005136PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005137"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5138\n\
5139Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005140for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005141
5142
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005143/* Python interface to gethostbyaddr(IP). */
5144
5145/*ARGSUSED*/
5146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005147socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005148{
Charles-François Natali8b759652011-12-23 16:44:51 +01005149 sock_addr_t addr;
5150 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 char *ip_num;
5152 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005153 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005154#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005156#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005158#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 /* glibcs up to 2.10 assume that the buf argument to
5160 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5161 does not ensure. The attribute below instructs the compiler
5162 to maintain this alignment. */
5163 char buf[16384] Py_ALIGNED(8);
5164 int buf_len = (sizeof buf) - 1;
5165 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005166#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005167#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005169#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005170#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 char *ap;
5172 int al;
5173 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005174
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005175 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 return NULL;
5177 af = AF_UNSPEC;
5178 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005179 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 af = sa->sa_family;
5181 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005182 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 switch (af) {
5184 case AF_INET:
5185 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5186 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5187 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005188#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 case AF_INET6:
5190 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5191 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5192 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005195 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005196 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 }
5198 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005199#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005200#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005201 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 &hp_allocated, buf, buf_len,
5203 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005204#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 h = gethostbyaddr_r(ap, al, af,
5206 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005207#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 memset((void *) &data, '\0', sizeof(data));
5209 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5210 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005211#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005212#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005213#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005217#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005219 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005220#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005222#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005223finally:
5224 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005226}
5227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005228PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005229"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5230\n\
5231Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005232for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005233
Guido van Rossum30a685f1991-06-27 15:51:29 +00005234
5235/* Python interface to getservbyname(name).
5236 This only returns the port number, since the other info is already
5237 known or not useful (like the list of aliases). */
5238
5239/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005240static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005241socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 char *name, *proto=NULL;
5244 struct servent *sp;
5245 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5246 return NULL;
5247 Py_BEGIN_ALLOW_THREADS
5248 sp = getservbyname(name, proto);
5249 Py_END_ALLOW_THREADS
5250 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005251 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 return NULL;
5253 }
5254 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005255}
5256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005257PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005258"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005259\n\
5260Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005261The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5262otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005263
Guido van Rossum30a685f1991-06-27 15:51:29 +00005264
Barry Warsaw11b91a02004-06-28 00:50:43 +00005265/* Python interface to getservbyport(port).
5266 This only returns the service name, since the other info is already
5267 known or not useful (like the list of aliases). */
5268
5269/*ARGSUSED*/
5270static PyObject *
5271socket_getservbyport(PyObject *self, PyObject *args)
5272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 int port;
5274 char *proto=NULL;
5275 struct servent *sp;
5276 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5277 return NULL;
5278 if (port < 0 || port > 0xffff) {
5279 PyErr_SetString(
5280 PyExc_OverflowError,
5281 "getservbyport: port must be 0-65535.");
5282 return NULL;
5283 }
5284 Py_BEGIN_ALLOW_THREADS
5285 sp = getservbyport(htons((short)port), proto);
5286 Py_END_ALLOW_THREADS
5287 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005288 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 return NULL;
5290 }
5291 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005292}
5293
5294PyDoc_STRVAR(getservbyport_doc,
5295"getservbyport(port[, protocolname]) -> string\n\
5296\n\
5297Return the service name from a port number and protocol name.\n\
5298The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5299otherwise any protocol will match.");
5300
Guido van Rossum3901d851996-12-19 16:35:04 +00005301/* Python interface to getprotobyname(name).
5302 This only returns the protocol number, since the other info is
5303 already known or not useful (like the list of aliases). */
5304
5305/*ARGSUSED*/
5306static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005307socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 char *name;
5310 struct protoent *sp;
5311 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5312 return NULL;
5313 Py_BEGIN_ALLOW_THREADS
5314 sp = getprotobyname(name);
5315 Py_END_ALLOW_THREADS
5316 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005317 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 return NULL;
5319 }
5320 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005321}
5322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005323PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005324"getprotobyname(name) -> integer\n\
5325\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005326Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005327
Guido van Rossum3901d851996-12-19 16:35:04 +00005328
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005329#ifndef NO_DUP
5330/* dup() function for socket fds */
5331
5332static PyObject *
5333socket_dup(PyObject *self, PyObject *fdobj)
5334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 SOCKET_T fd, newfd;
5336 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005337#ifdef MS_WINDOWS
5338 WSAPROTOCOL_INFO info;
5339#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 fd = PyLong_AsSocket_t(fdobj);
5342 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5343 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005344
Victor Stinnerdaf45552013-08-28 00:53:59 +02005345#ifdef MS_WINDOWS
5346 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5347 return set_error();
5348
5349 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5350 FROM_PROTOCOL_INFO,
5351 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 if (newfd == INVALID_SOCKET)
5353 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005354
Victor Stinnerdaf45552013-08-28 00:53:59 +02005355 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5356 closesocket(newfd);
5357 PyErr_SetFromWindowsErr(0);
5358 return NULL;
5359 }
5360#else
5361 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5362 newfd = _Py_dup(fd);
5363 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005364 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005365#endif
5366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 newfdobj = PyLong_FromSocket_t(newfd);
5368 if (newfdobj == NULL)
5369 SOCKETCLOSE(newfd);
5370 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005371}
5372
5373PyDoc_STRVAR(dup_doc,
5374"dup(integer) -> integer\n\
5375\n\
5376Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5377sockets; on some platforms os.dup() won't work for socket file descriptors.");
5378#endif
5379
5380
Dave Cole331708b2004-08-09 04:51:41 +00005381#ifdef HAVE_SOCKETPAIR
5382/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005383 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005384 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005385
5386/*ARGSUSED*/
5387static PyObject *
5388socket_socketpair(PyObject *self, PyObject *args)
5389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 PySocketSockObject *s0 = NULL, *s1 = NULL;
5391 SOCKET_T sv[2];
5392 int family, type = SOCK_STREAM, proto = 0;
5393 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005394#ifdef SOCK_CLOEXEC
5395 int *atomic_flag_works = &sock_cloexec_works;
5396#else
5397 int *atomic_flag_works = NULL;
5398#endif
5399 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005400
5401#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005403#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5407 &family, &type, &proto))
5408 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005411 Py_BEGIN_ALLOW_THREADS
5412#ifdef SOCK_CLOEXEC
5413 if (sock_cloexec_works != 0) {
5414 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5415 if (sock_cloexec_works == -1) {
5416 if (ret >= 0) {
5417 sock_cloexec_works = 1;
5418 }
5419 else if (errno == EINVAL) {
5420 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5421 sock_cloexec_works = 0;
5422 ret = socketpair(family, type, proto, sv);
5423 }
5424 }
5425 }
5426 else
5427#endif
5428 {
5429 ret = socketpair(family, type, proto, sv);
5430 }
5431 Py_END_ALLOW_THREADS
5432
5433 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005435
5436 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5437 goto finally;
5438 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5439 goto finally;
5440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 s0 = new_sockobject(sv[0], family, type, proto);
5442 if (s0 == NULL)
5443 goto finally;
5444 s1 = new_sockobject(sv[1], family, type, proto);
5445 if (s1 == NULL)
5446 goto finally;
5447 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005448
5449finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 if (res == NULL) {
5451 if (s0 == NULL)
5452 SOCKETCLOSE(sv[0]);
5453 if (s1 == NULL)
5454 SOCKETCLOSE(sv[1]);
5455 }
5456 Py_XDECREF(s0);
5457 Py_XDECREF(s1);
5458 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005459}
5460
5461PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005462"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005463\n\
5464Create a pair of socket objects from the sockets returned by the platform\n\
5465socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005466The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005467AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005468
5469#endif /* HAVE_SOCKETPAIR */
5470
5471
Guido van Rossum006bf911996-06-12 04:04:55 +00005472static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005473socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5478 return NULL;
5479 }
5480 if (x1 < 0) {
5481 PyErr_SetString(PyExc_OverflowError,
5482 "can't convert negative number to unsigned long");
5483 return NULL;
5484 }
5485 x2 = (unsigned int)ntohs((unsigned short)x1);
5486 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005487}
5488
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005489PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005490"ntohs(integer) -> integer\n\
5491\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005492Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005493
5494
Guido van Rossum006bf911996-06-12 04:04:55 +00005495static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005496socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 if (PyLong_Check(arg)) {
5501 x = PyLong_AsUnsignedLong(arg);
5502 if (x == (unsigned long) -1 && PyErr_Occurred())
5503 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005504#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 {
5506 unsigned long y;
5507 /* only want the trailing 32 bits */
5508 y = x & 0xFFFFFFFFUL;
5509 if (y ^ x)
5510 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005511 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 x = y;
5513 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 }
5516 else
5517 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005518 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005521}
5522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005523PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005524"ntohl(integer) -> integer\n\
5525\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005526Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005527
5528
Guido van Rossum006bf911996-06-12 04:04:55 +00005529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005530socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5535 return NULL;
5536 }
5537 if (x1 < 0) {
5538 PyErr_SetString(PyExc_OverflowError,
5539 "can't convert negative number to unsigned long");
5540 return NULL;
5541 }
5542 x2 = (unsigned int)htons((unsigned short)x1);
5543 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005544}
5545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005546PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005547"htons(integer) -> integer\n\
5548\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005549Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005550
5551
Guido van Rossum006bf911996-06-12 04:04:55 +00005552static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005553socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 if (PyLong_Check(arg)) {
5558 x = PyLong_AsUnsignedLong(arg);
5559 if (x == (unsigned long) -1 && PyErr_Occurred())
5560 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005561#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 {
5563 unsigned long y;
5564 /* only want the trailing 32 bits */
5565 y = x & 0xFFFFFFFFUL;
5566 if (y ^ x)
5567 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005568 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 x = y;
5570 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 }
5573 else
5574 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005575 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 Py_TYPE(arg)->tp_name);
5577 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005578}
5579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005580PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005581"htonl(integer) -> integer\n\
5582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005583Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005584
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005585/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005586
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005587PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005588"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005589\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005590Convert 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 +00005591binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005592
5593static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005594socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005595{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005596#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005598#endif
5599
5600#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005601#if (SIZEOF_INT != 4)
5602#error "Not sure if in_addr_t exists and int is not 32-bits."
5603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 /* Have to use inet_addr() instead */
5605 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5610 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005611
Tim Peters1df9fdd2003-02-13 03:13:40 +00005612
5613#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005614
5615#ifdef USE_INET_ATON_WEAKLINK
5616 if (inet_aton != NULL) {
5617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 if (inet_aton(ip_addr, &buf))
5619 return PyBytes_FromStringAndSize((char *)(&buf),
5620 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005621
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;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005625
Thomas Wouters477c8d52006-05-27 19:21:47 +00005626#ifdef USE_INET_ATON_WEAKLINK
5627 } else {
5628#endif
5629
5630#endif
5631
5632#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 /* special-case this address as inet_addr might return INADDR_NONE
5635 * for this */
5636 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005637 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005643 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 "illegal IP address string passed to inet_aton");
5645 return NULL;
5646 }
5647 }
5648 return PyBytes_FromStringAndSize((char *) &packed_addr,
5649 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005650
5651#ifdef USE_INET_ATON_WEAKLINK
5652 }
5653#endif
5654
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005655#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005656}
5657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005658PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005659"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005660\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005661Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005662
5663static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005664socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005665{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005666 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005668
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005669 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 return NULL;
5671 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005672
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005673 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005674 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005676 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 return NULL;
5678 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005679
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005680 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5681 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005684}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005685
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005686#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005687
5688PyDoc_STRVAR(inet_pton_doc,
5689"inet_pton(af, ip) -> packed IP address string\n\
5690\n\
5691Convert an IP address from string format to a packed string suitable\n\
5692for use with low-level network functions.");
5693
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005694#endif
5695
5696#ifdef HAVE_INET_PTON
5697
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005698static PyObject *
5699socket_inet_pton(PyObject *self, PyObject *args)
5700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 int af;
5702 char* ip;
5703 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005704#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005705 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5710 return NULL;
5711 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005712
Martin v. Löwis04697e82004-06-02 12:35:29 +00005713#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005715 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 "can't use AF_INET6, IPv6 is disabled");
5717 return NULL;
5718 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005719#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 retval = inet_pton(af, ip, packed);
5722 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005723 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 return NULL;
5725 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005726 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 "illegal IP address string passed to inet_pton");
5728 return NULL;
5729 } else if (af == AF_INET) {
5730 return PyBytes_FromStringAndSize(packed,
5731 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005732#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 } else if (af == AF_INET6) {
5734 return PyBytes_FromStringAndSize(packed,
5735 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005738 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 return NULL;
5740 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005741}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005742#elif defined(MS_WINDOWS)
5743
5744static PyObject *
5745socket_inet_pton(PyObject *self, PyObject *args)
5746{
5747 int af;
5748 char* ip;
5749 struct sockaddr_in6 addr;
5750 INT ret, size;
5751
5752 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5753 return NULL;
5754 }
5755
Victor Stinnere990c6e2013-11-16 00:18:58 +01005756 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005757 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5758
5759 if (ret) {
5760 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5761 return NULL;
5762 } else if(af == AF_INET) {
5763 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005764 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005765 sizeof(addr4->sin_addr));
5766 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005767 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005768 sizeof(addr.sin6_addr));
5769 } else {
5770 PyErr_SetString(PyExc_OSError, "unknown address family");
5771 return NULL;
5772 }
5773}
5774
5775#endif
5776
5777#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005778
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005779PyDoc_STRVAR(inet_ntop_doc,
5780"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5781\n\
5782Convert a packed IP address of the given family to string format.");
5783
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005784#endif
5785
5786
5787#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005788static PyObject *
5789socket_inet_ntop(PyObject *self, PyObject *args)
5790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005792 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005794#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005795 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005796#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005798#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5801 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005802
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005803 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 return NULL;
5805 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005808 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 PyErr_SetString(PyExc_ValueError,
5810 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005811 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 return NULL;
5813 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005814#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005816 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 PyErr_SetString(PyExc_ValueError,
5818 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005819 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 return NULL;
5821 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 } else {
5824 PyErr_Format(PyExc_ValueError,
5825 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005826 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 return NULL;
5828 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005829
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005830 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5831 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005833 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 } else {
5836 return PyUnicode_FromString(retval);
5837 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005838}
5839
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005840#elif defined(MS_WINDOWS)
5841
5842static PyObject *
5843socket_inet_ntop(PyObject *self, PyObject *args)
5844{
5845 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005846 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005847 struct sockaddr_in6 addr;
5848 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005849#ifdef ENABLE_IPV6
5850 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5851#else
5852 char ip[INET_ADDRSTRLEN + 1];
5853#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005854
5855 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5856 memset((void *) &ip[0], '\0', sizeof(ip));
5857
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005858 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005859 return NULL;
5860 }
5861
5862 if (af == AF_INET) {
5863 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5864
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005865 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005866 PyErr_SetString(PyExc_ValueError,
5867 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005868 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005869 return NULL;
5870 }
5871 memset(addr4, 0, sizeof(struct sockaddr_in));
5872 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005873 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005874 addrlen = sizeof(struct sockaddr_in);
5875 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005876 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005877 PyErr_SetString(PyExc_ValueError,
5878 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005879 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005880 return NULL;
5881 }
5882
5883 memset(&addr, 0, sizeof(addr));
5884 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005885 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005886 addrlen = sizeof(addr);
5887 } else {
5888 PyErr_Format(PyExc_ValueError,
5889 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005890 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005891 return NULL;
5892 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005893 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005894
5895 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005896 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005897 ip, &retlen);
5898
5899 if (ret) {
5900 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5901 return NULL;
5902 } else {
5903 return PyUnicode_FromString(ip);
5904 }
5905}
5906
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005907#endif /* HAVE_INET_PTON */
5908
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005909/* Python interface to getaddrinfo(host, port). */
5910
5911/*ARGSUSED*/
5912static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005913socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005914{
Victor Stinner77af1722011-05-26 14:05:59 +02005915 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005916 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 struct addrinfo hints, *res;
5918 struct addrinfo *res0 = NULL;
5919 PyObject *hobj = NULL;
5920 PyObject *pobj = (PyObject *)NULL;
5921 char pbuf[30];
5922 char *hptr, *pptr;
5923 int family, socktype, protocol, flags;
5924 int error;
5925 PyObject *all = (PyObject *)NULL;
5926 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005927
Georg Brandl6083a4b2013-10-14 06:51:46 +02005928 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005930 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005931 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 &protocol, &flags)) {
5933 return NULL;
5934 }
5935 if (hobj == Py_None) {
5936 hptr = NULL;
5937 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005938 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 if (!idna)
5940 return NULL;
5941 assert(PyBytes_Check(idna));
5942 hptr = PyBytes_AS_STRING(idna);
5943 } else if (PyBytes_Check(hobj)) {
5944 hptr = PyBytes_AsString(hobj);
5945 } else {
5946 PyErr_SetString(PyExc_TypeError,
5947 "getaddrinfo() argument 1 must be string or None");
5948 return NULL;
5949 }
5950 if (PyLong_CheckExact(pobj)) {
5951 long value = PyLong_AsLong(pobj);
5952 if (value == -1 && PyErr_Occurred())
5953 goto err;
5954 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5955 pptr = pbuf;
5956 } else if (PyUnicode_Check(pobj)) {
5957 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005958 if (pptr == NULL)
5959 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005961 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 } else if (pobj == Py_None) {
5963 pptr = (char *)NULL;
5964 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005965 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 goto err;
5967 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005968#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005969 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5970 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005971 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5972 * This workaround avoids a segfault in libsystem.
5973 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005974 pptr = "00";
5975 }
5976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 memset(&hints, 0, sizeof(hints));
5978 hints.ai_family = family;
5979 hints.ai_socktype = socktype;
5980 hints.ai_protocol = protocol;
5981 hints.ai_flags = flags;
5982 Py_BEGIN_ALLOW_THREADS
5983 ACQUIRE_GETADDRINFO_LOCK
5984 error = getaddrinfo(hptr, pptr, &hints, &res0);
5985 Py_END_ALLOW_THREADS
5986 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5987 if (error) {
5988 set_gaierror(error);
5989 goto err;
5990 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005991
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005992 all = PyList_New(0);
5993 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 goto err;
5995 for (res = res0; res; res = res->ai_next) {
5996 PyObject *single;
5997 PyObject *addr =
5998 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5999 if (addr == NULL)
6000 goto err;
6001 single = Py_BuildValue("iiisO", res->ai_family,
6002 res->ai_socktype, res->ai_protocol,
6003 res->ai_canonname ? res->ai_canonname : "",
6004 addr);
6005 Py_DECREF(addr);
6006 if (single == NULL)
6007 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 if (PyList_Append(all, single))
6010 goto err;
6011 Py_XDECREF(single);
6012 }
6013 Py_XDECREF(idna);
6014 if (res0)
6015 freeaddrinfo(res0);
6016 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006017 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 Py_XDECREF(all);
6019 Py_XDECREF(idna);
6020 if (res0)
6021 freeaddrinfo(res0);
6022 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006023}
6024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006025PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006026"getaddrinfo(host, port [, family, type, proto, flags])\n\
6027 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006028\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006029Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006030
6031/* Python interface to getnameinfo(sa, flags). */
6032
6033/*ARGSUSED*/
6034static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006035socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 PyObject *sa = (PyObject *)NULL;
6038 int flags;
6039 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006040 int port;
6041 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6043 struct addrinfo hints, *res = NULL;
6044 int error;
6045 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006046 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 flags = flowinfo = scope_id = 0;
6049 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6050 return NULL;
6051 if (!PyTuple_Check(sa)) {
6052 PyErr_SetString(PyExc_TypeError,
6053 "getnameinfo() argument 1 must be a tuple");
6054 return NULL;
6055 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006056 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 &hostp, &port, &flowinfo, &scope_id))
6058 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006059 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006060 PyErr_SetString(PyExc_OverflowError,
6061 "getsockaddrarg: flowinfo must be 0-1048575.");
6062 return NULL;
6063 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6065 memset(&hints, 0, sizeof(hints));
6066 hints.ai_family = AF_UNSPEC;
6067 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006068 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 Py_BEGIN_ALLOW_THREADS
6070 ACQUIRE_GETADDRINFO_LOCK
6071 error = getaddrinfo(hostp, pbuf, &hints, &res);
6072 Py_END_ALLOW_THREADS
6073 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6074 if (error) {
6075 set_gaierror(error);
6076 goto fail;
6077 }
6078 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006079 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 "sockaddr resolved to multiple addresses");
6081 goto fail;
6082 }
6083 switch (res->ai_family) {
6084 case AF_INET:
6085 {
6086 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006087 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 "IPv4 sockaddr must be 2 tuple");
6089 goto fail;
6090 }
6091 break;
6092 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006093#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 case AF_INET6:
6095 {
6096 struct sockaddr_in6 *sin6;
6097 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006098 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 sin6->sin6_scope_id = scope_id;
6100 break;
6101 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006104 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6106 if (error) {
6107 set_gaierror(error);
6108 goto fail;
6109 }
Victor Stinner72400302016-01-28 15:41:01 +01006110
6111 name = sock_decode_hostname(hbuf);
6112 if (name == NULL)
6113 goto fail;
6114 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006115
6116fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 if (res)
6118 freeaddrinfo(res);
6119 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006120}
6121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006122PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006123"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006124\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006125Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006126
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006127
6128/* Python API to getting and setting the default timeout value. */
6129
6130static PyObject *
6131socket_getdefaulttimeout(PyObject *self)
6132{
Victor Stinner71694d52015-03-28 01:18:54 +01006133 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 Py_INCREF(Py_None);
6135 return Py_None;
6136 }
Victor Stinner71694d52015-03-28 01:18:54 +01006137 else {
6138 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6139 return PyFloat_FromDouble(seconds);
6140 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006141}
6142
6143PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006144"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006145\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006146Returns 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
6150static PyObject *
6151socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6152{
Victor Stinner71694d52015-03-28 01:18:54 +01006153 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006154
Victor Stinner71694d52015-03-28 01:18:54 +01006155 if (socket_parse_timeout(&timeout, arg) < 0)
6156 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 Py_INCREF(Py_None);
6161 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006162}
6163
6164PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006165"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006166\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006167Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006168A value of None indicates that new socket objects have no timeout.\n\
6169When the socket module is first imported, the default is None.");
6170
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006171#ifdef HAVE_IF_NAMEINDEX
6172/* Python API for getting interface indices and names */
6173
6174static PyObject *
6175socket_if_nameindex(PyObject *self, PyObject *arg)
6176{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006177 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006178 int i;
6179 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006180
Charles-François Natali60713592011-05-20 16:55:06 +02006181 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006182 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006183 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006184 return NULL;
6185 }
6186
6187 list = PyList_New(0);
6188 if (list == NULL) {
6189 if_freenameindex(ni);
6190 return NULL;
6191 }
6192
Charles-François Natali60713592011-05-20 16:55:06 +02006193 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6194 PyObject *ni_tuple = Py_BuildValue("IO&",
6195 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006196
6197 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6198 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006199 Py_DECREF(list);
6200 if_freenameindex(ni);
6201 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006202 }
6203 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006204 }
6205
6206 if_freenameindex(ni);
6207 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006208}
6209
6210PyDoc_STRVAR(if_nameindex_doc,
6211"if_nameindex()\n\
6212\n\
6213Returns a list of network interface information (index, name) tuples.");
6214
Charles-François Natali60713592011-05-20 16:55:06 +02006215static PyObject *
6216socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006217{
Charles-François Natali60713592011-05-20 16:55:06 +02006218 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006219 unsigned long index;
6220
Charles-François Natali60713592011-05-20 16:55:06 +02006221 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6222 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006223 return NULL;
6224
Charles-François Natali60713592011-05-20 16:55:06 +02006225 index = if_nametoindex(PyBytes_AS_STRING(oname));
6226 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006227 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006228 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006229 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006230 return NULL;
6231 }
6232
6233 return PyLong_FromUnsignedLong(index);
6234}
6235
6236PyDoc_STRVAR(if_nametoindex_doc,
6237"if_nametoindex(if_name)\n\
6238\n\
6239Returns the interface index corresponding to the interface name if_name.");
6240
Charles-François Natali60713592011-05-20 16:55:06 +02006241static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006242socket_if_indextoname(PyObject *self, PyObject *arg)
6243{
Charles-François Natali60713592011-05-20 16:55:06 +02006244 unsigned long index;
6245 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006246
Charles-François Natali60713592011-05-20 16:55:06 +02006247 index = PyLong_AsUnsignedLong(arg);
6248 if (index == (unsigned long) -1)
6249 return NULL;
6250
6251 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006252 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006253 return NULL;
6254 }
6255
Charles-François Natali60713592011-05-20 16:55:06 +02006256 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006257}
6258
6259PyDoc_STRVAR(if_indextoname_doc,
6260"if_indextoname(if_index)\n\
6261\n\
6262Returns the interface name corresponding to the interface index if_index.");
6263
6264#endif /* HAVE_IF_NAMEINDEX */
6265
6266
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006267#ifdef CMSG_LEN
6268/* Python interface to CMSG_LEN(length). */
6269
6270static PyObject *
6271socket_CMSG_LEN(PyObject *self, PyObject *args)
6272{
6273 Py_ssize_t length;
6274 size_t result;
6275
6276 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6277 return NULL;
6278 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6279 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6280 return NULL;
6281 }
6282 return PyLong_FromSize_t(result);
6283}
6284
6285PyDoc_STRVAR(CMSG_LEN_doc,
6286"CMSG_LEN(length) -> control message length\n\
6287\n\
6288Return the total length, without trailing padding, of an ancillary\n\
6289data item with associated data of the given length. This value can\n\
6290often be used as the buffer size for recvmsg() to receive a single\n\
6291item of ancillary data, but RFC 3542 requires portable applications to\n\
6292use CMSG_SPACE() and thus include space for padding, even when the\n\
6293item will be the last in the buffer. Raises OverflowError if length\n\
6294is outside the permissible range of values.");
6295
6296
6297#ifdef CMSG_SPACE
6298/* Python interface to CMSG_SPACE(length). */
6299
6300static PyObject *
6301socket_CMSG_SPACE(PyObject *self, PyObject *args)
6302{
6303 Py_ssize_t length;
6304 size_t result;
6305
6306 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6307 return NULL;
6308 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6309 PyErr_SetString(PyExc_OverflowError,
6310 "CMSG_SPACE() argument out of range");
6311 return NULL;
6312 }
6313 return PyLong_FromSize_t(result);
6314}
6315
6316PyDoc_STRVAR(CMSG_SPACE_doc,
6317"CMSG_SPACE(length) -> buffer size\n\
6318\n\
6319Return the buffer size needed for recvmsg() to receive an ancillary\n\
6320data item with associated data of the given length, along with any\n\
6321trailing padding. The buffer space needed to receive multiple items\n\
6322is the sum of the CMSG_SPACE() values for their associated data\n\
6323lengths. Raises OverflowError if length is outside the permissible\n\
6324range of values.");
6325#endif /* CMSG_SPACE */
6326#endif /* CMSG_LEN */
6327
6328
Guido van Rossum30a685f1991-06-27 15:51:29 +00006329/* List of functions exported by this module. */
6330
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006331static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 {"gethostbyname", socket_gethostbyname,
6333 METH_VARARGS, gethostbyname_doc},
6334 {"gethostbyname_ex", socket_gethostbyname_ex,
6335 METH_VARARGS, ghbn_ex_doc},
6336 {"gethostbyaddr", socket_gethostbyaddr,
6337 METH_VARARGS, gethostbyaddr_doc},
6338 {"gethostname", socket_gethostname,
6339 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006340#ifdef HAVE_SETHOSTNAME
6341 {"sethostname", socket_sethostname,
6342 METH_VARARGS, sethostname_doc},
6343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 {"getservbyname", socket_getservbyname,
6345 METH_VARARGS, getservbyname_doc},
6346 {"getservbyport", socket_getservbyport,
6347 METH_VARARGS, getservbyport_doc},
6348 {"getprotobyname", socket_getprotobyname,
6349 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006350#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351 {"dup", socket_dup,
6352 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006353#endif
Dave Cole331708b2004-08-09 04:51:41 +00006354#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 {"socketpair", socket_socketpair,
6356 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 {"ntohs", socket_ntohs,
6359 METH_VARARGS, ntohs_doc},
6360 {"ntohl", socket_ntohl,
6361 METH_O, ntohl_doc},
6362 {"htons", socket_htons,
6363 METH_VARARGS, htons_doc},
6364 {"htonl", socket_htonl,
6365 METH_O, htonl_doc},
6366 {"inet_aton", socket_inet_aton,
6367 METH_VARARGS, inet_aton_doc},
6368 {"inet_ntoa", socket_inet_ntoa,
6369 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006370#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 {"inet_pton", socket_inet_pton,
6372 METH_VARARGS, inet_pton_doc},
6373 {"inet_ntop", socket_inet_ntop,
6374 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006375#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006376 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6377 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 {"getnameinfo", socket_getnameinfo,
6379 METH_VARARGS, getnameinfo_doc},
6380 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6381 METH_NOARGS, getdefaulttimeout_doc},
6382 {"setdefaulttimeout", socket_setdefaulttimeout,
6383 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006384#ifdef HAVE_IF_NAMEINDEX
6385 {"if_nameindex", socket_if_nameindex,
6386 METH_NOARGS, if_nameindex_doc},
6387 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006388 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006389 {"if_indextoname", socket_if_indextoname,
6390 METH_O, if_indextoname_doc},
6391#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006392#ifdef CMSG_LEN
6393 {"CMSG_LEN", socket_CMSG_LEN,
6394 METH_VARARGS, CMSG_LEN_doc},
6395#ifdef CMSG_SPACE
6396 {"CMSG_SPACE", socket_CMSG_SPACE,
6397 METH_VARARGS, CMSG_SPACE_doc},
6398#endif
6399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006401};
6402
Guido van Rossum30a685f1991-06-27 15:51:29 +00006403
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006404#ifdef MS_WINDOWS
6405#define OS_INIT_DEFINED
6406
6407/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006408
6409static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006410os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006413}
6414
6415static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006416os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 WSADATA WSAData;
6419 int ret;
6420 ret = WSAStartup(0x0101, &WSAData);
6421 switch (ret) {
6422 case 0: /* No error */
6423 Py_AtExit(os_cleanup);
6424 return 1; /* Success */
6425 case WSASYSNOTREADY:
6426 PyErr_SetString(PyExc_ImportError,
6427 "WSAStartup failed: network not ready");
6428 break;
6429 case WSAVERNOTSUPPORTED:
6430 case WSAEINVAL:
6431 PyErr_SetString(
6432 PyExc_ImportError,
6433 "WSAStartup failed: requested version not supported");
6434 break;
6435 default:
6436 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6437 break;
6438 }
6439 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006440}
6441
Guido van Rossum8d665e61996-06-26 18:22:49 +00006442#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006443
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006445
6446#ifndef OS_INIT_DEFINED
6447static int
6448os_init(void)
6449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006451}
6452#endif
6453
6454
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006455/* C API table - always add new things to the end for binary
6456 compatibility. */
6457static
6458PySocketModule_APIObject PySocketModuleAPI =
6459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006461 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006463};
6464
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006465
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006466/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006467
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006468 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006469 "socket.py" which implements some additional functionality.
6470 The import of "_socket" may fail with an ImportError exception if
6471 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006472 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006473 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006474*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006475
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006476PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006477"Implementation module for socket operations.\n\
6478\n\
6479See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006480
Martin v. Löwis1a214512008-06-11 05:26:20 +00006481static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModuleDef_HEAD_INIT,
6483 PySocket_MODULE_NAME,
6484 socket_doc,
6485 -1,
6486 socket_methods,
6487 NULL,
6488 NULL,
6489 NULL,
6490 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006491};
6492
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006493PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006494PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498 if (!os_init())
6499 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006500
Victor Stinnerdaf45552013-08-28 00:53:59 +02006501#ifdef MS_WINDOWS
6502 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006503#if defined(_MSC_VER) && _MSC_VER >= 1800
6504 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6505#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006506 DWORD version = GetVersion();
6507 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6508 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6509 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006510 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6511#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006512 }
6513#endif
6514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 Py_TYPE(&sock_type) = &PyType_Type;
6516 m = PyModule_Create(&socketmodule);
6517 if (m == NULL)
6518 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006519
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006520 Py_INCREF(PyExc_OSError);
6521 PySocketModuleAPI.error = PyExc_OSError;
6522 Py_INCREF(PyExc_OSError);
6523 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006525 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526 if (socket_herror == NULL)
6527 return NULL;
6528 Py_INCREF(socket_herror);
6529 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006530 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 NULL);
6532 if (socket_gaierror == NULL)
6533 return NULL;
6534 Py_INCREF(socket_gaierror);
6535 PyModule_AddObject(m, "gaierror", socket_gaierror);
6536 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006537 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 if (socket_timeout == NULL)
6539 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006540 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 Py_INCREF(socket_timeout);
6542 PyModule_AddObject(m, "timeout", socket_timeout);
6543 Py_INCREF((PyObject *)&sock_type);
6544 if (PyModule_AddObject(m, "SocketType",
6545 (PyObject *)&sock_type) != 0)
6546 return NULL;
6547 Py_INCREF((PyObject *)&sock_type);
6548 if (PyModule_AddObject(m, "socket",
6549 (PyObject *)&sock_type) != 0)
6550 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006551
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006552#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 Py_INCREF(has_ipv6);
6558 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 /* Export C API */
6561 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6562 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6563 ) != 0)
6564 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006567#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006569#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006571#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006573#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006574#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006577#endif
6578#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006580#endif
6581#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006584#endif
6585#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006588#endif
6589#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006592#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006593#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006594 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006595 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006596#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006597#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006600#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006601#ifdef HAVE_SOCKADDR_ALG
6602 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6603#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006604#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006607#endif
6608#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006610#endif
6611#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006614#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006615#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006618#endif
6619#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006622#endif
6623#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006626#endif
6627#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006630#endif
6631#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, AF_NETLINK);
6634 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006635#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006637#endif
6638#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006640#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6642 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006643#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006645#endif
6646#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006648#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006649#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006651#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006652#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006654#endif
6655#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006657#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006659#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006661#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006662#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006664#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006665#ifdef NETLINK_CRYPTO
6666 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6667#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006668#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006669#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006672#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006673#ifdef AF_LINK
6674 PyModule_AddIntMacro(m, AF_LINK);
6675#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006676#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006679#endif
6680#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006683#endif
6684#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006687#endif
6688#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006691#endif
6692#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006695#endif
6696#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006699#endif
6700#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006703#endif
6704#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006707#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006708
Hye-Shik Chang81268602004-02-02 06:05:24 +00006709#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6711 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6712 PyModule_AddIntMacro(m, BTPROTO_HCI);
6713 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006714#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006716#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006717#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006718#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006720#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6722 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006723#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6726 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006727#endif
6728
Charles-François Natali47413c12011-10-06 19:47:44 +02006729#ifdef AF_CAN
6730 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006732#endif
6733#ifdef PF_CAN
6734 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006736#endif
6737
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006738/* Reliable Datagram Sockets */
6739#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006741#endif
6742#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006744#endif
6745
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006746/* Kernel event messages */
6747#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006749#endif
6750#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006752#endif
6753
Antoine Pitroub156a462010-10-27 20:13:57 +00006754#ifdef AF_PACKET
6755 PyModule_AddIntMacro(m, AF_PACKET);
6756#endif
6757#ifdef PF_PACKET
6758 PyModule_AddIntMacro(m, PF_PACKET);
6759#endif
6760#ifdef PACKET_HOST
6761 PyModule_AddIntMacro(m, PACKET_HOST);
6762#endif
6763#ifdef PACKET_BROADCAST
6764 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6765#endif
6766#ifdef PACKET_MULTICAST
6767 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6768#endif
6769#ifdef PACKET_OTHERHOST
6770 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6771#endif
6772#ifdef PACKET_OUTGOING
6773 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6774#endif
6775#ifdef PACKET_LOOPBACK
6776 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6777#endif
6778#ifdef PACKET_FASTROUTE
6779 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006780#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006781
Christian Heimes043d6f62008-01-07 17:19:16 +00006782#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6787 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6788 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006789
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6791 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6792 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006794 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, SOL_TIPC);
6796 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6797 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6798 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6799 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006800
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6802 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6803 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6804 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6808 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006809#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006812#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6814 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6815 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6816 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6817 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6818 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006819#endif
6820
Christian Heimesdffa3942016-09-05 23:54:41 +02006821#ifdef HAVE_SOCKADDR_ALG
6822 /* Socket options */
6823 PyModule_AddIntMacro(m, ALG_SET_KEY);
6824 PyModule_AddIntMacro(m, ALG_SET_IV);
6825 PyModule_AddIntMacro(m, ALG_SET_OP);
6826 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6827 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6828 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6829
6830 /* Operations */
6831 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6832 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6833 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6834 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6835#endif
6836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, SOCK_STREAM);
6839 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006840/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006841#ifdef SOCK_RAW
6842 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006844#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006846#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006848#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006849#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006851#endif
6852#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006854#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006864#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006865#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006867#endif
6868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006872#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006878#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006884#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006886#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006887#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006890#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006898#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006901#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006918#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006919#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006921#endif
6922#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006924#endif
6925#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006927#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006928#ifdef SO_PASSSEC
6929 PyModule_AddIntMacro(m, SO_PASSSEC);
6930#endif
6931#ifdef SO_PEERSEC
6932 PyModule_AddIntMacro(m, SO_PEERSEC);
6933#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006934#ifdef SO_BINDTODEVICE
6935 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6936#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006937#ifdef SO_PRIORITY
6938 PyModule_AddIntMacro(m, SO_PRIORITY);
6939#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006940#ifdef SO_MARK
6941 PyModule_AddIntMacro(m, SO_MARK);
6942#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006943#ifdef SO_DOMAIN
6944 PyModule_AddIntMacro(m, SO_DOMAIN);
6945#endif
6946#ifdef SO_PROTOCOL
6947 PyModule_AddIntMacro(m, SO_PROTOCOL);
6948#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 /* Maximum number of connections for "listen" */
6951#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
6956
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006957 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006958#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006960#endif
6961#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006963#endif
6964#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006966#endif
6967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 /* Flags for send, recv */
6969#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006987#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006990#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006996#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006998#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006999#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007001#endif
7002#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007004#endif
7005#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007007#endif
7008#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007010#endif
7011#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007013#endif
7014#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007016#endif
7017#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007019#endif
7020#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007022#endif
7023#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007025#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007026#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007028#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030 /* Protocol level and numbers, usable for [gs]etsockopt */
7031#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007036#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007045#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007056#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007057 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007061#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007063#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007064#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007066#endif
7067#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7069 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007070#endif
7071#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7073 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7074 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007075
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7077 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7078 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007079#endif
7080#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7082 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7083 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7084 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007085#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007086#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7087 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7088#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007089#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007091 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7092 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7093 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7094 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7095 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7096 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7097 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7098 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7099 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7100 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7101 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7102 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7103#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007104#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007106#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007107#ifdef HAVE_SOCKADDR_ALG
7108 PyModule_AddIntMacro(m, SOL_ALG);
7109#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007110#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007112#endif
7113#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007115#endif
7116#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007118#endif
7119#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007121#endif
7122#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007124#endif
7125#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007127#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007128#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007130#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007148 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007151 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007153#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007158#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007161#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007167#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007169#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007231#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007232#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007237#endif
7238/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007241#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007246#endif
7247
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007248#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007250#endif
7251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252 /* Some port configuration */
7253#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007255#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007256 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007260#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
7263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264 /* Some reserved IP v.4 addresses */
7265#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007266 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007267#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007277#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef INADDR_ALLHOSTS_GROUP
7286 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7287 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007288#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007293#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007298#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007300#endif
7301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 /* IPv4 [gs]etsockopt options */
7303#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007350#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007351#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007353#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7356#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007375#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007378 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007379#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007381#endif
7382#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007384#endif
7385#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007387#endif
7388#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007390#endif
7391#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007393#endif
7394#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007396#endif
7397#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007399#endif
7400#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007402#endif
7403#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007405#endif
7406#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007408#endif
7409#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007411#endif
7412#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007414#endif
7415#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007417#endif
7418#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007420#endif
7421#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007423#endif
7424#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007426#endif
7427#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007429#endif
7430#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007432#endif
7433#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#endif
7436#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007438#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440 /* TCP options */
7441#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007456#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007459#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007462#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007465#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007474#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007476#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007477#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007479#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481 /* IPX options */
7482#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007484#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007485
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007486/* Reliable Datagram Sockets */
7487#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007489#endif
7490#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007492#endif
7493#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007495#endif
7496#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007498#endif
7499#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007501#endif
7502#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007504#endif
7505#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007507#endif
7508#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007510#endif
7511#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007513#endif
7514#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007516#endif
7517#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007519#endif
7520#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007522#endif
7523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007525#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007527#endif
7528#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007530#endif
7531#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007533#endif
7534#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007536#endif
7537#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007539#endif
7540#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007542#endif
7543#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007545#endif
7546#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007548#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007549#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007551#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007552#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007554#endif
7555#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007557#endif
7558#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007560#endif
7561#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007563#endif
7564#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007566#endif
7567#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007569#endif
7570#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007572#endif
7573#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007575#endif
7576#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007578#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007579#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007581#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007582#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007584#endif
7585#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#endif
7588#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
7603#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007605#endif
7606#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007611#endif
7612#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007614#endif
7615#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#endif
7618#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007620#endif
7621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007623#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007625#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007626 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007627#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007628 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007629#endif
7630#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007632#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007633 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007634#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007636#endif
7637#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007639#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007640 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007641#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007643#endif
7644
Christian Heimesfaf2f632008-01-06 16:59:19 +00007645#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007646 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007647 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7648#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007649 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007650#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007651 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007652 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7653#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007654 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007655#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007656 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007658 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659 PyObject *tmp;
7660 tmp = PyLong_FromUnsignedLong(codes[i]);
7661 if (tmp == NULL)
7662 return NULL;
7663 PyModule_AddObject(m, names[i], tmp);
7664 }
7665 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, RCVALL_OFF);
7667 PyModule_AddIntMacro(m, RCVALL_ON);
7668 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007669#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007671#endif
7672#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007674#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007675#endif /* _MSTCPIP_ */
7676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007678#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007679 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007681 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007682}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007683
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007684
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007685#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007686#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007687
7688/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007689/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007690
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007691int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007692inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007694 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007695#if (SIZEOF_INT != 4)
7696#error "Not sure if in_addr_t exists and int is not 32-bits."
7697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698 unsigned int packed_addr;
7699 packed_addr = inet_addr(src);
7700 if (packed_addr == INADDR_NONE)
7701 return 0;
7702 memcpy(dst, &packed_addr, 4);
7703 return 1;
7704 }
7705 /* Should set errno to EAFNOSUPPORT */
7706 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007707}
7708
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007709const char *
7710inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712 if (af == AF_INET) {
7713 struct in_addr packed_addr;
7714 if (size < 16)
7715 /* Should set errno to ENOSPC. */
7716 return NULL;
7717 memcpy(&packed_addr, src, sizeof(packed_addr));
7718 return strncpy(dst, inet_ntoa(packed_addr), size);
7719 }
7720 /* Should set errno to EAFNOSUPPORT */
7721 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007722}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007723
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007724#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007725#endif